ошибки с индексом листа - PullRequest
       0

ошибки с индексом листа

1 голос
/ 17 января 2020

Я пытаюсь использовать формулу Excel в Excel VBA.

Это работает как формула Excel. Мне не хватает чего-то в VBA, чтобы установить переменную dptMN.

Вот формула:
index formula

=INDEX(B1:B88, MATCH(E5, A1:A88, 0))   

В VBA я используя:

dptNM = Application.WorksheetFunction.INDEX(B1:B88, MATCH(machid, A1:A88, 0))   

Я получаю

ошибка компиляции:
синтаксическая ошибка:

в этой строке

Ответы [ 2 ]

4 голосов
/ 17 января 2020

Вы должны сделать это в несколько шагов:

  1. Соответствовать MachId. Обратите внимание, что если он не совпадает, он выдает ошибку, поэтому вам нужно обработать ошибку здесь.

  2. Используйте результат MatchRow из вашего совпадения в формуле Index.

Если вы попытаетесь сделать это в одну строку, вы не сможете отловить ошибку.


Option Explicit

Public Sub Example()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1") 'define your worksheet

    Dim MachId As Variant
    MachId = ws.Range("E5").Value

    'first try to match, note it throws an error if it does not match
    Dim MatchRow As Double
    On Error GoTo NO_MATCH
    MatchRow = Application.WorksheetFunction.Match(MachId, ws.Range("A1:A88"), 0)
    On Error GoTo 0

    Dim dptNM As Variant
    dptNM = Application.WorksheetFunction.Index(ws.Range("B1:B88"), MatchRow)

    'put your code here eg.
    Debug.Print dptNM 

    Exit Sub
NO_MATCH:
    MsgBox "no match found"
End Sub
0 голосов
/ 17 января 2020

Вот еще один способ, надеясь, что работа с памятью будет быстрее, чем Range объект, который я добавил дополнительно Transpose для возврата 1D-массивов (с динамикой c Range):

Sub Test()

Dim arr1 As Variant, arr2 As Variant
Dim lr As Long, dptNM As Variant

With Sheet1 'Change accordingly

    'Get last used row
    lr = .Cells(.Rows.Count, 1).End(xlUp).Row

    'Get your 1D-arrays
    arr1 = Application.Transpose(.Range("A1:A" & lr).Value)
    arr2 = Application.Transpose(.Range("B1:B" & lr).Value)

    'Get your match
    With Application
        dptNM = .IfError(.Index(arr2, .Match(106, arr1, 0)), "No Result Found")
    End With

End With

End Sub

Однако вы также можете выбрать go немедленно через Range объект, который может выглядеть следующим образом:

Sub Test()

Dim dptNM As Variant
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Sheet1") 'Change accordingly

With Application
    dptNM = .IfError(.Index(ws.Range("B1:B88"), .Match(106, ws.Range("A1:A88"), 0)), "No Result Found")
End With

End Sub
...