Получение определенной пользователем или определенной пользователем ошибки - PullRequest
1 голос
/ 09 января 2020

Я ломаю голову, чтобы понять, почему я получаю ошибку 1004 по этому вопросу. У меня есть лист с уникальными идентификаторами, которые мне нужно найти в другом листе, а затем вернуть значение в другом столбце в строке, и это показалось WorksheetFunction.Index + Match. Данные, которые мне нужны, смещены на один столбец (следовательно, Count_2 - 1). Я объявил переменные и даже разблокировал листы на всякий случай. Я знаю, что могу использовать индексное соответствие в Excel, но я пытаюсь использовать vba для всех вычислений, чтобы конечные пользователи не могли ничего испортить, и чтобы было легче увидеть, что на самом деле делает книга. Любые идеи?

Отдельно я установил его для печати числа в определенную c ячейку, чтобы мне было легче видеть, где код умирает.

For Count_1 = 2 to 51

    For Count_2 = 4 To 44

        Sheet8.Cells(Count_1, Count_2) = WorksheetFunction.Index(Sheet7.Range(Cells(47, Count_2 -1), _
        Cells(904, Count_2 - 1)), WorksheetFunction.Match(Sheet8.Cells(Count_1, 1).Value, _
        Sheet7.Range("A47:A904"), 0))

        Count_3 = Count_3 + 1
        Sheet1.Range("D1") = 2

    Next

Next

1 Ответ

2 голосов
/ 09 января 2020
  1. Cells(47, … не относится к тому же листу, что и Sheet7.Range, вы также должны указать рабочий лист для каждого объекта Cells. Например: …Sheet7.Range(Sheet7.Cells(47, …

  2. WorksheetFunction.Match выдаст ошибку, если ничего не найдено. Поэтому вам нужно поймать это дело и решить, что делать, если ничего не найдено.

  3. Я рекомендую всегда активировать Option Explicit: в редакторе VBA go до Инструменты Опции Требуется объявление переменной и правильное объявление всех ваших переменных.

  4. Нумерованные имена переменных, такие как Count_1 и Count_2 довольно дерьмовые, потому что быстро запутываются. Вместо этого всегда используйте значимые имена переменных, такие как iRow и iColumn.

Так что в итоге вы получите что-то вроде:

Option Explicit

Public Sub Example()
    Dim CellsProcedured As Long

    Dim iRow As Long
    For iRow = 2 To 51

        Dim iColumn As Long
        For iColumn = 4 To 44

            Dim MatchResult As Double
            On Error GoTo NO_MATCH
            MatchResult = Application.WorksheetFunction.Match(Sheet8.Cells(iRow, 1).Value, Sheet7.Range("A47:A904"), 0)
            On Error GoTo 0

            On Error GoTo NO_INDEX
            Sheet8.Cells(iRow, iColumn) = Application.WorksheetFunction.Index(Sheet7.Range(Sheet7.Cells(47, iColumn - 1), Sheet7.Cells(904, iColumn - 1)), MatchResult)
            On Error GoTo 0

            CellsProcedured = CellsProcedured + 1
            Sheet1.Range("D1") = 2

        Next iColumn
    Next iRow


    Exit Sub

NO_MATCH:
    MsgBox "The value '" & Sheet8.Cells(iRow, 1).Value & "' was not found in Range A47:A904. Aborting."

    Exit Sub

NO_INDEX:
    MsgBox "Index failed at cell(" & iRow & ", " & iColumn & "). Aborting."
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...