【问题标题】:errors with worksheet index工作表索引错误
【发布时间】:2020-05-04 10:01:22
【问题描述】:

我正在尝试在 Excel VBA 中使用 Excel 公式。

这可用作 Excel 公式。我在 VBA 中缺少一些东西来设置变量 dptMN。

公式如下:

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

在我使用的 VBA 中:

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

我明白了

编译错误:
语法错误:

在那条线上

【问题讨论】:

  • 1) 您必须使用WorksheetFunction.MatchApplication.Match。 2) 您需要使用Range 作为您的范围。
  • 您的范围需要用引号引起来。
  • dptNM = Application.WorksheetFunction.Index(myrangeB, Application.WorksheetFunction.Match(machid, myrangeA, 0)) 获取:无法获取工作表函数的匹配属性
  • @jashie 请参阅下面的答案。请注意,cmets 中的代码可读性不好。如果您需要添加更多信息,请始终 edit 您的原始问题。

标签: excel vba excel-formula syntax-error


【解决方案1】:

这是另一种方式,希望通过内存工作会比 Range 对象更快我包含一个额外的 Transpose 以返回一维数组(带有动态 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

但是,您也可以选择立即通过 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

【讨论】:

    【解决方案2】:

    您必须分多个步骤进行:

    1. 匹配MachId。请注意,如果不匹配,则会引发错误,因此您需要在此处进行错误处理。

    2. Index 公式中使用匹配结果MatchRow

    如果您尝试在一行中执行此操作,您将无法捕捉到错误。


    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
    

    【讨论】:

    • 谢谢!我没有看到那样的。
    • 您不必轮流进行。可以将 Index 和 Match 与 IfError 结合起来,甚至可以捕获可能的错误(并避免Goto)。 +1 =)
    猜你喜欢
    • 1970-01-01
    • 2012-06-26
    • 2013-06-27
    • 1970-01-01
    • 2013-06-20
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    相关资源
    最近更新 更多