#excel #vba #range
Вопрос:
В принципе, я только что нашел этот небольшой код в Интернете, я подумал, что это может мне помочь, потому что я хочу его улучшить. Но на
Do Until Range("A" amp; amp, R) = ""
строка, в которой я получил упомянутую ошибку в названии.
Вот код:
Sub Use_Instr()
R = 1
'loop to the last row
Do Until Range("A" amp; amp, R) = ""
'check each cell if contains 'apple' then..
'..place 'Contains Apple' on column B
If Range("A" amp; amp, R) Like "*apple*" Then
Range("B" amp; amp, R) = "Contains Apple"
End If
R = R 1
Loop
End Sub
Он выполняет поиск по термину «яблоко» в предложениях в столбце и пишет «содержит яблоко» в столбце B
, если оно содержит «яблоко».
Комментарии:
1.
Range("A" amp; amp, R)
это неправильный способ решения проблемы диапазона. Мне кажется, я знаю, что произошло.. Когда вы копировали с веб-сайта, он также скопировал html-код. Заменитьamp; amp,
наamp;
2. В Html
amp;
кодируется какamp;amp;
3. да , похоже, спасибо вам, ребята, как видите, я не эксперт в vba…
4. Никаких проблем. Кстати, вы можете достичь того, чего хотите, без использования цикла 😉
Ответ №1:
Попробуйте это вместо этого:
R = 1
'loop to the last row
Do Until Range("A" amp; R).Value = ""
'check each cell if contains 'apple' then..
'..place 'Contains Apple' on column B
If Range("A" amp; R).Value Like "*apple*" Then
Range("B" amp; R).Value = "Contains Apple"
End If
R = R 1
Loop
Ответ №2:
Range("A" amp; amp, R)
это неправильный способ решения проблемы диапазона. Когда вы копировали с веб-сайта, он также скопировал кодировку html. В Html amp;
кодируется как amp;amp;
. Просто замените amp; amp,
на amp;
в своем коде. Таким образом, ваш код становится
R = 1
'loop to the last row
Do Until Range("A" amp; R) = ""
'check each cell if contains 'apple' then..
'..place 'Contains Apple' on column B
If Range("A" amp; R) Like "*apple*" Then
Range("B" amp; R) = "Contains Apple"
End If
R = R 1
Loop
Также, чтобы сделать регистр кода нечувствительным, как предложено @VBasic2008 в комментариях ниже, вы можете изменить Range("A" amp; R) Like "*apple*"
на If LCase(Range("A" amp; R).Value2) Like "*apple*" Then
.
Сказав это, я бы использовал другой подход, чем использование цикла, который является немного более медленным подходом.
Он выполняет поиск по термину «яблоко» в предложениях в столбце и пишет «содержит яблоко» в столбце B, если оно содержит «яблоко».
Если бы вы сделали это в Excel, то использовали бы формулу =IF(ISNUMBER(SEARCH("apple",A1)),"Contains Apple","")
Итак, что мы сделаем, это найдем последнюю строку в столбце B
, а затем добавим эту формулу во весь диапазон за один раз! Наконец, мы преобразуем формулу в значения.
Option Explicit
Sub Sample()
Dim ws As Worksheet
Dim lRow As Long
Dim sFormula As String
'~~> Change this to the relevant sheet
Set ws = Sheet1
'~~> This is your formula
' =IF(ISNUMBER(SEARCH("apple",A1)),"Contains Apple","")
sFormula = "=IF(ISNUMBER(SEARCH(""apple"",A1)),""Contains Apple"","""")"
With ws
'~~> Find the last row in column B
lRow = .Range("A" amp; .Rows.Count).End(xlUp).Row
'~~> Insert the formula in the entire range in 1 go
With .Range("B1:B" amp; lRow)
.Formula = sFormula
'~~> Convert formula to value
.Value = .Value
End With
End With
End Sub
Комментарии:
1. Чтобы ответ был последовательным, с кратким объяснением, вы должны использовать
If LCase(Range("A" amp; R)) Like "*apple*" Then
модифицированный код in OP (поскольку вы используетеSEARCH
(неFIND
) в своем улучшенном решении).2. 1. Я не использую цикл 2. Поиск не чувствителен к регистру, т. Е. он не учитывает регистр 🙂 @VBasic2008
3. 1. Вы используете цикл в «восстановленном» фрагменте кода OP, сразу после
... So your code becomes...
и доHaving said that,...
. 2. «Восстановленный» фрагмент кода чувствителен к регистру.4. @VBasic2008: А, вы имеете в виду исходный код :D. Там я только предложил перейти с
amp; amp
наamp;
. Не пытался его улучшить. Хорошее предложение. Сообщение обновлено!