при замене на экране все нормально, макросом — просто убирает точки, запятые не вставляет. 2 более красиво ставлю автозамену точки на запятую.. как еще? |
|
Меняем числа в текстовом формате с не тем разделителем дробной части на числовой формат? Или я не так понял? |
|
да! правда и я мог не так понять .. |
|
вот файл. поменяйте мне точки на запятые |
|
Ctrl+H, «.» на «,». Лист NEW. |
|
а первый мой пост читали? макросом мне надо! |
|
{quote}{login=слэн}{date=27.05.2008 03:25}{thema=}{post}вот файл. поменяйте мне точки на запятые{/post}{/quote}В результате должны получится числа или должен остаться текст? |
|
нужно макросом и с наибольшей скоростью ибо данных может быть много |
|
На первый вопрос, содержащий «или», ответ «да» непонятен. |
|
на самом деле ответ совершенно верен уж из текста числа я сделаю.. но, подчиняясь , в конечном виде нужны числа, и, значит, будем считать это ответом на первую часть вопроса, после получения которого, ответ на вторую часть будет очевиден |
|
{quote}{login=Лузер™}{date=27.05.2008 04:03}{thema=}{post}На первый вопрос, содержащий «или», ответ «да» непонятен. врят ли — но щас попробуююю |
|
снимаю шляпу — работает. теперь объясните разницу.. |
|
Вариант: |
|
{quote}{login=слэн}{date=27.05.2008 04:18}{thema=}{post}снимаю шляпу — работает. теперь объясните разницу.. |
|
да, возможно. еще раз спасибо |
|
ZVI Пользователь Сообщений: 4328 |
— А символ десятичного разделителя чисел Excel зависит еще и от того, использованы ли системные разделители через меню: Сервис – Параметры – Международные — Использовать системные разделители. Если не учитывать этот факт, то возможны ошибки в определении правильного знака десятичного разделителя для числовых ячеек. Например: При этом Application.DecimalSeparator выдаст точку, а Excel-ю для числовых ячеек нужна запятая. Чтобы не зависеть от подобных накладок я использую такую функцию: ‘ Символ десятичного разделителя — |
zvi, больше интересовала другая особенность: при непосредственном указании Range(Cells(2, 4), Cells(i, 7)).Replace What:=».», Replacement:=»,», LookAt:=xlPart, _ точки убираются, но запятые не появляются при Range(Cells(2, 4), Cells(i, 7)).Replace What:=».», Replacement:=Application.DecimalSeparator, LookAt:=xlPart, _ все нормально, точки меняются на запятые |
|
{quote}{login=ZVI}{date=28.05.2008 01:37}{thema=Re:}{post}— А символ десятичного разделителя чисел Excel зависит еще и от того, использованы ли системные разделители через меню: Сервис – Параметры – Международные — Использовать системные разделители. Если не учитывать этот факт, то возможны ошибки в определении правильного знака десятичного разделителя для числовых ячеек. Например: При этом Application.DecimalSeparator выдаст точку, а Excel-ю для числовых ячеек нужна запятая. Чтобы не зависеть от подобных накладок я использую такую функцию: ‘ Символ десятичного разделителя — |
|
ZVI Пользователь Сообщений: 4328 |
{quote}{login=слэн}{date=28.05.2008 09:47}{thema=}{post}zvi, больше интересовала другая особенность: при непосредственном указании Range(Cells(2, 4), Cells(i, 7)).Replace What:=».», Replacement:=»,», LookAt:=xlPart, _ точки убираются, но запятые не появляются при Range(Cells(2, 4), Cells(i, 7)).Replace What:=».», Replacement:=Application.DecimalSeparator, LookAt:=xlPart, _ все нормально, точки меняются на запятые{/post}{/quote} Функция DecSep() мною была приведена в развитие темы, так как звучало «и с наибольшей скоростью ибо данных может быть много». С этой функцией замена текстовых ячеек на числовые работает в 2-3 раза быстрее, чем Replace. На моем компе — примерно в 2.9 раза быстрее. Для того, чтобы сравнить эффективность 2-х методов замены прилагаю файл небольшой тест-системы с подробными комментариями. |
ZVI, безусловно, Вы нам уже не раз доказывали, что считать массив, обработать, записать гораздо быстрее, чем непосредственная обработка экселем. |
|
ZVI, простите, но я нашел у Вас ошибку. |
|
Придумал метод 3 |
|
ZVI Пользователь Сообщений: 4328 |
{quote}{login=Лузер™}{date=29.05.2008 09:21}{thema=}{post}ZVI, простите, но я нашел у Вас ошибку. Ваша идея с манипуляцией .UseSystemSeparators и .DecimalSeparator замечательная! Смогу подключиться к проблеме уже на выходных. |
Она не совсем не работает. Я эксперементировал с запятой и получил работающий код. На радостях выложил. Продолжил эксперименты с разделителем «%» — не работает. Вернулся к запятой, снова не работает. |
|
{quote}{login=Лузер™}{date=30.05.2008 10:24}{thema=}{post}Она не совсем не работает. Я эксперементировал с запятой и получил работающий код. На радостях выложил. Продолжил эксперименты с разделителем «%» — не работает. Вернулся к запятой, снова не работает. вот-вот но ваш первый код работает(у меня) без проблем.(это с replace и decimalseparator) вообще мне нужно было: файлов может быть до 1000 в конечной таблице строк до 800 000 сейчас работаю с 60 000 строк основной таблицы — для этого требуется обработать около 40 файлов — на генерацию таблицы уходит 27сек |
|
Если есть возможность занести значения в эксель как текст с точкой (если установленный разделитель запятая то любые цифры разделённые точкой воспринимаются общим форматом как текст) ‘функция вал работает только с us-строками |
|
ZVI Пользователь Сообщений: 4328 |
{quote}{login=dl}{date=02.06.2008 08:40}{thema=val и cdbl}{post}Если есть возможность занести значения в эксель как текст с точкой (если установленный разделитель запятая то любые цифры разделённые точкой воспринимаются общим форматом как текст) ‘функция вал работает только с us-строками |
слэн Гость |
#30 05.06.2008 14:51:16 «спешу» предоставить уважаемому сообществу третий способ преобразования, еще более быстрый.. ps мне этот способ не понадобился — я обошелся вообще без преобразования(вернее оно выполняется встроенными средствами иксель при открытии текстового файла). Надо конечно попробовать упомянутый ZVI способ чтения файла в переменную.. Прикрепленные файлы
|
При работе с VBA в Excel вам может потребоваться разделить строку на разные части на основе разделителя.
Например, если у вас есть адрес, вы можете использовать функцию VBA Split, чтобы получить разные части адреса, разделенные запятой (которая в данном случае будет разделителем).
SPLIT — это встроенная строковая функция в Excel VBA, которую можно использовать для разделения текстовой строки на основе разделителя.
Функция Excel VBA SPLIT — синтаксис
Разделить (Выражение, [Разделитель], [Предел], [Сравнить])
- Выражение: Это строка, которую вы хотите разделить на основе разделителя. Например, в примере с адресом весь адрес будет выражением «выражение». В случае, если это строка нулевой длины («»), функция SPLIT вернет пустой массив.
- Разделитель: Это необязательный аргумент. Это разделитель, который используется для разделения аргумента «Выражение». В нашем примере с адресом запятая является разделителем, который используется для разделения адреса на разные части. Если вы не укажете этот аргумент, разделителем по умолчанию будет считаться пробел. Если вы указываете строку нулевой длины («»), функция возвращает всю строку «Expression».
- Лимит: Это необязательный аргумент. Здесь вы указываете общее количество подстрок, которые хотите вернуть. Например, если вы хотите вернуть только первые три подстроки из аргумента «Выражение», это будет 3. Если вы не укажете этот аргумент, по умолчанию будет -1, что возвращает все подстроки.
- Сравнивать: Это необязательный аргумент. Здесь вы указываете тип сравнения, которое вы хотите, чтобы функция SPLIT выполняла при оценке подстрок. Доступны следующие варианты:
- Когда сравнение равно 0: Это двоичное сравнение. Это означает, что если ваш разделитель представляет собой текстовую строку (скажем, ABC), то это будет чувствительно к регистру. «ABC» не будет равно «abc».
- Когда сравнение равно 1: Это текстовое сравнение. Это означает, что если вашим разделителем является текстовая строка (скажем, ABC), то даже если у вас есть «abc» в строке «Expression», она будет считаться разделителем.
Теперь, когда мы рассмотрели основы функции SPLIT, давайте рассмотрим несколько практических примеров.
Пример 1 — Разделение слов в предложении
Предположим, у меня есть текст — «Быстрая коричневая лисица перепрыгивает через ленивую собаку».
Я могу использовать функцию SPLIT, чтобы выделить каждое слово этого предложения как отдельный элемент в массиве.
Приведенный ниже код будет к этому:
Sub SplitWords () Dim TextStrng As String Dim Result () As String TextStrng = «Быстрая коричневая лисица перепрыгивает через ленивую собаку» Результат () = Split (TextStrng) End Sub
Хотя код не делает ничего полезного, он поможет вам понять, что делает функция Split в VBA.
Функция Split разбивает текстовую строку и присваивает каждое слово массиву Result.
Итак, в этом случае:
- Результат (0) сохраняет значение «The».
- Результат (1) сохраняет значение «Быстрый».
- Результат (2) сохраняет значение «Коричневый» и так далее.
В этом примере мы указали только первый аргумент — текст, который нужно разделить. Поскольку разделитель не указан, в качестве разделителя по умолчанию используется пробел.
Важная заметка:
- Функция VBA SPLIT возвращает массив, который начинается с базы 0.
- Когда результат функции SPLIT присваивается массиву, этот массив должен быть объявлен как тип данных String. Если вы объявите его как тип данных Variant, он покажет ошибку несоответствия типа). Обратите внимание, что в приведенном выше примере я объявил Result () как тип данных String.
Пример 2 — Подсчет количества слов в предложении
Вы можете использовать функцию SPLIT, чтобы получить общее количество слов в предложении. Хитрость здесь в том, чтобы подсчитать количество элементов в массиве, которое вы получите при разделении текста.
В приведенном ниже коде будет отображаться окно сообщения с количеством слов:
Sub WordCount () Dim TextStrng As String Dim WordCount As Integer Dim Result () As String TextStrng = "Быстрая коричневая лиса перепрыгивает через ленивую собаку" Результат = Split (TextStrng) WordCount = UBound (Result ()) + 1 MsgBox " Количество слов: "& WordCount End Sub
В этом случае функция UBound сообщает нам верхнюю границу массива (т.е. максимальное количество элементов в массиве). Поскольку база массива равна 0, добавляется 1, чтобы получить общее количество слов.
Вы можете использовать аналогичный код для создания пользовательской функции в VBA, которая будет принимать текст в качестве входных данных и возвращать количество слов.
Приведенный ниже код создаст эту функцию:
Функция WordCount (CellRef As Range) Dim TextStrng As String Dim Result () As String Result = Split (WorksheetFunction.Trim (CellRef.Text), "") WordCount = UBound (Result ()) + 1 End Function
После создания вы можете использовать функцию WordCount, как любую другую обычную функцию.
Эта функция также обрабатывает начальные, конечные и двойные пробелы между словами. Это стало возможным благодаря использованию функции TRIM в коде VBA.
Если вы хотите узнать больше о том, как эта формула работает для подсчета количества слов в предложении, или хотите узнать о способе вычисления количества слов с помощью формулы, отличной от VBA, ознакомьтесь с этим руководством.
Пример 3 — Использование разделителя, отличного от пробела
В предыдущих двух примерах мы использовали только один аргумент в функции SPLIT, а остальные были аргументами по умолчанию.
Когда вы используете какой-либо другой разделитель, вам необходимо указать это в формуле SPLIT.
В приведенном ниже коде функция SPLIT возвращает массив, основанный на запятой в качестве разделителя, а затем показывает сообщение с каждым словом в отдельной строке.
Sub CommaSeparator () Dim TextStrng As String Dim Result () As String Dim DisplayText As String TextStrng = "The, Quick, Brown, Fox, Jump, Over, The, Lazy, Dog" Result = Split (TextStrng, ",") Для i = LBound (Result ()) To UBound (Result ()) DisplayText = DisplayText & Result (i) & vbNewLine Далее i MsgBox DisplayText End Sub
В приведенном выше коде я использовал цикл For Next, чтобы просмотреть каждый элемент массива «Result», назначив его переменной «DisplayText».
Пример 4 — Разделите адрес на три части
С помощью функции SPLIT вы можете указать, сколько чисел разделений вы хотите получить. Например, если я ничего не укажу, каждый экземпляр разделителя будет использоваться для разделения строки.
Но если я укажу 3 как предел, то строка будет разделена только на три части.
Например, если у меня есть следующий адрес:
2703 Winifred Way, Индианаполис, Индиана, 46204
Я могу использовать функцию Split в VBA, чтобы разделить этот адрес на три части.
Он разделяет первые два на основе разделителя запятой, а оставшаяся часть становится третьим элементом массива.
В приведенном ниже коде адрес будет отображаться в трех разных строках в окне сообщения:
Sub CommaSeparator () Dim TextStrng As String Dim Result () As String Dim DisplayText As String TextStrng = "2703 Winifred Way, Indianapolis, Indiana, 46204" Result = Split (TextStrng, ",", 3) For i = LBound (Result ( )) To UBound (Result ()) DisplayText = DisplayText & Result (i) & vbNewLine Далее i MsgBox DisplayText End Sub
Одно из практических применений этого может быть, когда вы хотите разделить однострочный адрес в формате, показанном в окне сообщения. Затем вы можете создать настраиваемую функцию, которая возвращает адрес, разделенный на три части (каждая часть в новой строке).
Следующий код сделает это:
Функция ThreePartAddress (cellRef As Range) Dim TextStrng As String Dim Result () As String Dim DisplayText As String Result = Split (cellRef, ",", 3) For i = LBound (Result ()) To UBound (Result ()) DisplayText = DisplayText & Trim (Результат (i)) & vbNewLine Next i ThreePartAddress = Mid (DisplayText, 1, Len (DisplayText) - 1) Функция завершения
Если у вас есть этот код в модуле, вы можете использовать функцию (ThreePartAddress) в книге так же, как любую другую функцию Excel.
Эта функция принимает один аргумент — ссылку на ячейку с адресом.
Обратите внимание: чтобы полученный адрес отображался в трех разных строках, вам необходимо применить формат переноса текста к ячейкам (он находится на вкладке «Главная» в группе «Выравнивание»). Если формат «Перенос текста» не включен, вы увидите весь адрес как одну строку.
Пример 5 — Получение названия города из адреса
С помощью функции Split в VBA вы можете указать, какую часть результирующего массива вы хотите использовать.
Например, предположим, что я разделяю следующий адрес на основе запятой в качестве разделителя:
2703 Winifred Way, Индианаполис, Индиана, 46204
Результирующий массив будет выглядеть примерно так, как показано ниже:
{"2703 Winifred Way", "Indianapolis", "Indiana", "46204"}
Поскольку это массив, я могу выбрать отображение или возврат определенной части этого массива.
Ниже приведен код пользовательской функции, где вы можете указать число, и она вернет этот элемент из массива. Например, если мне нужно название состояния, я могу указать 3 (поскольку это третий элемент в массиве).
Функция ReturnNthElement (CellRef как диапазон, ElementNumber как целое число) Dim Result () As String Result = Split (CellRef, ",") ReturnNthElement = Result (ElementNumber - 1) End Function
Вышеупомянутая функция принимает два аргумента: ссылку на ячейку с адресом и номер элемента, который вы хотите вернуть. Функция Split разделяет элементы адреса и присваивает их переменной Result.
Затем он возвращает номер элемента, который вы указали в качестве второго аргумента. Обратите внимание, что, поскольку база равна 0, ElementNumber-1 используется для возврата правильной части адреса.
Эта настраиваемая формула лучше всего подходит, когда у вас есть согласованный формат для всего адреса, т. Е. Город всегда упоминается после двух запятых. Если данные несовместимы, вы не получите желаемого результата.
Если вам нужно название города, вы можете использовать 2 в качестве второго аргумента. Если вы используете число, превышающее общее количество элементов, оно вернет #VALUE! ошибка.
Вы можете еще больше упростить код, как показано ниже:
Функция ReturnNthElement (CellRef как диапазон, ElementNumber как целое число) ReturnNthElement = Split (CellRef, ",") (ElementNumber - 1) Конечная функция
В приведенном выше коде вместо использования переменной Result возвращается только указанный номер элемента.
Итак, если у вас есть Split («Доброе утро») (0), он вернет только первый элемент, который является «Хорошим».
Точно так же в приведенном выше коде он возвращает только указанный номер элемента.
A_Qz 31 / 8 / 4 Регистрация: 21.01.2018 Сообщений: 53 |
||||||||
1 |
||||||||
Excel Замена запятой на точку09.12.2018, 11:23. Показов 20219. Ответов 4 Метки нет (Все метки)
Совсем маленький «зацеп». Несколько лет назад все работало как положено. А сегодня перестало.
А вот обратно:
запятая остается. Только содержимое ячейки переводит в текстовый формат, но запятая без изменении. Пробовал предварительно форматировать в текстовый, но ничего. Создается впечатление, где-то в VBA крепко зашита автозамена точки на запятую. Спасибо за объяснение.
1 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
09.12.2018, 11:23 |
4 |
1813 / 1135 / 346 Регистрация: 11.07.2014 Сообщений: 4,002 |
|
09.12.2018, 17:33 |
2 |
Сообщение было отмечено A_Qz как решение РешениеA_Qz, видимо в настройках экселя Пуск — Настройка — Дополнительно стоит галка Использовать системные разделители, а в винде разделитель запятая. Либо исправить в винде, либо здесь убрать галку и в Разделитель … поставить точку.
1 |
A_Qz 31 / 8 / 4 Регистрация: 21.01.2018 Сообщений: 53 |
||||
09.12.2018, 21:51 [ТС] |
3 |
|||
Спасибо за подсказку, убрал галку — «Использовать системные разделители». Win не трогал. Меняет запятую на точку, но только, если в Excel разделитель — запятая, то для того, чтобы была поставлена точка, ячейку обязательно предварительно нужно перевести в текстовый формат:
0 |
Burk 1813 / 1135 / 346 Регистрация: 11.07.2014 Сообщений: 4,002 |
||||||||
10.12.2018, 05:40 |
4 |
|||||||
A_Qz,
Excel разделитель — запятая, то для того, чтобы была поставлена точка, ячейку обязательно предварительно нужно перевести в текстовый формат: Так надо поставить разделитель — точку и всё работает, привожу макросы, на которых проверял
Добавлено через 24 минуты
0 |
A_Qz 31 / 8 / 4 Регистрация: 21.01.2018 Сообщений: 53 |
||||||||
10.12.2018, 18:40 [ТС] |
5 |
|||||||
Это все понятно. Но мне нужно было, что бы при разделителе — запятая, сохранялась после замены точка. С тем, что бы я мог этот файл экспортировать в другие программы, где разделитель — точка. Ход действий был такой: убрал галку «Использовать системные разделители» и поправил код
В этом коде все работает так, как мне надо. sB была определена как String ранее.
Спасибо ещё раз.
0 |
Функция VBA Split позволяет отделить компоненты из стандартной текстовой строки, где каждый компонент использует определенный символ-разделитель, например. запятая или двоеточие. Это проще использовать, чем писать код, для поиска разделителей в строке и последующего извлечения значений.
Его можно использовать, если вы читаете строку из значения, разделенного запятыми (файл CSV), или если у вас есть почтовый адрес, который находится в одной строке, но вы хотите видеть его как несколько строк.
Синтаксис:
1 | Разделить выражение, разделитель [необязательно], предел [необязательно], сравнить [необязательно] |
Функция VBA Split имеет четыре параметра:
- Выражение — Строка текста, которую вы хотите разделить на разные части.
- Разделитель (по желанию)— строка или непечатаемый символ — определяет символ-разделитель, который будет использоваться для разделения. Если символ-разделитель не указан, используется пробел по умолчанию.
- Предел (по желанию) — число — Определяет, сколько разбиений будет сделано. Если пусто, все доступные разделения будут сделаны внутри строки. Если он установлен на 1, то разбиение не будет. По сути, это позволяет вам выделить определенное количество значений, начиная с начала строки, например. где строка очень длинная, и вам нужны только первые три разделения.
- Сравнивать (по желанию) — Если ваш разделитель является текстовым символом, то он используется для переключения, учитывает ли разделитель регистр или нет. Значения: vbBinaryCompare (с учетом регистра) и vbTextCompare (без учета регистра).
Функция разделения всегда возвращает массив.
Простой пример функции разделения
123456789101112 | Sub SplitExample ()’Определить переменныеDim MyArray () как строка, MyString как строка, I как вариант’Пример строки с разделителями пробеламиMyString = «Раз, два, три, четыре»‘Используйте функцию Split, чтобы разделить составные части строкиMyArray = Разделить (MyString)’перебирать массив, созданный для отображения каждого значенияДля каждого я в MyArrayMsgBox IДалее яКонец подписки |
В этом примере разделитель не указан, потому что между всеми словами есть пробел, поэтому можно использовать разделитель по умолчанию (пробел).
Массив не имеет размеров и задан как строка. Переменная I, которая используется в цикле For… Next, должна иметь размер как вариант.
Когда этот код запущен, он покажет четыре окна сообщений, по одному для каждого из разделов, например. Один два три. Четыре.
Обратите внимание, что если между словами в строке есть двойной пробел, это будет расценено как разбиение, хотя в нем ничего нет. Возможно, это не тот результат, который вы хотите видеть.
Вы можете решить эту проблему, используя функцию Replace, чтобы заменить любые двойные пробелы одним пробелом:
1 | MyString = Заменить (MyString, «», «») |
Конечный или начальный пробел также может вызывать проблемы, создавая пустое разделение. Их часто очень трудно увидеть. Вы можете удалить эти лишние пробелы с помощью функции Trim:
1 | MyString = Обрезать (MyString) |
Использование функции разделения с символом-разделителем
Мы можем использовать разделитель точки с запятой (;). Это часто встречается в строках адресов электронной почты для разделения адресов. Вам может быть отправлено электронное письмо, которым вы поделитесь с несколькими коллегами, и вы хотите увидеть на своем рабочем листе список тех, кому оно было отправлено. Вы можете легко скопировать адреса электронной почты из полей «Кому» или «Копировать» в свой код.
123456789101112131415 | Sub SplitBySemicolonExample ()’Определить переменныеDim MyArray () как строка, MyString как строка, I как вариант, N как целое число’Пример строки с разделителями с запятойMyString = «[email protected]; [email protected]; [email protected]; [email protected]»‘Используйте функцию Split, чтобы разделить составные части строкиMyArray = Разделить (MyString, «;»)’Очистить рабочий листActiveSheet.UsedRange.Clear’перебирать массивДля N = 0 до UBound (MyArray)’Поместите каждый адрес электронной почты в первый столбец рабочего листаДиапазон («A» и N + 1). Значение = MyArray (N)Следующий NКонец подписки |
Обратите внимание, что цикл For… Next используется для перебора массива. Первый элемент в массиве всегда начинается с нуля, и функция Upper Bound используется для получения максимального количества элементов.
После запуска этого кода ваш рабочий лист будет выглядеть так:
Использование предельного параметра в функции разделения
Параметр limit позволяет выполнить определенное количество разделений с начала строки. К сожалению, вы не можете указать начальную позицию или диапазон разбиений, поэтому это довольно просто. Вы можете создать свой собственный код VBA, чтобы создать функцию для этого, и это будет объяснено позже в этой статье.
123456789101112131415 | Подраздел SplitWithLimitExample ()’Создать переменныеDim MyArray () как строка, MyString как строка, I как вариант, N как целое число’Пример строки с разделителями-запятымиMyString = «Один, два, три, четыре, пять, шесть»‘Используйте функцию Split, чтобы разделить составные части строкиMyArray = Разделить (MyString, «,», 4)’Очистить рабочий листActiveSheet.UsedRange.Clear’Итерировать по массивуДля N = 0 до UBound (MyArray)’Поместите каждую разбивку в первый столбец рабочего листаДиапазон («A» и N + 1). Значение = MyArray (N)Следующий NКонец подписки |
После того, как вы запустите этот код, ваш рабочий лист будет выглядеть так:
Отдельно показаны только первые три значения разделения. Последние три значения отображаются как одна длинная строка и не разделяются.
Если вы выберете предельное значение, превышающее количество разделителей в строке, это не приведет к ошибке. Строка будет разделена на все составные части, как если бы предельное значение не было указано.
Использование параметра сравнения в функции разделения
Параметр Compare определяет, чувствителен ли разделитель к регистру или нет. Это не применимо, если разделителями являются запятые, точки с запятой или двоеточие.
Примечание. Вместо этого вы всегда можете разместить Option Compare Text <> в верхней части модуля, чтобы исключить чувствительность к регистру для всего модуля.
123456789101112131415 | Sub SplitByCompareExample ()’Создать переменныеDim MyArray () как строка, MyString как строка, I как вариант, N как целое число’Пример строки с разделителями XMyString = «OneXTwoXThreexFourXFivexSix»‘Используйте функцию Split, чтобы разделить составные части строкиMyArray = Split (MyString, «X»,, vbBinaryCompare)’Очистить рабочий листActiveSheet.UsedRange.Clear’перебирать массивДля N = 0 до UBound (MyArray)’Поместите каждую разбивку в первый столбец рабочего листаДиапазон («A» и N + 1). Значение = MyArray (N)Следующий NКонец подписки |
В этом примере разделяемая строка использует символ «X» в качестве разделителя. Однако в этой строке есть смесь символов «X» в верхнем и нижнем регистре. В параметре Сравнить в функции разделения используется символ «X» в верхнем регистре.
Если для параметра Compare установлено значение vbBinaryCompare, то строчные символы «x» будут проигнорированы, и ваш рабочий лист будет выглядеть следующим образом:
Если для параметра Compare установлено значение vbTextCompare, то в разделении будут использоваться строчные символы «x», и ваш рабочий лист будет выглядеть следующим образом:
Обратите внимание, что значение в ячейке A6 усечено, поскольку оно содержит символ «x» в нижнем регистре. Поскольку разделение не чувствительно к регистру, любой разделитель, который является частью подстроки, вызовет разделение.
Это важный момент, о котором следует помнить при использовании текстового разделителя и vbTextCompare. Вы легко можете получить неверный результат.
Использование непечатаемых символов в качестве символа-разделителя
В качестве разделителя можно использовать непечатаемые символы, например возврат каретки (разрыв строки).
Здесь мы используем vbCr для указания возврата каретки <>
123456789101112131415 | Sub SplitByNonPrintableExample ()’Создать переменныеDim MyArray () как строка, MyString как строка, I как вариант, N как целое число’Пример строки с разделителями возврата кареткиMyString = «One» & vbCr & «Two» & vbCr & «Three» & vbCr & «Four» & vbCr & «Five» & vbCr & «Six»‘Используйте функцию Split, чтобы разделить составные части строкиMyArray = Разделить (MyString, vbCr« vbTextCompare)’Очистить рабочий листActiveSheet.UsedRange.Clear’Итерировать по массивуДля N = 0 до UBound (MyArray)’Поместите каждую разбивку в первый столбец рабочего листаДиапазон («A» и N + 1). Значение = MyArray (N)Следующий NКонец подписки |
В этом примере строка создается с использованием vbCr (символ возврата каретки) в качестве разделителя.
Когда этот код будет запущен, ваш рабочий лист будет выглядеть так:
Использование функции соединения для отмены разделения
Функция Join повторно объединит все элементы массива, но с использованием указанного разделителя. Если символ-разделитель не указан, будет использоваться пробел.
123456789101112131415 | Sub JoinExample ()’Создать переменныеDim MyArray () как строка, MyString как строка, I как вариант, N как целое числоТусклая цель как строка’Пример строки с разделителями-запятымиMyString = «Один, два, три, четыре, пять, шесть»‘Поместите MyString в ячейку A1Диапазон («A1»). Значение = MyString’Используйте функцию Split, чтобы разделить составные части строкиMyArray = Разделить (MyString, «,»)’Используйте функцию соединения, чтобы воссоздать исходную строку, используя разделитель с запятой.Цель = Присоединиться (MyArray, ”;”)’Поместите строку результата в ячейку A2Диапазон («A2»). Значение = ЦельКонец подписки |
Этот код разбивает строку с разделителями-запятыми в массив и снова объединяет их, используя разделители с запятой.
После запуска этого кода ваш рабочий лист будет выглядеть так:
В ячейке A1 есть исходная строка с разделителями-запятыми, а в ячейке A2 — новая объединенная строка с разделителями-точками с запятой.
Использование функции разделения для подсчета слов
Принимая во внимание, что строковая переменная в Excel VBA может иметь длину до 2 ГБ, вы можете использовать функцию разделения для подсчета слов в фрагменте текста. Очевидно, Microsoft Word делает это автоматически, но это может быть полезно для простого текстового файла или текста, скопированного из другого приложения.
1234567891011121314 | Sub NumberOfWordsExample ()’Создать переменныеDim MyArray () как строка, MyString как строка’Пример строки с разделителями пробеламиMyString = «Один, два, три, четыре, пять, шесть»‘Удалите любые двойные пробелыMyString = Заменить (MyString, «», «»)’Удалите все начальные и конечные пробелыMyString = Обрезать (MyString)’Используйте функцию Split, чтобы разделить составные части строкиMyArray = Разделить (MyString)’Показать количество слов с помощью функции UBoundMsgBox «Количество слов» и UBound (MyArray) + 1Конец подписки |
Одна из опасностей этого кода подсчета слов заключается в том, что в нем будут появляться двойные пробелы, а также начальные и конечные пробелы. Если они присутствуют, они будут засчитаны как лишние слова, и подсчет слов будет неточным.
Код использует функции Replace и Trim для удаления этих лишних пробелов.
В последней строке кода отображается количество слов, найденных с помощью функции UBound для получения максимального количества элементов массива с последующим увеличением его на 1. Это связано с тем, что первый элемент массива начинается с нуля.
Разделение адреса на ячейки рабочего листа
Почтовые адреса часто представляют собой длинные текстовые строки с разделителями-запятыми. Вы можете разделить каждую часть адреса на отдельную ячейку.
123456789101112131415 | Sub AddressExample ()’Создать переменныеDim MyArray () как строка, MyString как строка, N как целое число’Настроить строку с адресом Microsoft CorporationMyString = «Microsoft Corporation, One Microsoft Way, Redmond, WA 98052-6399 USA»‘Используйте функцию разделения, чтобы разделить строку с помощью разделителя запятойMyArray = Разделить (MyString, «,»)’Очистить рабочий листActiveSheet.UsedRange.Clear’перебирать массивДля N = 0 до UBound (MyArray)’Поместите каждую разбивку в первый столбец рабочего листаДиапазон («A» и N + 1). Значение = MyArray (N)Следующий NКонец подписки |
При запуске этого кода будет использоваться разделитель запятой, чтобы поместить каждую строку адреса в отдельную ячейку:
Если вы хотите вернуть только почтовый индекс (последний элемент массива), вы можете использовать код:
123456789101112 | Дополнительный адрес’Создать переменныеDim MyArray () как строка, MyString как строка, N как целое число, Temp как строка’Настроить строку с адресом Microsoft CorporationMyString = «Microsoft Corporation, One Microsoft Way, Redmond, WA 98052-6399 USA»‘Используйте функцию разделения, чтобы разделить строку с помощью разделителя запятойMyArray = Разделить (MyString, «,»)’Очистить рабочий листActiveSheet.UsedRange.Clear’Введите почтовый индекс в ячейку A1Диапазон («A1»). Значение = MyArray (UBound (MyArray))Конец подписки |
Это будет использовать только последний элемент в массиве, который можно найти с помощью функции UBound.
С другой стороны, вы можете захотеть увидеть все строки в одной ячейке, чтобы их можно было напечатать на адресной этикетке:
1234567891011121314151617 | Sub AddressExample ()’Создать переменныеDim MyArray () как строка, MyString как строка, N как целое число, Temp как строка’Настроить строку с адресом Microsoft CorporationMyString = «Microsoft Corporation, One Microsoft Way, Redmond, WA 98052-6399 USA»‘Используйте функцию разделения, чтобы разделить строку с помощью разделителя запятойMyArray = Разделить (MyString, «,»)’Очистить рабочий листActiveSheet.UsedRange.Clear’перебирать массивДля N = 0 до UBound (MyArray)’поместите каждый элемент массива плюс символ перевода строки в строкуTemp = Temp & MyArray (N) & vbLfСледующий N’Поместите строку на листДиапазон («A1») = ТемператураКонец подписки |
Этот пример работает так же, как и предыдущий, за исключением того, что он создает временную строку из всех элементов массива, но вставляет символ перевода строки после каждого элемента.
После запуска кода рабочий лист будет выглядеть так:
Разделить строку на ячейки листа
Вы можете скопировать массив Split в ячейки листа <> с помощью всего одной команды:
12345678910 | Sub CopyToRange ()’Создать переменныеDim MyArray () как строка, MyString как строка’Пример строки с разделителями пробеламиMyString = «Один, два, три, четыре, пять, шесть»‘Используйте функцию Split, чтобы разделить составные части строкиMyArray = Разделить (MyString, «,»)’Скопируйте массив в рабочий листДиапазон («A1: A» & UBound (MyArray) + 1) .Value = WorksheetFunction.Transpose (MyArray)Конец подписки |
Когда этот код будет запущен, ваш рабочий лист будет выглядеть так:
Создание новой функции, позволяющей разделение с заданной точки
Параметр Limit в функции Split позволяет вам указать только верхний предел, на котором вы хотите, чтобы разделение остановилось. Он всегда начинается с начала строки.
Было бы очень полезно иметь аналогичную функцию, в которой вы можете указать начальную точку разделения внутри строки и количество разделений, которые вы хотите видеть с этой точки и далее. Он также будет извлекать только те разбиения, которые вы указали в массиве, вместо того, чтобы иметь огромное строковое значение в качестве последнего элемента в массиве.
Вы можете легко создать функцию (называемую SplitSlicer) в VBA, чтобы сделать это:
123456789101112131415161718192021222324 | Функция SplitSlicer (Target As String, Del As String, Start as Integer, N As Integer)’Создать переменную массиваDim MyArray () как строка’Захватить разделение, используя начальную переменную, используя символ-разделительMyArray = Разделить (цель, удаление, начало)‘Проверьте, не превышает ли начальный параметр количества разделений — это может вызвать проблемыЕсли Start> UBound (MyArray) + 1, то‘Отображение ошибки и выход из функцииMsgBox «Начальный параметр больше, чем количество доступных разделений»SplitSlicer = MyArrayФункция выходаКонец, если’Поместите последний элемент массива в строкуЦель = MyArray (UBound (MyArray))’Разделить строку, используя N как пределMyArray = Разделить (Цель, Del, N)‘Убедитесь, что верхний предел больше нуля, поскольку код удаляет последний элементЕсли UBound (MyArray)> 0, то’Используйте ReDim, чтобы удалить последний элемент массиваReDim Preserve MyArray (UBound (MyArray) — 1)Конец, если’Вернуть новый массивSplitSlicer = MyArrayКонечная функция |
Эта функция построена с четырьмя параметрами:
- Цель — строка — это входная строка, которую вы хотите разделить
- Del — строковый или непечатаемый символ — это символ-разделитель, который вы используете, например запятая, двоеточие
- Начинать — число — это начальный раздел для вашего среза
- N — число — это количество разделов, которое вы хотите сделать в своем срезе
Ни один из этих параметров не является необязательным или имеет значения по умолчанию, но вы можете включить это в код функции, если хотите расширить его.
Функция использует функцию Split для создания массива, используя параметр Start в качестве предела. Это означает, что элементы массива будут содержать разбиения до начального параметра, но оставшаяся часть строки будет последним элементом и не будет разбита.
Последний элемент в массиве передается обратно в строку с помощью функции UBound, чтобы определить, какой это элемент.
Затем строка снова разделяется на массив, используя N в качестве предельной переменной. Это означает, что разбиение будет выполнено для строки до позиции N, после чего остальная часть строки сформирует последний элемент в массиве.
Оператор ReDim используется для удаления последнего элемента, поскольку мы хотим, чтобы в массиве оставались только определенные элементы. Обратите внимание, что используется параметр Preserve, иначе все данные в массиве будут потеряны.
Затем новый массив возвращается коду, из которого он был вызван.
Обратите внимание, что код «защищен от ошибок». Пользователи часто будут делать странные вещи, о которых вы не задумывались. Например, если они попытаются использовать функцию с параметром Start или N, превышающим доступное количество разбиений в строке, это может привести к сбою функции.
Код включен для проверки значения Start, а также для того, чтобы убедиться, что существует элемент, который можно удалить при использовании оператора ReDim в массиве.
Вот код для проверки функции:
123456789101112 | Sub TestSplitSlicer ()’Создать переменныеDim MyArray () как строка, MyString как строка’Определить образец строки с разделителями-запятымиMyString = «Один, Два, Три, Четыре, Пять, Шесть, Семь, Восемь, Девять, Десять»‘Используйте функцию Splitslicer для определения нового массиваMyArray = SplitSlicer (MyString, «,», 4, 3)’Очистить активный листActiveSheet.UsedRange.Clear’Скопируйте массив в рабочий листДиапазон («A1: A» & UBound (MyArray) + 1) .Value = WorksheetFunction.Transpose (MyArray)Конец подписки |
Запустите этот код, и ваш рабочий лист будет выглядеть так:
I would like to change VBA array decimal separator to dot. I see it as comma. I tried: Application.DecimalSeparator="."
But when I get the value as MyString = matrix(2, 1)
, the decimal separator in VBA arrays maliciously persists as comma. I am not able to get rid of the pest.
Is there a way to detect which system separator for VBA arrays is used?
asked Nov 2, 2017 at 15:40
Przemyslaw ReminPrzemyslaw Remin
6,09624 gold badges108 silver badges186 bronze badges
5
VBA uses quite a few bits drawn from various parts of the platform to work out which decimal and thousands separator to use. Application.DecimalSeparator
changes a few instances (mostly on the workbook); you can tweak others at the OS level, but even then though you get to a couple of cases where you can’t change the settings.
Your best bet is to write a simple function to check which separator your platform uses based on a trial conversion of say 1.2 to a string and see what the second character ends up being. Crude but strangely beautiful.
Armed with that you can force an interchange of . and , as appropriate. Naturally then though you will have to manage all string to number parsing yourself, with some care.
Personally though I think this is epitomises an unnecessary fight with your system settings. Therefore I would leave everything as it is; grin and bear it in other words.
answered Nov 2, 2017 at 15:52
BathshebaBathsheba
231k33 gold badges359 silver badges477 bronze badges
You have to change it in system settings, Excel takes this kind of settings from system.
answered Nov 2, 2017 at 15:42
Michał TurczynMichał Turczyn
31.7k14 gold badges45 silver badges69 bronze badges
2
I have end up with this function which does exactly what I want. Thank you all for answers, comments and hints.
Function GetVBAdecimalSep()
Dim a(0) As Variant
a(0) = 1 / 2
GetVBAdecimalSep = Mid(a(0), 2, 1)
End Function
answered Nov 2, 2017 at 15:57
Przemyslaw ReminPrzemyslaw Remin
6,09624 gold badges108 silver badges186 bronze badges
6