Преобразование формулы массива Excel VBA

Я пытаюсь выполнить «vlookup» с двумя разными критериями (значения столбца A и G), используя функции «Индекс» и «Сопоставление».

а вот строка, которую я использовал для команды Excel.

=INDEX(Database!A:KG,MATCH(1,(Database!A:A='TempSheet'!A2)*(Database!G:G='TempSheet'!G2),0),10)

Как бы я сделал это с VBA? Он продолжает выдавать мне сообщение об ошибке «Ошибка компиляции: ожидаемый конец оператора».

Selection= _
    "=Index(DB.Range("A:KG"), Match(1, (DB.Range("A" = Temp.Range("A" & i).Value)) * (DB.Range("G" = Temp.Range("G" & i).Value)), 0), 10)"

Спасибо


person J Lee    schedule 06.01.2015    source источник
comment
А как насчет "=INDEX(Database!A:KG,MATCH(1,(Database!A:A='TempSheet'!A2)*(Database!G:G='TempSheet'!G2),0),10)"?   -  person David Zemens    schedule 06.01.2015
comment
Пожалуйста, покажите свой фактический код в вопросе, отформатированный с помощью программы просмотра кода.   -  person Pieter Geerkens    schedule 06.01.2015
comment
Вам нужно избежать двойных кавычек внутри буквальной строки... Кроме того, вы не можете использовать имена переменных, такие как DB, внутри буквальной строки.   -  person David Zemens    schedule 06.01.2015
comment
Если сложное выражение не работает, попробуйте построить его, используя более мелкие компоненты выражения. Например, попробуйте заставить работать выражение Match, а затем Index - отдельно. Вам нужно использовать либо Application.Worksheetfunction., либо Evaluate, и вы можете проверить синтаксис здесь msdn.microsoft.com/en-us/library/office/ (с примером).   -  person Rusan Kax    schedule 07.01.2015


Ответы (2)


Каждый раз, когда вы используете формулу электронной таблицы в коде VBA, перед ней необходимо указать ‹Excel.WorksheetFunction.> или ‹Application.WorksheetFunction.>.

Например:

Application.WorksheetFunction.Match

вместо Match only.

person Lucas Guido    schedule 06.01.2015

Мне не повезло заставить формулы массива работать правильно через VBA и использовать «ЕСЛИОШИБКА» в качестве обходного пути, например:

=IFERROR(VLOOKUP(A1, Database!A:Z,1,FALSE),VLOOKUP(B1, Database!A:Z,1,FALSE))

Эта функция попытается сопоставить A1, а в случае ошибки #VALUE — B1.

Чтобы получить формулу такого типа, заполненную на листе в VBA, вы можете зациклить свой лист, используя подход «.formula».

' get length of source data
Dim RowCount As Long
RowCount = ThisWorkbook.Sheets("Database").Cells(Rows.Count, 1).End(xlUp).Row
' now starting from row 2 to preserve headings
For i = 2 To RowCount
    ThisWorkbook.Sheets("Summary").Cells(i, 1).Formula = "=IF(ISERROR(SEARCH(""ISO"",V" & i & ")),""Order type not supported"",""Transit"")"
    ThisWorkbook.Sheets("Summary").Cells(i, 6).Formula = "=IFERROR(TEXT(VLOOKUP(B" & i & ",Database!A:N,7,FALSE),""dd-mmm-yyyy HH:MM AM/PM""),"""")"
Next

Не совсем то, что вам нужно, но надеюсь, что это поможет!

person Casey Morter    schedule 06.01.2015