Я пытаюсь автоматизировать некоторую ежедневную работу, где я использую формулу массива INDEX () + MATCH (), чтобы собрать некоторые данные из разных рабочих книг в одну «основную» рабочую книгу. Вручную это работает как задумано, но теперь я хочу автоматизировать этот процесс.
Я достиг предела в 255 символов свойства Range.FormulaArray и пытаюсь его обойти, используя предложенный здесь трюк , но безуспешно.
При запуске этого кода часть формулы p1 вставляется в диапазон, но 2 .Замены не выполняются.
Я пробовал разные варианты части «Что» в функции .Replace, и «X_X_X ()», и «{0}», и многие другие, но безуспешно.
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)
Dim p1, p2, p3 As String
p1 = "=IF(G2<>"""",INDEX('C:\path\to\[document.xlsx]Sheet1'!$P:$P,MATCH(1,({0})*({1}),0)),"""")"
p2 = "B2='C:\path\to\[document.xlsx]Sheet1'!$B:$B"
p3 = "C2='C:\path\to\[document.xlsx]Sheet1'!$C:$C"
With ws.Range("R2")
.FormulaArray = "=IF(G2<>"""",INDEX('C:\path\to\[document.xlsx]Sheet1'!$P:$P,MATCH(1,({0})*({1}),0)),"""")"
.Replace "{0}", p2
.Replace "{1}", p3
End With
Формула, которую я вставляю вручную:
=IF(G2<>"";INDEX('C:\path\to\[document.xlsx]Sheet1'!$P:$P;MATCH(1;(B2='C:\path\to\[document.xlsx]Sheet1'!$B:$B)*(C2='C:\path\to\[document.xlsx]Sheet1'!$C:$C);0));"")
microsoft-excel-2010
vba
bwedel
источник
источник
C:\
? ТакC:\path\to\[The_Document_Here.xls]
превращается вC:\thedoc.xls
Ответы:
Мне удалось решить эту проблему, сначала определив имена для диапазонов во внешних рабочих книгах в «основной» рабочей книге. Делая это, я сохраняю формулу ниже предела 255 символов .FormulaArray. Хороший ночной сон и свежие взгляды на проблему - вот и все, что потребовалось :-)
источник
Попробуйте сначала ввести формулу в обычном режиме, а затем преобразовать ее в формулу массива, как в листе:
EDIT # 1:
Этот макрос следует запускать из окна Excel, а не из окна VBE .
источник