Excel 2010 Range.FormulaArray с использованием Range.Replace

3

Я пытаюсь автоматизировать некоторую ежедневную работу, где я использую формулу массива 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));"")
bwedel
источник
Не могли бы вы поместить ярлык с усеченным именем в файлы непосредственно под C:\ ? Так C:\path\to\[The_Document_Here.xls]превращается вC:\thedoc.xls
JaredT
Вам нужны формулы или только результаты?
Raystafarian
@Raystafarian Я не уверен, что вы имеете в виду, но мне нужно иметь правильную формулу в диапазоне (предоставленный код является лишь частью всего сценария). Я использую его для перевода определенных текстов в один документ. Все это нужно повторить для
сотен
1
Я имею в виду, можете ли вы использовать формулу за кулисами и просто поместить результаты в ячейки?
Raystafarian
В чем именно проблема? Вы получаете сообщение об ошибке?
Máté Juhász

Ответы:

2

Мне удалось решить эту проблему, сначала определив имена для диапазонов во внешних рабочих книгах в «основной» рабочей книге. Делая это, я сохраняю формулу ниже предела 255 символов .FormulaArray. Хороший ночной сон и свежие взгляды на проблему - вот и все, что потребовалось :-)

bwedel
источник
1

Попробуйте сначала ввести формулу в обычном режиме, а затем преобразовать ее в формулу массива, как в листе:

Sub qwerty()
    ActiveCell.Formula = "=MAX(IF(A2>B1:B12,B1:B12))"
    With Application
        .SendKeys "{F2}" ' get into edit mode
        .SendKeys "^+~" '  use CNTRL + Shift = Enter
    End With
End Sub

EDIT # 1:

Этот макрос следует запускать из окна Excel, а не из окна VBE .

Ученик Гэри
источник
1
Если я пытаюсь это сделать, я получаю сообщение об ошибке «Необходимо указать строку поиска» :(
bwedel
1
@bwedel SORRY .............. Вы должны запустить это из Excel окна , а не VBE окно!
Студент Гари
Это был единственный способ заставить его работать с формулами массива. Мне пришлось принудительно вызвать перерасчет формулы массива, и все, что я пробовал, не сработало: полный перезапись книги, перерасчет листа, перерасчет диапазона, (это не имело никакого эффекта), настройка диапазона. FormulaArray (это привело к «Невозможно получить свойство FormulaArray объекта Диапазон класса ").
г-н Т.А.