运行-VBA 中的索引和匹配出现时间错误 1004

Run-time error 1004 with Index & Match in VBA

我有一些代码正在尝试进行索引和匹配。我已将大部分范围值定义为变量,因此它们可以是动态的,因为我想将其用于列和行大小不同的不同工作表。

Index 和 Match 的使用范围来自另一个在我的代码中定义为“y”的工作簿。我不断收到 运行 次错误:

Run-time error ‘1004’:
Application-defined or object-defined error

我目前的代码是:

Private Sub IndexandMatch()

Dim yChanges As Worksheet, OperatorWs As Worksheet
Dim yChangesLastRow As Long, Parameters As Long, x As Long, z As Long

Set y = Workbooks.Open(Filename:="\Databases\Database_IRR 200-2S.xlsm", Password:="123")
Set yChanges = y.Sheets("Changes")
Set OperatorWs = ThisWorkbook.Worksheets("Operator")

Parameters = yChanges.Range("F1:CL1").Columns.Count 'Last Column in Changes Sheet

yChangesLastRow = yChanges.Range("A" & Rows.Count).End(xlUp).Row ' Last row in Changes Sheet

yChangesLastRow = yChangesLastRow - 2

z = 6

For x = 31 To Parameters
    'On Error Resume Next
    
    OperatorWs.Range("U" & x).Value = Application.WorksheetFunction.Index( _
    yChanges.Range(Cells(3, z).Address(), Cells(yChangesLastRow, z).Address()), _
    Application.WorksheetFunction.Match(Sheet3.Range("H5").Value, yChanges.Range("A3:A" & yChangesLastRow), 0))
    
    z = z + 1
    
Next x

End Sub

解决方案(感谢 BigBen 为我提供这个)

代码如下:

Private Sub IndexandMatch()

Dim yChanges As Worksheet, OperatorWs As Worksheet
Dim yChangesLastRow As Long, Parameters As Long, x As Long, z As Long

Set y = Workbooks.Open(Filename:="\Databases\Database_IRR 200-2S.xlsm", Password:="123")
Set yChanges = y.Sheets("Changes")
Set OperatorWs = ThisWorkbook.Worksheets("Operator")

Parameters = yChanges.Range("F1:CL1").Columns.Count 'Last Column in Changes Sheet

yChangesLastRow = yChanges.Range("A" & Rows.Count).End(xlUp).Row ' Last row in Changes Sheet

yChangesLastRow = yChangesLastRow - 2

z = 6

    For x = 31 To Parameters
        
        With yChanges
        
            Dim IndexRng As Range
            Set IndexRng = .Range(.Cells(3, z), .Cells(yChangesLastRow, z))
    
            Dim MatchRng As Range
            Set MatchRng = .Range("A3:A" & yChangesLastRow)
    
        End With
               
    Dim matchNum As Variant
    matchNum = Application.Match(Sheet3.Range("H5").Value, MatchRng, 0)

                If Not IsError(matchNum) Then
    
                    OperatorWs.Range("U" & x).Value = Application.Index(IndexRng, matchNum)
                    
                Else
                
                    Exit Sub
                
                End If
            
    z = z + 1
            
    Next x

End Sub

你试图在一行中做太多;将其分成单独的行以便于阅读:

With yChanges
    Dim IndexRng As Range
    Set IndexRng = .Range(.Cells(3, z), .Cells(yChangesLastRow, z))

    Dim MatchRng As Range
    Set MatchRng = .Range("A3:A" & yChangesLastRow)
End With

另外,我这里用Application.Match,然后测试结果是否错误:

Dim matchNum As Variant 
matchNum = Application.Match(Sheet3.Range("H5").Value, MatchRng, 0)

If Not IsError(matchNum) Then
    Dim result As Variant
    result = Application.Index(IndexRng, matchNum)

    OperatorWs.Range("U" & x).Value = result
End If