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