Являются ли эти новаторские способы [и, возможно, лучшим способом?] Для обозначения динамической ячейки в VBA?

Мы обычно используем выражения:Cells(i, 1), Cells(i, "A"), или жеRange("A" & i) ссылаться на динамическую ячейку в VBA, но я нахожу следующееэксцентричный Код также работает:

Sub Test1()
For i = 1 To 10000
    Range("A1")(i) = i   
Next
End Sub

Я также нашелсокращенный нотация с использованием квадратных скобок [] для ссылки на ячейку (да, я знаю, что сокращенный метод выражения команды EVALUATE) также может использоваться здесь, как следующие коды

Sub Test2()
For i = 1 To 10000
    [A1].Resize(1000, 1)(i) = i   
Next
End Sub

или же

Sub Test3()
For i = 1 To 10000
    [A1].Offset(i - 1) = i   
Next
End Sub

Это противоречит распространенному мнению, что квадратные скобки могут относиться только кфиксированный диапазоны с сокращенной записью. Я проверил их все, и они дали одинаковые результаты.

Честно говоря, я никогда не думал, что эти три выражения когда-либо существуют, поэтому я думаю, что они, вероятно, новые. Это правда?

Я не только нашел их, но и проверил, какой из них лучший. Под лучшим я подразумеваю в своей производительности тестирование по времени. Я проверил утверждения:

Cells(i, 1) = RndRange("A" & i) = RndCells(i, "A") = RndRange("A1")(i) = Rnd[A1].Resize(1000, 1)(i) = Rnd[A1].Offset(i - 1) = Rnd

к следующему коду

Sub Test()
Dim i As Long

Randomize
For i = 1 To 1000        'I also tested them with 10,000 loops
    'Put the expression here
Next
End Sub

Я получил длительность для завершения на моей машине следующим образом

1,000 loops
1               2               3               4               5               6
0.290110725     0.298291317     0.305540433     0.289084126     0.325044276     0.318445433
0.270974218     0.287950980     0.276009685     0.277133638     0.318741694     0.312968414
0.277361318     0.274790389     0.273291810     0.275994401     0.311879789     0.312000675
0.279113453     0.275501647     0.275247422     0.281113426     0.311558662     0.315628943
0.270359637     0.276440868     0.279950951     0.276444561     0.320118775     0.311556754
0.270066136     0.281525061     0.273649022     0.276767648     0.311083246     0.311015128
0.274146235     0.277156933     0.274465750     0.287375210     0.311426416     0.319849274
0.269184843     0.277200430     0.276525859     0.276931561     0.322461782     0.310902381
0.271190611     0.283046575     0.280286123     0.275876294     0.312358236     0.313066500
0.271210909     0.277953463     0.274105173     0.276916590     0.312845710     0.321566549

Average time
0.274371809     0.280985766     0.278907223     0.279363746     0.315751859     0.314700005

а также

10,000 loops
1               2               3               4               5               6
1.897854697     1.975970014     2.026380540     1.963044684     2.667340257     2.404596752
1.893136200     1.958722430     1.997488630     1.957524600     2.412742475     2.364692000
1.915567238     1.991447404     2.026974359     1.972207855     2.396174991     2.408500400
1.885336683     1.964379644     2.001175971     1.950138292     2.362537378     2.369196417
1.889658641     1.959677449     1.998453783     1.984470995     2.372677528     2.366525087
1.885327819     1.963668734     1.997487505     2.038683070     2.367691027     2.380044796
1.878379741     1.958654295     2.002764956     2.008183347     2.368766984     2.362091273
1.894069516     1.960857991     1.994435035     2.031241378     2.377953481     2.367554909
1.894528017     1.972240515     2.003587552     1.961539277     2.364523191     2.373092790
1.883387443     1.965169572     1.999893716     1.948455660     2.363346303     2.368680396


Average time
1.891724600     1.967078805     2.004864205     1.981548916     2.405375362     2.376497482

На основании этих двух результатов, хотя результаты были неубедительными для сравнения выражений:Range("A" & i), Cells(i, "A"), а такжеRange("A1")(i) а также для сравнения[A1].Resize(1000, 1)(i) а также[A1].Offset(i - 1)Оказалось, самая быстрая производительность былаCells(i, 1), Это правда в целом? Почему так? Я предполагаю, что во время выполнения VBA всегда используетCells(i, 1)поэтому, когда код компилируется, все ссылки в других выражениях должны быть преобразованы в выражение 1, так как я твердо убежден, что VBA должен запомнить как свою скомпилированную версию кода, так и любые выражения, которые мы использовали для написания нашего кода. Но это только предположение с моей стороны.

Ответы на вопрос(1)

Ваш ответ на вопрос