Функции управления строками VBA и OperaTORs

⚡ Умное резюме

Функции обработки строк в VBA и OperaТоры объединяют, измеряют и эксtracТекст внутри макросов Excel. На этой странице объясняется оператор конкатенации, функции Left, Right, Mid, Len и InStr, разделение и объединение строк, а также наиболее часто встречающиеся ошибки, приводящие к сбоям в строковом коде.

  • 🔤 Строковые данные: Значение, составленное из символов, знаков и чисел, например, текст "Jul-2015".
  • ➕ конкатенация Operaтор: Амперсанд соединяет две строки, поэтому "John" & "Doe" возвращает "John Doe".
  • ✂️ ExtracФункции: Параметры Left, Right и Mid извлекают подстроку из начала, конца или середины значения.
  • 📏 Функции измерения: Функция Len подсчитывает символы, а функция InStr возвращает позицию, с которой начинается подстрока.
  • 🧩 Разделить и объединить: Функция Split разбивает одну строку, разделенную разделителями, на массив, а функция Join восстанавливает массив в одну строку.
  • ⚠️ Общие ошибки: Несоответствие типов, возвращаемое значение InStr, и пробелы в конце строки являются причиной большинства неудачных сравнений.

Функции обработки строк в VBA и OperaTORs

Строка VBA OperaTORs

Строковые данные используются для хранения данных, состоящих из чисел, символов и символов. «Июль-2015» — пример строковых данных. Он состоит из

  • Персонажи (июль)
  • Символ (-)
  • Numbers (2015)

Строковые операторы используются для управления строковыми данными. Например, вы можете объединить значение июля-2015 из первых трех букв месяца и года, например «Июль-3».

В следующей таблице показан строковый оператор конкатенации VBA.

S / N оператор Описание Пример Результат
1 & Объединение: этот оператор используется для объединения строк вместе. "Джон Доу" Иван Иванов

Пример источника Code

Строка VBA Operaторсы Пример Источник Code

MsgBox "John " & "Doe", vbOKOnly, "Concatenate Operator"

Выполнение приведенного выше кода дает следующий результат

Строка VBA Operaторсы Пример Источник Code

Амперсанд — не единственный символ, который используется для соединения текста, и разница между ними имеет значение, когда речь идёт о числах.

Разница между & и + при конкатенации строк

VBA принимает как амперсанд, так и знак плюс между двумя текстовыми значениями, поэтому начинающие часто считают их взаимозаменяемыми. Однако, если один из операндов является числом или пустым значением, они ведут себя по-разному, и только один из них является безопасным.

Поведение & (Амперсанд) + (Плюс)
Два текстовых значения К ним присоединяется: «Guru«& 99» возвращаются Guru99 К ним присоединяется: «Guru” + “99” возвращает Guru99
Текст и число Преобразует число в текст: “Age ” & 30 возвращает Age 30 Вызывает ошибку несоответствия типов.
Две числовые строки «10» и «5» возвращают 105 «10» + «5» могут в сумме дать 15.
Нулевое значение Обрабатывает значение Null как пустую строку. Возвращает Null и отбрасывает весь результат.

💡 Совет: Для конкатенации всегда используйте амперсанд, а знак плюс оставьте для арифметические операции. Поставьте пробел перед и после амперсанда, потому что VBA распознает Total& как символ объявления типа Long.

Функции управления строками VBA

Манипулирование строками VBA — важный элемент Excel VBA для программирования макросов и строковые операции. Excel предоставляет различные типы функций манипуляции строками VBA, например:

  • левыйиспользуется для extract символов с левой стороны строки
  • Правильноиспользуется для extract символов с правой стороны строки
  • серединеиспользуется для extracподстрока из середины строки
  • Лена: используется для определения длины строки
  • ИнСтр: используется для поиска позиции подстроки в строке.
  • Отделка: используется для удаления пробелов с обоих концов строки
  • Замените: используется для замены каждого вхождения одной подстроки на другую.
  • UCase / LCase: используются для преобразования строки в верхний или нижний регистр

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

Функция Синтаксис Пример Результат
левый Left(string, length) Слева («Июль-2015», 3) июль
Правильно Right(string, length) Правильно («Июль-2015», 4) 2015
середине Mid(string, start, length) Середина ("июль-2015", 5, 4) 2015
Лена Len(string) Лен (июль 2015 г.) 8
ИнСтр InStr(start, string, substring) InStr(1, «июль-2015», «-») 4
Отделка Обрезка (строка) Подрезать(" Guru99 “) Guru99
Замените Replace(string, find, replace) Заменить("Июль-2015", "-", "/") Июл / 2015
UCase UCase (строка) UCase(“guru99”) ГУРУ99

Приведённый ниже макрос объединяет несколько таких функций для восстановления метки даты из её частей.

Sub StringFunctionsDemo()
    Dim Source As String
    Dim MonthPart As String
    Dim YearPart As String

    Source = "July-2015"

    ' Take the first three characters
    MonthPart = Left(Source, 3)
    ' Take the last four characters
    YearPart = Right(Source, 4)

    MsgBox MonthPart & "-" & YearPart, vbOKOnly, "String Functions"
End Sub

При запуске макроса отображается Jul-2015. Каждая функция возвращает новое значение, оставляя исходную строку неизменной, поэтому результаты можно безопасно объединить в одном выражении.

Все эти функции работают только с одной строкой за раз. Когда одно значение содержит весь список, две другие функции обрабатывают его лучше.

Как разделить и объединить строки в VBA

Данные, вставляемые в Excel, часто представляют собой одно длинное значение с разделителем между элементами, например, «Pepsi, Coke, Fanta, Juice». Чтение таких данных с помощью функций Mid и InStr происходит медленно и ненадежно. VBA предоставляет пару функций, идеально подходящих именно для этой задачи.

Split Функция принимает строку, разделенную разделителями, и возвращает массив, начинающийся с нуля, с одним элементом на каждый элемент. Присоединяйся Функция Join выполняет обратную операцию, принимая массив и возвращая одну строку с разделителем между элементами. Обратите внимание, что Join работает с массивом, а не с двумя отдельными строками.

Sub SplitAndJoinDemo()
    Dim Source As String
    Dim Items() As String
    Dim i As Long

    Source = "Pepsi,Coke,Fanta,Juice"

    ' Break the value into an array on every comma
    Items = Split(Source, ",")

    For i = LBound(Items) To UBound(Items)
        Sheet1.Cells(i + 1, 1).Value = Items(i)
    Next i

    ' Rebuild the list with a different separator
    MsgBox Join(Items, " | "), vbOKOnly, "Joined List"
End Sub

Цикл записывает каждый напиток в отдельную строку рабочего листа, после чего в окне сообщения отображается Pepsi | Coke | Fanta | Juice. Три момента делают этот шаблон надежным в рабочем коде:

  • Результат, полученный с нуля: Функция Split всегда возвращает массив с номерами, начинающимися с 0, независимо от значения параметра Option Base, поэтому управляйте циклом с помощью параметров LBound и UBound, а не фиксированного числа.
  • Объявить как String(): Присвойте результат динамическому строковому массиву. Указание фиксированного размера в начале приведет к ошибке компиляции.
  • Пустой ввод: Разделение пустой строки возвращает массив без элементов, поэтому перед чтением Items(0) проверьте с помощью UBound.

Даже при правильном выборе функции строковый код дает сбои в ряде предсказуемых ситуаций.

Распространенные ошибки при работе со строками в VBA и способы их исправления.

Большинство строковых ошибок в Excel VBA возникают по ряду причин. Распознавание симптома позволяет избежать длительной отладки.

  • Несоответствие типов при конкатенации: Между текстом и числом стоял знак плюс. Замените его амперсандом, который автоматически преобразует число.
  • Функция InStr возвращает 0: Подстрока не найдена. Функция InStr возвращает 0, а не -1 в случае ошибки, поэтому перед передачей результата в функцию Mid проверьте, не превышает ли значение нуля.
  • Недопустимый вызов процедуры в Mid или Left: Запрошенная длина отрицательная, или начальная позиция меньше 1. Защитите вызов с помощью Len, чтобы длина никогда не превышала строку.
  • Сравнения, которые должны совпадать, но не совпадают: Пробелы в конце импортированных данных нарушают равенство. Оберните обе части в Trim и используйте StrComp, когда регистр следует игнорировать.
  • Текст, который не станет числом: Значение типа «1,200» некорректно обрабатывается арифметическими операциями из-за разделителя. Удалите его с помощью функции Replace перед преобразованием с помощью CLng.

Загрузите Excel, содержащий приведенный выше код.

Скачайте указанный выше файл Excel. Code

Часто задаваемые вопросы (FAQ)

Строка переменной длины вмещает примерно два миллиарда символов, а строка фиксированной длины — до 65 400. Однако ячейка рабочего листа хранит только 32 767 символов, поэтому более длинные значения обрезаются при записи на лист.

По умолчанию сравнение выполняется с учетом регистра. Используйте StrComp(a, b, vbTextCompare) для получения результата без учета регистра или поместите Option Compare Text в начало модуля, чтобы изменить значение по умолчанию для всего модуля.

Амперсанд преобразует каждый операнд в текст перед объединением, поэтому 10 & 5 возвращает строку 105. Сохраняйте значения числовыми и сначала складывайте их, а затем объединяйте результат, если он должен отображаться внутри сообщения.

Да. Опишите входные данные и желаемый результат, например, например.tracЕсли ввести код перед первым дефисом, ИИ-помощник вернет выражения Left и InStr. Протестируйте его на крайних случаях, таких как отсутствие дефиса.

Да. Вставьте вложенное выражение, например, Mid, содержащее InStr, и ИИ-помощник разобьет его на этапы, присвоит имя каждому аргументу и отметит случай, когда InStr возвращает ноль и вызов завершается неудачей.

Подведем итог этой публикации следующим образом: