Vba excel разделитель запятая

 

при замене на экране все нормально, макросом — просто убирает точки, запятые не вставляет.  
формат стоит текстовый, но пробовал и с другими.  
нашел два способа:    
1 поставить впереди апостроф — потом все меняет, но слишком муторно.  

  2 более красиво :) ставлю автозамену точки на запятую..  
 потом меняю макросом в нужном диапазоне.. точку на точку — получается запятая :)  

  как еще?

 

Меняем числа в текстовом формате с не тем разделителем дробной части на числовой формат? Или я не так понял?

 

да! правда и я мог не так понять .. :)

 

вот файл.  

  поменяйте мне точки на запятые

 

Ctrl+H, «.» на «,». Лист NEW.

 

а первый мой пост читали?  

  макросом мне надо!

 

{quote}{login=слэн}{date=27.05.2008 03:25}{thema=}{post}вот файл.  

  поменяйте мне точки на запятые{/post}{/quote}В результате должны получится числа или должен остаться текст?  
И решение зависит от используемого разделителя дробной части.  
Поменять на запятую потому что запятая Application.DecimalSeparator?

 
 

нужно макросом и с наибольшей скоростью ибо данных может быть много

 

На первый вопрос, содержащий «или», ответ «да» непонятен.  
Может так пойдет?  
   Selection.Replace What:=».», Replacement:=Application.DecimalSeparator, LookAt:=xlPart, _  
       SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _  
       ReplaceFormat:=False

 

на самом деле ответ совершенно верен :)  

  уж из текста числа я сделаю..  

  но, подчиняясь , в конечном виде нужны числа, и, значит, будем считать это ответом на первую часть вопроса, после получения которого, ответ на вторую часть будет очевиден :)

 

{quote}{login=Лузер™}{date=27.05.2008 04:03}{thema=}{post}На первый вопрос, содержащий «или», ответ «да» непонятен.  
Может так пойдет?  
   Selection.Replace What:=».», Replacement:=Application.DecimalSeparator, LookAt:=xlPart, _  
       SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _  
       ReplaceFormat:=False{/post}{/quote}  

  врят ли — но щас попробуююю

 

снимаю шляпу — работает.  

  теперь объясните разницу..    
пожалста-а-а

 

Вариант:  
‘Sub Макрос1()  
   With Range(«A1:D2»)  
       .Replace What:=»,», Replacement:=».», LookAt:=xlPart  
   End With  
End Sub

 

{quote}{login=слэн}{date=27.05.2008 04:18}{thema=}{post}снимаю шляпу — работает.  

  теперь объясните разницу..    
пожалста-а-а{/post}{/quote}А фиг его знает. Я точно знаю, что DecimalSeparator в VBA «.»  
Думаю, что VBA меняет точку на точку, имея в виду DecimalSeparator, а эксель меняет вбашный DecimalSeparator на свой.  
Плюс этого кода в независимости от региональных настроек юзера.

 

да, возможно.  

  еще раз спасибо

 

ZVI

Пользователь

Сообщений: 4328
Регистрация: 23.12.2012

—  
Application.DecimalSeparator всегда возвращает тот разделитель, который прописан в Сервис – Параметры – Международные – Разделитель целой и дробной части, даже если выбран флажок «Использовать системные разделители».  

  А символ десятичного разделителя чисел Excel зависит еще и от того, использованы ли системные разделители через меню: Сервис – Параметры – Международные — Использовать системные разделители.  

  Если не учитывать этот факт, то возможны ошибки в определении правильного знака десятичного разделителя для числовых ячеек.    

  Например:  
— системный десятичный знак – запятая;  
— в меню: Сервис – Параметры – Международные – Разделитель целой и дробной части указана точка, и при этом установлен флаг «Использовать системные разделители».  

  При этом Application.DecimalSeparator выдаст точку, а Excel-ю для числовых ячеек нужна запятая.  

  Чтобы не зависеть от подобных накладок я использую такую функцию:  

  ‘ Символ десятичного разделителя  
Function DecSep() As String  
With Application  
If .UseSystemSeparators Then  
DecSep = Mid$(CStr(0.1), 2, 1)  
Else  
DecSep = .International(xlDecimalSeparator)  
End If  
End With  
End Function  

  —  
ZVI

 

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}—  
Application.DecimalSeparator всегда возвращает тот разделитель, который прописан в Сервис – Параметры – Международные – Разделитель целой и дробной части, даже если выбран флажок «Использовать системные разделители».  

  А символ десятичного разделителя чисел Excel зависит еще и от того, использованы ли системные разделители через меню: Сервис – Параметры – Международные — Использовать системные разделители.  

  Если не учитывать этот факт, то возможны ошибки в определении правильного знака десятичного разделителя для числовых ячеек.    

  Например:  
— системный десятичный знак – запятая;  
— в меню: Сервис – Параметры – Международные – Разделитель целой и дробной части указана точка, и при этом установлен флаг «Использовать системные разделители».  

  При этом Application.DecimalSeparator выдаст точку, а Excel-ю для числовых ячеек нужна запятая.  

  Чтобы не зависеть от подобных накладок я использую такую функцию:  

  ‘ Символ десятичного разделителя  
Function DecSep() As String  
With Application  
If .UseSystemSeparators Then  
DecSep = Mid$(CStr(0.1), 2, 1)  
Else  
DecSep = .International(xlDecimalSeparator)  
End If  
End With  
End Function  

  —  
ZVI{/post}{/quote}Да. По поводу DecimalSeparator  
я ошибался.  
Сейчас провел небольшие изыскания и выяснил, что  
1. VBA всегда использует системный DecimalSeparator, хотя в коде употребляется только точка. Это понятно, т.к. запятая испоьзуется для других известных целей.  
2. Конструкция Application.International(xlDecimalSeparator) всегда корректно возвращает DecimalSeparator используемый в экселе, вне зависимости стоит галка UseSystemSeparators или нет  
3. Конструкция Mid$(CStr(0.1), 2, 1)  
всегда возвращает системый DecimalSeparator    
В приложении пример для опытов с услов. форматированием точка — красный, запятая — желтый.  
А также в модуле 2 нарытая аццкая функция для возврата системного DecimalSeparator :)  
2 слэн. Теперь думаю так: у Вас DecimalSeparator стоял точкой потому и прошло :)  
Можно тупо менять точку на точку, при этом ячейка переписывается заново, но уже с DecimalSeparator в понимании VBA  
Что характерно: Код типа Cells.Replace What:=».», Replacement:=Application.International(xlDecimalSeparator), LookAt:=xlPart, SearchOrder _  
       :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False  
работает, но корежит числа делая их текстом с «правильным» разделителем.  
Резьюм: меняем что-то на точку.

 
 

ZVI

Пользователь

Сообщений: 4328
Регистрация: 23.12.2012

{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}  
—  
Метод .Replace хоть и со странностями, но с ним то все понятно.  

  Функция DecSep() мною была приведена в развитие темы, так как звучало «и с наибольшей скоростью ибо данных может быть много». С этой функцией замена текстовых ячеек на числовые работает в 2-3 раза быстрее, чем Replace. На моем компе — примерно в 2.9 раза быстрее.  

  Для того, чтобы сравнить эффективность 2-х методов замены прилагаю файл небольшой тест-системы с подробными комментариями.  
—  
ZVI

 

ZVI, безусловно, Вы нам уже не раз доказывали, что считать массив, обработать, записать гораздо быстрее, чем непосредственная обработка экселем.  
У меня показывает преимущество метода 2 в 1.89 раза.  
Но, с учетом моего предыдущего поста, я решил проэксперементировать и закоментировал следующий код  
‘    ds = DecSep()  
‘    For Each v In x  
‘      i = InStr(1, v, «.», 0)  
‘      If i > 0 Then Mid$(v, i, 1) = ds  
‘    Next  
Т.е. реально осталось:  
   x = .Value  
   .NumberFormat = «General»  
   .Value = x  
Работает, даже если поставить разделитель дробной части «%» :)  
Можно даже так:  
   .NumberFormat = «General»  
   .Value = .Value  
Но все это работает в отношении текста с точкой.

 

ZVI, простите, но я нашел у Вас ошибку.  
Mid$(v, i, 1) = ds меняет символ только для переменной v  
массив х остается без изменений. Т.е. работает так:  
x = .Value  
.NumberFormat = «General»  
.Value = x  
А «фор ич в ин х» пустая трата времени.  
Попробуйте с    
TestString = «1,5518»  
и    
i = InStr(1, v, «,», 0)  
В результате получаем числа, но такие: 15518. Без разделителя.

 

Придумал метод 3  
Идея такая:    
Пусть TestString = «1,5518», т.е. у нас некий текст с разделителем «запятая»  
Запоминаем текущие настройки .UseSystemSeparators и .DecimalSeparator  
меняем .DecimalSeparator на запятую или тот разделитель, который был в TestString    
копируем пустую ячейку, вставляем значения со сложением.  
Возвращаем настройки на место.  
Скорость приятно удивляет даже без оптимизации кода (см. файл)  
Поправил метод 2 немного.

 

ZVI

Пользователь

Сообщений: 4328
Регистрация: 23.12.2012

{quote}{login=Лузер™}{date=29.05.2008 09:21}{thema=}{post}ZVI, простите, но я нашел у Вас ошибку.  
Mid$(v, i, 1) = ds меняет символ только для переменной v  
массив х остается без изменений. Т.е. работает так:  
x = .Value  
.NumberFormat = «General»  
.Value = x  
А «фор ич в ин х» пустая трата времени.  
Попробуйте с    
TestString = «1,5518»  
и    
i = InStr(1, v, «,», 0)  
В результате получаем числа, но такие: 15518. Без разделителя.{/post}{/quote}  
—  
Да, Вы абсолютно правы!  
Действительно, у меня получился частный случай с лишним For Next.  

  Ваша идея с манипуляцией .UseSystemSeparators и .DecimalSeparator замечательная!  
Но только и она пока, к сожалению, является частным случаем, т.к. не работает, если системный разделитель запятая — выдает 15518.  
Возможно, нужно манипулировать системым разделителем вместо Excel-ного.  

  Смогу подключиться к проблеме уже на выходных.  
—  
ZVI

 

Она не совсем не работает. Я эксперементировал с запятой и получил работающий код. На радостях выложил. Продолжил эксперименты с разделителем «%» — не работает. Вернулся к запятой, снова не работает.  
Но работает с любым разделителем, если операцию спец вставки выполнять вручную. Даже записав их макрорекордером, я получаю 15518. Хотя еще один раз у меня сработал код, но отследить и повторить не удалось. :(

 

{quote}{login=Лузер™}{date=30.05.2008 10:24}{thema=}{post}Она не совсем не работает. Я эксперементировал с запятой и получил работающий код. На радостях выложил. Продолжил эксперименты с разделителем «%» — не работает. Вернулся к запятой, снова не работает.  
Но работает с любым разделителем, если операцию спец вставки выполнять вручную. Даже записав их макрорекордером, я получаю 15518. Хотя еще один раз у меня сработал код, но отследить и повторить не удалось. :({/post}{/quote}  

  вот-вот :)  

  но ваш первый код работает(у меня) без проблем.(это с replace и decimalseparator)  

  вообще мне нужно было:  
разархивировать файл  
получившийся текстовый файл загрузить в иксель(я загружаю с установкой столбцов в тесктовый формат, хотя тут и можно поиграть с сепаратором)  
вырезать из этого массива нужные данные(по двум параметрам)  
заменить точку на запятую  
преобразовать в числовой формат  
вставить в таблицу  

  файлов может быть до 1000  
строк в каждом до 20000  

  в конечной таблице строк до 800 000  

  сейчас работаю с 60 000 строк основной таблицы — для этого требуется обработать около 40 файлов — на генерацию таблицы уходит 27сек

 

Если есть возможность занести значения в эксель как текст с точкой (если установленный разделитель запятая то любые цифры разделённые точкой воспринимаются общим форматом как текст)  
для активного листа  
Sub USNumbers()  
  Application.ScreenUpdating = False  
  Application.Calculation = xlCalculationManual  
  Dim cell As Range  
  On Error Resume Next  
  For Each cell In ActiveSheet.Cells.SpecialCells(xlConstants, xlTextValues)  
     On Error Resume Next  
     cell.Value = Val(cell.Value)  
     On Error GoTo 0  
  Next cell  
  Application.Calculation = xlCalculationAutomatic  
  Application.ScreenUpdating = True  
End Sub  

  ‘функция вал работает только с us-строками  
‘aeyrwbz свид, тьфу cdbl работает с региональными стандартами, то бишь запятой

 

ZVI

Пользователь

Сообщений: 4328
Регистрация: 23.12.2012

{quote}{login=dl}{date=02.06.2008 08:40}{thema=val  и cdbl}{post}Если есть возможность занести значения в эксель как текст с точкой (если установленный разделитель запятая то любые цифры разделённые точкой воспринимаются общим форматом как текст)  
для активного листа  
Sub USNumbers()  
  Application.ScreenUpdating = False  
  Application.Calculation = xlCalculationManual  
  Dim cell As Range  
  On Error Resume Next  
  For Each cell In ActiveSheet.Cells.SpecialCells(xlConstants, xlTextValues)  
     On Error Resume Next  
     cell.Value = Val(cell.Value)  
     On Error GoTo 0  
  Next cell  
  Application.Calculation = xlCalculationAutomatic  
  Application.ScreenUpdating = True  
End Sub  

  ‘функция вал работает только с us-строками  
‘aeyrwbz свид, тьфу cdbl работает с региональными стандартами, то бишь запятой{/post}{/quote}  
—  
Верно, но это в 4 раза медленнее, чем модифицированный Лузером™ вариант 2.  
С учетом уточненой Слэном задачи (наверное, уже и выполненной), эффективнее, пожалуй, было бы считать весь текстовый файл в переменную, произвести в этой переменной замену точки на запятую, и затем с помощью .TextToColumns скопировать в ячейки как числа.  
Или, не мудрствуя, использовать исходный вариант 2 без For Next, так как речь идет о преобразовании точки в запятую, а не наоборот  
—  
ZVI

 

слэн

Гость

#30

05.06.2008 14:51:16

«спешу» предоставить уважаемому сообществу третий способ преобразования, еще более быстрый..  
благодаря предоставленному ZVI тесту, мне не пришлось себя утруждать :)  
см вложение  

  ps мне этот способ не понадобился  — я обошелся вообще без преобразования(вернее оно выполняется встроенными средствами иксель при открытии текстового файла). Надо конечно попробовать упомянутый ZVI способ чтения файла в переменную..

Прикрепленные файлы

  • post_19474.rar (13.8 КБ)

При работе с 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) сохраняет значение «Коричневый» и так далее.

В этом примере мы указали только первый аргумент — текст, который нужно разделить. Поскольку разделитель не указан, в качестве разделителя по умолчанию используется пробел.

Важная заметка:

  1. Функция VBA SPLIT возвращает массив, который начинается с базы 0.
  2. Когда результат функции 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

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Совсем маленький «зацеп». Несколько лет назад все работало как положено. А сегодня перестало.
Точку на запятую меняет. Все в порядке. По тексту:

Visual Basic
1
2
3
4
        sB = Application.ActiveWorkbook.ActiveSheet.Cells(iI, iJ).Value
        If sB = "" Or sB = " " Then sB = "0"
        sB = Replace(sB, ",", ".", , , 1)
        Application.ActiveWorkbook.Worksheets(1).Cells(iI, iJ) = Val(sB)

А вот обратно:

Visual Basic
1
2
3
4
        sB = Str(Application.ActiveWorkbook.ActiveSheet.Cells(iI, iJ).Value)
        If sB = "" Or sB = " " Then sB = "0"
        sB = Replace(sB, ".", ",", , , 1)
        Application.ActiveWorkbook.Worksheets(1).Cells(iI, iJ) = sB

запятая остается. Только содержимое ячейки переводит в текстовый формат, но запятая без изменении. Пробовал предварительно форматировать в текстовый, но ничего. Создается впечатление, где-то в 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 разделитель — запятая, то для того, чтобы была поставлена точка, ячейку обязательно предварительно нужно перевести в текстовый формат:

VB.NET
1
2
        Cells(iI, iJ).Select
        Selection.NumberFormat = "@"



0



Burk

1813 / 1135 / 346

Регистрация: 11.07.2014

Сообщений: 4,002

10.12.2018, 05:40

4

A_Qz,

Цитата
Сообщение от A_Qz
Посмотреть сообщение

Excel разделитель — запятая, то для того, чтобы была поставлена точка, ячейку обязательно предварительно нужно перевести в текстовый формат:

Так надо поставить разделитель — точку и всё работает, привожу макросы, на которых проверял

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub From()
'Dim sB As String
        sB = Application.ActiveWorkbook.ActiveSheet.Cells(1, 1).Value
        If sB = "" Or sB = " " Then sB = "0"
        sB = Replace(sB, ",", ".", , , 1)
        Worksheets(1).Cells(1, 1) = Val(sB)
End Sub
 
Sub From2()
        sB = Str(Application.ActiveWorkbook.ActiveSheet.Cells(1, 1).Value)
        If sB = "" Or sB = " " Then sB = "0"
        sB = Replace(sB, ".", ",", , , 1)
        Application.ActiveWorkbook.Worksheets(1).Cells(1, 1) = Val(sB)
End Sub

Добавлено через 24 минуты
A_Qz, что-то ошибся (точка на запятую), плохо проверил, а вот так вроде работает

Visual Basic
1
2
3
4
5
6
7
Sub From2()
        Dim sB As String
        sB = Application.ActiveWorkbook.ActiveSheet.Cells(1, 1).Value
        If sB = "" Or sB = " " Then sB = "0"
        sB = Replace(sB, ".", ",", , , 1)
        Application.ActiveWorkbook.Worksheets(1).Cells(1, 1) = sB
End Sub



0



A_Qz

31 / 8 / 4

Регистрация: 21.01.2018

Сообщений: 53

10.12.2018, 18:40

 [ТС]

5

Это все понятно. Но мне нужно было, что бы при разделителе — запятая, сохранялась после замены точка. С тем, что бы я мог этот файл экспортировать в другие программы, где разделитель — точка. Ход действий был такой: убрал галку «Использовать системные разделители» и поправил код

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
          Cells.Select
          Selection.NumberFormat = "@"
          For iI = 1 To iR
            For iJ = 1 To iC
              sB = CStr(Workbooks.Application.Selection.Cells(iI, iJ))
              sB = Replace(sB, ",", ".", 1, -1, 1)
              Workbooks.Application.Selection.Cells(iI, iJ) = sB
            Next iJ
          Next iI
        End If
        Selection.NumberFormat = "General"
        Cells(1, 1).Select

В этом коде все работает так, как мне надо. sB была определена как String ранее.
При смене точки на запятую код такой:

VB.NET
1
2
3
4
5
6
7
8
9
          Cells.Select
          Selection.NumberFormat = "General"
          For iI = 1 To iR
            For iJ = 1 To iC
              sB = Workbooks.Application.Selection.Cells(iI, iJ)
              If sB = "" Or sB = " " Then Workbooks.Application.Selection.Cells(iI, iJ) = "0"
              Workbooks.Application.Selection.Cells(iI, iJ) = Workbooks.Application.Selection.Cells(iI, iJ).Value
            Next iJ
          Next iI

Спасибо ещё раз.



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?

enter image description here

Community's user avatar

asked Nov 2, 2017 at 15:40

Przemyslaw Remin's user avatar

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

Bathsheba's user avatar

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ł Turczyn's user avatar

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 Remin's user avatar

Przemyslaw ReminPrzemyslaw Remin

6,09624 gold badges108 silver badges186 bronze badges

6

Понравилась статья? Поделить с друзьями:
  • Vba excel разделитель групп разрядов
  • Vba excel разбить ячейки в excel
  • Vba excel разбить строку по символу
  • Vba excel разбить строку по разделителям
  • Vba excel разбить строку на массив