Я пишу VBA макрос в Excel 2013. У меня есть код ниже, чтобы прочитать ряд в вариант,Excel VBA - Дальность считывания в Variant, сохраняя при этом индекс совпадает с номерами столбцов
Dim MyBuffer As Variant
With MyWorkSheet
MyBuffer = .Range(.Cells(1, NAME_COL), .Cells(10, AGE_COL)).Value
End With
'Here NAME_COL = 5, AGE_COL = 9
Теперь MyBuffer является 2-мерный массив с индексами от (1, 1) до (10, 5). Мне было интересно, есть ли способ сохранить вторую часть индексов, такую же, как и номера столбцов. т.е. от (1, 5) до (10, 9), так что я могу использовать константы NAME_COL, AGE_COL и т. д., также обращаясь к варианту. Это прежде всего для удобства чтения (так что другой программист может легко увидеть, к какой записи я обращаюсь) и ремонтопригодности (случаи, когда мы добавляем/удаляем/свопим столбцы на листе). Цените любую помощь при вычислении того же самого. Пожалуйста, обратите внимание, что я не рассматриваю возможность дальнейшего копирования в другой массив с модифицированным индексом или с другим набором констант для позиций Variant (NAME_POS, AGE_POS и т. Д.).
Благодаря GSerg. Когда я смотрю на ReDim, я понимаю, что он создает новый массив за кулисами и копирует в него данные (или это не будет в вышеупомянутом случае, так как нет изменения размера?). У меня есть несколько таких буферов и гораздо больший объем данных (следовательно, производительность), которые нужно учитывать (т.е. почему я избегал явного копирования в другой массив). – mpathi
@mpathi Насколько я вижу, это непосредственно [манипулирует] (http://stackoverflow.com/a/11713643/11683) дескриптор SAFEARRAY, просто изменяя границы измерений. Вы можете проверить это, посмотрев на VarPtr (MyBuffer (LBound (MyBuffer, 1), LBound (MyBuffer, 2))) - он не перемещается. Также он работает только потому, что «MyBuffer» объявлен как один «вариант». Если вы объявите его как массив вариантов, он не будет удален, потому что в этом случае он попытается скопировать и для этого новые границы должны должным образом перекрывать старые границы, которых они не в этом случае (хотя это я любопытное размышление здесь). – GSerg
Обратите внимание, что это то, что я наблюдал, я не знал этого из теории. Вы должны действительно измерить время, необходимое для восстановления огромного массива, посмотрите, занимает ли он незаметно небольшое количество времени, независимо от размера массива. – GSerg