Извлечение подстроки и изменение значения ячейки с помощью Mid и Find в Excel (VBA)

Я хочу перебирать столбец и извлекать подстроку в каждой ячейке (в моем примере «Код:»)

введите здесь описание изображения

Я хочу перебрать каждую ячейку и запустить формулу на месте. В основном удалите все в каждой ячейке столбца, кроме кода.

Я знаю, как извлечь строку в другой столбец B, используя формулу: =MID(A2,FIND("Код:",A2,1),23)

... но я хочу сделать это в той же ячейке. Я попробовал этот код в vba, но не знаю, что я делаю неправильно:

For Each cell In Range("A:A") cell.Value = Mid(.Value, InStr(1, .Value, "Code:"), 23) Next


person sameer_88    schedule 04.03.2017    source источник
comment
Почему 23 символа, а не 14??   -  person Gary's Student    schedule 04.03.2017
comment
Если вы не используете блок With вне цикла for, возможная проблема заключается в том, что ваши ссылки .Value идут не туда, куда вы думаете. Попробуйте cell.Value = Mid(cell.Value, InStr(1, cell.Value, "Code:"), 23)   -  person PeterT    schedule 04.03.2017
comment
Существует ли код: в КАЖДОЙ ячейке столбца A? Instr вернет 0, если он не существует (и я не могу поверить, что у вас действительно есть 1048576 ячеек со строкой Code: в них), а Mid, начинающийся с позиции символа 0, завершится ошибкой. (Плюс то, что сказал PeterT!)   -  person YowE3K    schedule 04.03.2017
comment
Ах я вижу!! нет пустых ячеек после A100 или около того. Как запустить эту формулу только для непустых ячеек?   -  person sameer_88    schedule 04.03.2017
comment
Я изменил его на cell.value, и он все еще не работает. возможно, проблема в том, что InStr возвращает 0...   -  person sameer_88    schedule 04.03.2017


Ответы (1)


У вас было две основные ошибки в вашем коде:

  • использование .Value без блока With, чтобы определить, для какого объекта он был Value (как указано PeterT в комментарии), и
  • пытаясь обработать каждую ячейку в столбце A, многие (большинство?) из которых вообще не содержат никакого значения, и определенно это не та строка, которую вы искали.

Код рефакторинга:

Dim CodeExists As Long
'Only run the loop across cells that contain data:
For Each cell In Range("A1", Cells(Rows.Count, "A").End(xlUp))
    With cell
        CodeExists = InStr(1, .Value, "Code:")
        'Check that "Code:" exists
        If CodeExists > 0
            .Value = Mid(.Value, CodeExists, 23)
        End If
    End With
Next

И, как спросил Гэри Студент, почему вы используете 23? «Код: xxxx-xxxx-xxxx» имеет длину 20 символов, а не 23, поэтому вы получаете на 3 символа больше, чем я думал, что вам нужно.

P.S. Если вы даже не хотите, чтобы «Код:» оставался в конечном результате, вы можете изменить свой оператор Mid на:

            .Value = Mid(.Value, CodeExists + 6, 14)
person YowE3K    schedule 04.03.2017
comment
Спасибо! Это прекрасно работает! Что касается 23 вопроса, я не уверен! это был метод проб и ошибок. Я тоже думал, что будет 20. но это работало только с 23! Я также хотел, чтобы у меня не было кода, и ваше решение сработало отлично! - person sameer_88; 05.03.2017