#arrays #excel #vba #array-formulas
#массивы #excel #vba #массив-формулы
Вопрос:
У меня возникла проблема с индексом / совпадением формулы Excel с IFERROR, и он отлично работает в Excel, когда я запускаю его вручную, однако после записи в макрос он не работает. эта формула создана для выполнения сопоставления и поиска при нескольких условиях и получения выходного результата.
При запуске макроса я получаю следующую ошибку — ошибка времени выполнения ‘1004’: невозможно установить свойство FormulaArray класса Range.
Range("O2").Select
Selection.FormulaArray = _
"=IFERROR(INDEX('[NAL for Macro.xlsb]Sheet1'!C13,MATCH(1,('[NAL for Macro.xlsb]Sheet1'!C8=RC[-8])*(LEFT('[NAL for Macro.xlsb]Sheet1'!C3,15)=LEFT(RC[-13],15)),0)),IFERROR(VLOOKUP(RC[-8],'[NAL for Macro.xlsb]Sheet1'!C8:C15,6,0),IFERROR(VLOOKUP(RC[-8],'[NAL for Macro.xlsb]Sheet1'!C9:C15,5,0),(VLOOKUP(LEFT(RC[-13],15)amp;""*"",'[NAL for Macro.xlsb]Sheet1'!C3:C15,11,0)))))"
затем я разделил формулу на две части, как показано ниже. Выполняется кодирование макросов и не выдает никаких ошибок, но замена не происходит. Я немного новичок в макросах и старался изо всех сил, насколько мне известно, но это не работает, может кто-нибудь, пожалуйста, помочь мне.
Sub Macro19()
'
' Macro19 Macro
'
'
With ActiveSheet.Range("O2")
Selection.FormulaArray = "=IFERROR(INDEX('[NAL for Macro.xlsb]Sheet1'!C13,MATCH(1,('[NAL for Macro.xlsb]Sheet1'!C8=RC[-8])*(LEFT('[NAL for Macro.xlsb]Sheet1'!C3,15)=LEFT(RC[-13],15)),0)),XX)"
.Replace "XX", "IFERROR(VLOOKUP(RC[-8],'[NAL for Macro.xlsb]Sheet1'!C8:C15,6,0),IFERROR(VLOOKUP(RC[-8],'[NAL for Macro.xlsb]Sheet1'!C9:C15,5,0),(VLOOKUP(LEFT(RC[-13],15)amp;""*"",'[NAL for Macro.xlsb]Sheet1'!C3:C15,11,0)))))"
End With
End Sub
До сих пор я менял кодировку на .Replace «‘ws'», «‘[NAL для Macro.xlsb]Sheet1′» и ниже приведен пересмотренный вариант. Он выполняется успешно, и ошибка не возвращается, но .Замена пока не происходит, и результат вывода приходит # NA. Пожалуйста, помогите решить эту проблему.
Sub Macro20()
'
' Macro20 Macro
'
'
With ActiveSheet.Range("O2")
.FormulaArray = _
"=IFERROR(INDEX('ws'!C13,MATCH(1,('ws'!C8=RC[-8])*(LEFT('ws'!C3,15)=LEFT(RC[-13],15)),0)),IFERROR(VLOOKUP(RC[-8],'ws'!C8:C15,6,0),IFERROR(VLOOKUP(RC[-8],'ws'!C9:C15,5,0),(VLOOKUP(LEFT(RC[-13],15)amp;""*"",'ws'!C3:C15,11,0)))))"
.Replace "'ws'", "'[NAL for Macro.xlsb]Sheet1'"
End With
End Sub
Комментарии:
1. Здесь есть хороший совет по этому вопросу: mrexcel.com/board/threads/long-array-formulas-in-vba.687125 . Возможно, в частичных формулах есть какая-то синтаксическая ошибка. Вы пробовали использовать числовое значение вместо XX?
2. Я выполнил формулу частично, и она выполняется успешно, и когда я пытаюсь выполнить полную формулу за один раз; получаю ошибку. Да, я также пробовал числовые значения, но получал ту же ошибку.
3. Я бы искал несколько случаев, которые я могу заменить, затем работал бы в обратном направлении от замены формулы и отмечал порядок (но не редактировал формулу вручную, чтобы попытаться избежать ошибки) для замены при построении предложения. Моей первой заменой было бы
.Replace "'ws'", "'[NAL for Macro.xlsb]Sheet1'"
(апострофы создают хорошие совпадения строк), что значительно сокращает формулу, но оказывает минимальное влияние. Заменяйте дополнительные вспомогательные функции до тех пор, пока они не будут в пределах символов4. На самом деле, эта единственная замена должна работать в соответствии с charactercounttool.com тот самый . Текст FormulaArray тогда будет составлять 222 символа
5. Я сделал то же самое, но . Replace не работает, означает, что он не заменяет «‘ws'» на «‘[NAL для Macro.xlsb]Sheet1′». Код выполняется без ошибок, а результат вывода отображается как #NA .