Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 带索引的运行时错误1004&;VBA中的匹配_Excel_Vba_Indexing_Runtime Error - Fatal编程技术网

Excel 带索引的运行时错误1004&;VBA中的匹配

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

我有一些代码试图进行索引和匹配。我已经将大多数范围值定义为变量,因此它们可以是动态的,因为我希望将其用于列和行大小不同的不同工作表

索引和匹配用于代码中定义为“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

当这失败时,
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)