Передача массива строк в Range (). Формула в Excel VBA - PullRequest
0 голосов
/ 31 октября 2018

Как всем известно, заполнение ячеек значениями одно за другим в VBA намного менее эффективно, чем массовое заполнение их массивом значений. По тем же причинам оптимизации я хотел бы сделать это с массивом формул. Очень простой пример будет выглядеть примерно так:

Sub Fill_Using_Arrays()
  Dim i As Long
  Dim formulae(1 To 10000) As String

  For i = 1 To 10000
    formulae(i) = "=$A$" & i
  Next i

  [A2].Resize(10000).Formula = formulae
End Sub

Однако, если я сделаю это, он заполнит ячейки 10 КБ "= $ A $ 1" и так далее без фактической оценки выражений. Я попытался запустить .Calculate на диапазоне, но это ничего не дало. Возможно ли добиться такого поведения?

1 Ответ

0 голосов
/ 31 октября 2018

При написании этого вопроса я нашел решение:

Проблема заключалась в массиве строк. Я обычно держусь подальше от Variant из-за небольших накладных расходов. Поскольку кто-то, пришедший из C ++, объявляет все как вариант, чувствует себя очень грязным, но в любом случае, в этом случае это, очевидно, необходимо, так как передача String заставит его вставить значение в виде литеральной строки.

Для меня это несколько нелогично, поскольку передача одной строки (не массива) в свойство .Formula работает. Если кто-нибудь знает, почему я был бы благодарен за эту информацию.

В любом случае, рабочий код будет:

Sub Fill_Using_Arrays()
  Dim i As Long
  Dim formulae(1 To 10000) As Variant ' Only change here

  For i = 1 To 10000
    formulae(i) = "=$A$" & i
  Next i

  [A2].Resize(10000).Formula = formulae
End Sub

Редактировать: Чтобы было ясно, в качестве продолжения мне любопытно, почему это работает:

  [A2].Formula = formulae(1)

И заполняет это как фактическую формулу, а не как строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...