Ошибка при замене точки на запятую

 

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

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

Сообщений: 4339
Регистрация: 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

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

Сообщений: 4339
Регистрация: 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

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

Сообщений: 4339
Регистрация: 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

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

Сообщений: 4339
Регистрация: 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 КБ)

Не меняется точка на запятую

Бахтиёр

Дата: Пятница, 19.08.2016, 11:01 |
Сообщение № 1

Группа: Пользователи

Ранг: Прохожий

Сообщений: 2


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Добрый день.
Пишу в ячейки 850.954 и 110.210
Выделяю эти ячейки.
Главная — Найти и выделить — Заменить
Заменяю точку на запятую.
Нормально поменялось.

Пишу в другие ячейки 850.954 и 110.210
Выделяю эти ячейки.
Выполняю в окне Immediate Selection.Replace «.», «,»
Вместо того, чтобы заменять, он просто убирает точку.

Подскажите, почему так?

P.S. Это происходит в любой книге, в том числе вновь созданной.
В настройках разделитель копеек — запятая, разделитель разрядов — пробел
Excel 2013, Windows 7

Сообщение отредактировал БахтиёрПятница, 19.08.2016, 11:06

 

Ответить

buchlotnik

Дата: Пятница, 19.08.2016, 11:25 |
Сообщение № 2

Группа: Заблокированные

Ранг: Участник клуба

Сообщений: 3442


Репутация:

929

±

Замечаний:
20% ±


2010, 2013, 2016 RUS / ENG

он не точку убирает, а заменяет её на пробел. Потому что для VBA — запятая — это разделитель тысяч, вот и получается, что при Replace формируется 850,954 которые он воспринимает как 850 тысяч и 954, поэтому на лист выгружает с учётом региональных настроек 850 954

программно замену можно сделать так:
[vba]

Код

Sub n()
For Each c In Selection
c.Value = c.Value
Next
End Sub

[/vba]

Сообщение отредактировал buchlotnikПятница, 19.08.2016, 11:37

 

Ответить

Бахтиёр

Дата: Пятница, 19.08.2016, 11:44 |
Сообщение № 3

Группа: Пользователи

Ранг: Прохожий

Сообщений: 2


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

buchlotnik, спасибо, понял.
850.954
Попробовал Selection.Replace «.», «.»
VBA находя точку заменил его на точку, получилось тоже самое, но при выгрузке на лист (так как точка в VBA — это разделитель копеек) с учётом региональных настроек выгрузил 850,954
:)

Насчёт вашего кода, ИМХО, для скорости лучше так:
[vba]

Код

Sub n()
For Each x In Selection.Areas
x.Value = x.Value
Next
End Sub

[/vba]

 

Ответить

sboy

Дата: Пятница, 19.08.2016, 11:51 |
Сообщение № 4

Группа: Друзья

Ранг: Участник клуба

Сообщений: 2566


Репутация:

724

±

Замечаний:
0% ±


Excel 2010

Добрый день.
У меня вот такой код замены точек на запятую
[vba]

Код

Selection.Replace What:=».», Replacement:=»,», LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False

[/vba]


Яндекс: 410016850021169

 

Ответить

buchlotnik

Дата: Пятница, 19.08.2016, 12:08 |
Сообщение № 5

Группа: Заблокированные

Ранг: Участник клуба

Сообщений: 3442


Репутация:

929

±

Замечаний:
20% ±


2010, 2013, 2016 RUS / ENG

sboy, ваш код в русских локалях даёт 850 954

 

Ответить

sboy

Дата: Пятница, 19.08.2016, 12:28 |
Сообщение № 6

Группа: Друзья

Ранг: Участник клуба

Сообщений: 2566


Репутация:

724

±

Замечаний:
0% ±


Excel 2010

buchlotnik, так вроде русская у меня %)


Яндекс: 410016850021169

 

Ответить

I have this number format :

39289.95

And i want it to look like :

39289,95

My problem is that if i use :

str_replace('.', ',', $data)

or

strtr($data, '.', ',')

or

number_format($data, 2, ',', '')

I get

39289.00

I tried to cast the variable in string before using str function but no luck it always give me a ‘dot’ and 2 zeros at the end. How can i format my data to look like 39289,95 ?

Note that the data is coming from a odbc plugin, but i don’t think it change anything. It does seems like an easy problem but all i tried was ‘supposed’ to work as i searched in many forum and stackoverflow questions but mine doesn’t.
Thank you.

EDIT(full code):

while (odbc_fetch_row($r)) {


  printf("<tr class='ter%s' >",trim(odbc_result($r,1)));

  printf("<td> %s</td>",odbc_result($r,1));


  $data = odbc_result($r,2);

  $str = preg_replace('/./', ',', $data);
  //$data = number_format($data, 2, '.', '');
  //$data = strtr($data, ".", ",");
  //$data = str_replace('.',',',$data);
  printf("<td align=right> %6.2f</td>",$str);

  echo "</tr>n";
}
 }

Точка вместо запятой дробных чисел может привести к существенным последствиям при расчетах в программе Excel. Чаще всего такие ошибки случаются, когда импортируются данные в таблицу из других источников.

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

Как в Excel заменить точку, на запятую?

Выделите и скопируйте данные из ниже приведенной таблицы:

№ п/п Валютная пара Пересчет Продажа Покупка Спрэд
1 EUR/USD 1 1.1347 1.1350 0.0003
2 GBP/USD 1 1.5438 1.5442 0.0004
3 USD/CHF 1 0.9543 0.9547 0.0004
4 USD/JPY 100 1.1948 1.1945 -0.0003

Теперь перейдите на рабочий лист и щелкните правой кнопкой мышки по ячейке A1. Из появившегося контекстного меню выберите опцию «Специальная вставка». В диалоговом окне выберите «Текст в кодировке Unicode» и нажмите ОК.

Текст в кодировке Unicode.Изменение шрифта по умолчанию.

Как видно Excel распознает числа только в колонке C. Значения в этой колонке выровнены по правой стороне. В других колонках по левому краю. Во всех ячейках формат по умолчанию «Общий», а в ячейках D3, D5, E3, E5 вообще отображается формат «Дата». Мы копировали данные через специальную вставку и все форматы исходной таблицы устранены. Причина только одна – вместо запятой стоит точка. Такой тип данных не подготовлен и его нельзя использовать для вычислений.

Примечание. Если копировать данные из других источников без специальной вставки, то вместе с данными копируется и формат. В таком случаи формат ячеек «Общий» (по умолчанию) может быть изменен. Тогда нельзя визуально отличить, где распознано число, а где текст.

Все последующие действия необходимо выполнять с чистого листа. Удалите все, что есть на листе или откройте новый для дальнейшей работы.

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



Способ 1 замена точки на запятую в Excel через Блокнот

Программа Блокнот Windows не требует использования сложных настроек и функций, а лишь выступает посредником в копировании и предварительной подготовки данных.

  1. Скопируйте данные из исходной таблички на этой странице. Откройте программу Блокнот Windows («Пуск»-«Все программы»-«Стандартные»-«Блокнот») и вставьте в него скопированные данные для подготовки.
  2. Вставка в Блокнот.

  3. Выберите в меню «Правка» опцию «Заменить» (или комбинацию горячих клавиш CTRL+H). В появившимся диалоговом окне, введите в поле: «Что» точку (.), а в поле «Чем» запятую (,). И нажмите кнопку «Заменить все».

Заменить все и резултат.

Программа Блокнот заменила все точки, на запятые. Теперь данные готовы для копирования и вставки на лист.

Готово.

Это весьма простой, но очень эффективный способ.

Способ 2 временно меняем настройки Excel

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

Для этого нужно открыть «Файл»-«Параметры»-«Дополнительно». В разделе «Параметры правки» следует временно убрать галочку «Использовать системные разделители». А в поле «Разделитель целой и дробной части» следует удалить запятую и ввести точку.

Разделитель целой и дробной части.

После выполнения вычислений настоятельно рекомендуется вернуть настройки по умолчанию.

Внимание! Данный способ сработает, если сделать все изменения до импорта данных, а не после.

Способ 3 временно меняем системные настройки Windows

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

Открываем «Пуск»-«Панель управления»-«Языки и региональные стандарты». Нажимаем на кнопку «Дополнительно». В появившимся окне изменяем в первом поле «Разделитель целой и дробной части» — вводим нужное нам значение. Дальше ОК и ОК.

Настройка формата в Windows.

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

Способ 4 используем функцию найти и заменить в Excel.

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

В этом способе, в отличие от выше приведенных, мы сначала вставляем скопированную табличку на чистый лист, а потом подготавливаем ее к выполнению вычислений и расчетов.

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

  1. Предварительно выделите столбцы где будут находится дробные числа с точкой в качестве разделителя. В данном случаи это 3 столбца D:F.
  2. Установите для выделенного диапазона текстовый формат ячеек, чтобы заранее избежать автоматического преобразования в формат даты некоторых чисел. Для этого выберите текстовый формат из выпадающего списка на закладке «Главная» в разделе «Число». Или нажмите CTRL+1 , в появившимся окне «Формат ячеек» выберите закладку «Число», а в разделе «Числовые форматы» укажите «Текстовый».
  3. Задать текстовый формат ячеек.

  4. Скопируйте таблицу и щелкните правой кнопкой мышки по ячейке A1. Из контекстного меню выберите опцию «Специальная вставка». Выберите «Текст в кодировке Unicode» и нажмите ОК. Обратите внимание, как теперь отображаются значения в ячейках: D3, D5, E3, E5, в отличии от самого первого копирования таблицы.
  5. Вставка таблицы.

  6. Нажмите на инструмент «Главная»-«Найти и выделить»-«Заменить» (или нажмите комбинацию CTRL+H).
  7. Найти и заменить в Excel.

  8. В появившемся окне введите в поле «Найти» — точку, а в во второе поле введите запятую. И нажмите «Заменить все».
  9. Снова выделите 3 столбца D:F и измените формат ячеек на «Числовой» CTRL+SHIFT+1. Не забудьте увеличить разрядность до 4-х, как описано в пункте №2.

Результат замены.

Все точки сменились на запятые. А текст автоматически преобразился в число.

Вместо 4-го и 5-го пункта можно использовать в отдельной колонке формулу с функциями:

Например, выделите диапазон ячеек G2:I5, введите эту формулу и нажмите CTRL+Enter. А потом переместите значения ячеек диапазона G2:I5 в диапазон D2:F5.

Эта формула находит в тексте точку с помощью функции НАЙТИ. Потом вторая функция меняет ее на запятую. А функция ЗНАЧЕН преобразует полученный результат в число.

Нет ошибки. в VBA разделитель целой и дробной части — точка, на листе Excel в русской локали — запятая. При вставке на лист числа разделитель автоматически преобразуется в нужный.

Значение типа 43.64.78 — текст, в нем нет разделителя числовых данных, точка — часть текста, поэтому при вставке на лист символы не подменяются.

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

 to.Cells[1, 1].Value = "'43.64";

апостроф слева сигнализирует, что после него текст. В ячейке апостроф не отображается.

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