Ошибка времени выполнения 1004 с индексом и соответствием в VBA - PullRequest
0 голосов
/ 09 июля 2020

У меня есть код, который пытается выполнить индексирование и сопоставление. Я определил большинство значений диапазона как переменные, поэтому они могут быть динамическими c, поскольку я хочу использовать это с разными листами, которые различаются по размеру столбца и строки.

Индекс и соответствие используются диапазоны из другого книга, определенная как "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

1 Ответ

1 голос
/ 09 июля 2020

Вы пытаетесь сделать слишком много в одной строке; разделите его на отдельные строки для удобства чтения:

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
...