#excel #vba
#Excel #vba
Вопрос:
=INDEX(Engine!$AL$12:$AL$17,MATCH($F21,{40;39.9;19.9;14.9;2.9;1},-1))
.
Я пытаюсь преобразовать приведенную выше формулу в VBA, это формула сопоставления индексов с таблицей ниже. Если значение $F21 равно 21, то формула дает результат 2. В VBA, если переменная wbcL равна 21, то переменная wbcLscore должна быть равна 2.
Я пробовал строку VBA ниже, но она явно неверна и выдает недопустимый символ ошибки в {
wbcLscore = Application.WorksheetFunction.Index(wseng.Range("AL12:AL17"), Application.WorksheetFunction.Match(wbcL,{40;39.9;19.9;14.9;2.9;1}, -1))
Комментарии:
1. Может
wbcLscore = Evaluate("=INDEX(Engine!$AL$12:$AL$17,MATCH($F21,{40;39.9;19.9;14.9;2.9;1},-1))")
быть? Не тестировалось2. @FoxfireAndBurnsAndBurns Спасибо, что работает, но возвращает неверный результат 4. Но даже если бы это дало правильный результат, это не помогло бы, поскольку значение моей переменной, wbcL изменяется и не всегда находится в ячейке F21.
3. Как это может вернуть 4, значение в первом столбце наверняка будет 39,9? Я полагаю, вам следует уточнить, что находится в AL12: AL17.
Ответ №1:
Попробуйте что-то вроде этого:
Sub SubwbcLscore()
'Stuff i needed to make it work.
Dim wseng As Worksheet
Dim wbcL As Double
Dim wbcLscore As String
Set wseng = ActiveSheet
wbcL = 40
'Declaration.
Dim Arr(1 To 6) As Double
'Setting Arr.
Arr(1) = 40
Arr(2) = 39.9
Arr(3) = 19.9
Arr(4) = 14.9
Arr(5) = 2.9
Arr(6) = 1
'Setting wbcLscore.
wbcLscore = Application.WorksheetFunction.Index(wseng.Range("AL12:AL17"), Application.WorksheetFunction.Match(wbcL, Arr, -1))
End Sub
Формула та же, она просто использует массив вместо вашего {40;39.9;19.9;14.9;2.9;1}
.
Если вам не нужен дополнительный массив, может сработать что-то вроде этого:
wbcLscore = Application.ExecuteExcel4Macro("INDEX(Engine!R12C38:R17C38,MATCH(Foglio1!R21C6,{40;39.9;19.9;14.9;2.9;1},-1))")
Обратите внимание на адреса ячеек: они должны быть в формате R1C1 (как указано в приложении.Выполнить страницу excel4macro). Опять же: массив было бы проще редактировать.