Выпуск FormulaArray - PullRequest
       10

Выпуск FormulaArray

1 голос
/ 27 февраля 2020

У меня есть формула массива, если на одном листе, глядя на второй лист, я обнаружил, что во время работы на втором листе все немного замедлилось из-за вычисления константы формулы массива на основе вновь вмененных данных в лист 2. Мне действительно нужно, чтобы он запускался, когда кто-то идет на лист один, чтобы просмотреть информацию. Я решил запрограммировать макрос для запуска при активации листа, затем вставить формулу массива в правильную ячейку, скопировать возвращенное значение, а затем вставить как значение, чтобы формула не оставалась активной.

Проблема, с которой я столкнулся, заключается в том, что мои макросы, похоже, не хотят вставлять мою формулу (я даже пытался использовать инструмент записи макросов, чтобы ввести формулу, и когда я пытаюсь перезапустить записанный макрос, происходит сбой). Я получаю «Невозможно установить свойство FormulaArray класса Range» в качестве моей ошибки.

Код выглядит следующим образом:

Range("U5").Select
Selection.FormulaArray = _
   "=IF(ISERROR(INDEX('Maintenance Setup'!C3,SMALL(IF('Maintenance Setup'!C4=""Switchgear_Switchboard"",ROW('Maintenance Setup'!C4)-ROW(INDEX('Maintenance Setup'!C4,1,1))+1),RC[-1])))=TRUE,"""",INDEX('Maintenance Setup'!C3,SMALL(IF('Maintenance Setup'!C4=""Switchgear_Switchboard"",ROW('Maintenance Setup'!C4)-ROW(INDEX('Maintenance Setup'!C4,1,1))+1),RC[-1])))"

Формула отлично работает, когда я ввожу ее вручную , 'Maintenance Setup' - это лист, который содержит все данные, Switchgear_Switchboard - это какой-то текст, который ищет документ, и в формуле есть пробел "" "" "

Я также пытался получить код введите формулу, используя обозначение A1, а не R1C1

Спасибо.

1 Ответ

2 голосов
/ 28 февраля 2020

FormulaArray имеет ограничение в 255 символов. Однако мы можем обойти это ограничение, сначала используя заполнители для частей нашей формулы, а затем соответственно заменяя эти заполнители.

Кстати, использование ссылок на целые столбцы очень неэффективно. Я бы посоветовал вам избегать их использования.

Кроме того, вы можете использовать IFERROR, чтобы проверить, возвращает ли формула ошибку, и вернуть пробел, если она возникнет.

Попробуйте выполнить следующее код ...

Dim sourceWorksheet As Worksheet
Set sourceWorksheet = Worksheets("Maintenance Setup")

Dim lastRow As Long
Dim formulaPart1 As String
Dim formulaPart2 As String
Dim formulaPart3 As String
With sourceWorksheet
    lastRow = .Cells(.Rows.Count, "D").End(xlUp).Row
    formulaPart1 = "'" & .Name & "'!$C2:$C" & lastRow
    formulaPart2 = "'" & .Name & "'!$D2:$D" & lastRow & "=""Switchgear_Switchboard"""
    formulaPart3 = "ROW('" & .Name & "'!$D2:$D" & lastRow & ")-ROW(INDEX('" & .Name & "'!$D2:$D" & lastRow & ",1,1))+1"
End With

With Range("U5")
    .FormulaArray = "=IFERROR(INDEX(A_A_A,SMALL(IF(B_B_B,C_C_C),T5)),"""")"
    .Replace "A_A_A", formulaPart1
    .Replace "B_B_B", formulaPart2
    .Replace "C_C_C", formulaPart3
End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...