Excel 带索引的运行时错误1004&;VBA中的匹配
我有一些代码试图进行索引和匹配。我已经将大多数范围值定义为变量,因此它们可以是动态的,因为我希望将其用于列和行大小不同的不同工作表 索引和匹配用于代码中定义为“y”的另一个工作簿的范围。我不断收到一个运行时错误:Excel 带索引的运行时错误1004&;VBA中的匹配,excel,vba,indexing,runtime-error,Excel,Vba,Indexing,Runtime Error,我有一些代码试图进行索引和匹配。我已经将大多数范围值定义为变量,因此它们可以是动态的,因为我希望将其用于列和行大小不同的不同工作表 索引和匹配用于代码中定义为“y”的另一个工作簿的范围。我不断收到一个运行时错误: Run-time error ‘1004’: Application-defined or object-defined error 我目前拥有的代码是: Private Sub IndexandMatch() Dim yChanges As Worksheet, Operator
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
当这失败时,
ychangeslatrow
的值是多少?@BigBen我这样做的原因是因为我试图计算不包括前两行的行数(例如从A3到最后一行,忽略A1和A2)。最后一行计数器存在,因为此工作簿将使用其他行更新(因此它不会保持不变,因为最后一行不会始终保持为第31行)。ychangelastrow
失败时产生的值为31(与ychangelastrow=ychangelastrow-2
相同)。此行太长,不易阅读。首先,将yChanges.Range(单元格(3,z).Address(),单元格(ychangeslatrow,z).Address())
拆分为单独的行,并将其存储在范围变量中。答案是肯定的。每次迭代都会执行带有Set
的行。答案同样是肯定的:-)好吧,除了Sheet3.Range(“H5”).Value
看起来不应该属于那里<代码>设置MatchRng=yChanges.Range(“A3:A”&ychangeSlatrow)。然后得到…Match(Sheet3.Range(“H5”).值,MatchRng,0)