Ошибка времени выполнения при выполнении подобного оператора в VBA

#excel #vba

#excel #vba

Вопрос:

Я пытаюсь разработать функцию, которая выполняет поиск в первой строке определенного термина, а затем выполняет поиск в этом столбце терминов «Требование» или «Изменение функции». Как только он найдет эти термины, необходимо выполнить поиск в строках, содержащих эти термины, и проверить наличие термина «Протокол» в другом столбце. Я пытаюсь выполнить эту задачу с помощью оператора Like, но я продолжаю получать всплывающее окно «Ошибка, определенная приложением или объектом». Кто-нибудь может понять, почему я могу получать эту ошибку? Я уже некоторое время смотрю на это и не могу понять. Вот код, который у меня есть на данный момент:

РЕДАКТИРОВАТЬ: ошибка появляется, когда код переходит к первому оператору IF

 Function CountProtocol() As Long

Sheets("CS-CRM Raw Data").Select
Sheets("CS-CRM Raw Data").Unprotect

    LastRow = Range("A" amp; Rows.Count).End(xlUp).row
    LastColumn = Cells(1, Columns.Count).End(xlToLeft).Column

    For i = 1 To LastRow
        If Cells(i, myTypeCol).Value Like "Functional Change" Or "Requirement" Then
            If Cells(i, myDescCol).Value Like "*protocol*" Then
                pro_count = pro_count   1
            End If
        End If
    Next i

    MsgBox "Requests of type ""Requirement"" or ""Functional Change"" that have ""Protocol"" in the description: " amp; pro_count

CountProtocol = Pro

End Function 
  

РЕДАКТИРОВАТЬ: Вот код, в котором назначается myTypeCol:

 Function ColSearch(Heading As String) As Integer

Sheets("CS-CRM Raw Data").Select
Sheets("CS-CRM Raw Data").Unprotect

myCol = Sheets("CS-CRM Raw Data").Cells.Find(What:=Heading, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False).Column

ColSearch = myCol

End Function
  

Он вызывается в основной подпрограмме следующим образом:

 myTypeCol = ColSearch("type")
myDescCol = ColSearch("description")
  

РЕДАКТИРОВАТЬ: Это еще одна функция, которая у меня есть, которая вызывает myTypeCol, которая отлично работает без ошибок.

 Function CountType() As Long

Sheets("CS-CRM Raw Data").Select
Sheets("CS-CRM Raw Data").Unprotect

Dim type_count As Long
Dim type_count2 As Long
Dim type_sum As Long

    LastRow = Range("A" amp; Rows.Count).End(xlUp).row
    LastColumn = Cells(1, Columns.Count).End(xlToLeft).Column

    type_count = Application.WorksheetFunction.CountIf(Range(myTypeCol amp; "2:" amp; myTypeCol amp; LastRow), "Requirement")
    type_count2 = Application.WorksheetFunction.CountIf(Range(myTypeCol amp; "2:" amp; myTypeCol amp; LastRow), "Functional Change")

    type_sum = type_count   type_count2

    MsgBox "Requests of type ""Requirement"" or ""Functional Change"": " amp; type_sum

CountType = Count

End Function
  

Ответ №1:

Вам нужно сравнить значение ячейки после Or оператора следующим образом:

 Function CountProtocol() As Long

Sheets("CS-CRM Raw Data").Select
Sheets("CS-CRM Raw Data").Unprotect

    LastRow = Range("A" amp; Rows.Count).End(xlUp).row
    LastColumn = Cells(1, Columns.Count).End(xlToLeft).Column

    For i = 1 To LastRow
        If Cells(i, myTypeCol).Value Like "Functional Change" Or Cells(i, myTypeCol).Value Like "Requirement" Then
            If Cells(i, myDescCol).Value Like "*protocol*" Then
                pro_count = pro_count   1
            End If
        End If
    Next i

    MsgBox "Requests of type ""Requirement"" or ""Functional Change"" that have ""Protocol"" in the description: " amp; pro_count

CountProtocol = Pro

End Function 
  

Комментарии:

1. Ах, хороший улов. Я все еще не могу заставить его работать. Когда я выполняю редактирование, которое вы предложили выше, я получаю ошибку «индекс вне диапазона» на листах («Исходные данные CS-CRM»). Выберите » строка. Если я прокомментирую строки Sheets, я снова получу исходную ошибку.

2. @user3783788 где myTypeCol назначен? Если он не назначен (не отображается), то его значение по умолчанию равно 0 , что приведет к возникновению ошибки 1004.

3. Я назначил ее в другой функции. Я опубликую правку с кодом.

4. Это глобальная переменная или переменная уровня модуля? В противном случае его назначение в основной подпрограмме не окажет никакого влияния.

5. В качестве альтернативы, отладьте свой код: каково значение этой переменной при возникновении ошибки?