‘Диапазон’ объекта’_lobal’ не удается выполнить до тех пор, пока

#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; . Не пытался его улучшить. Хорошее предложение. Сообщение обновлено!