#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. В качестве альтернативы, отладьте свой код: каково значение этой переменной при возникновении ошибки?