Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.08.2010, 20:04   #1
budda999
Пользователь
 
Регистрация: 28.05.2009
Сообщений: 20
По умолчанию Точкой и запятая!

Есть лист, на нём импортированы данные, числа имеют такой вид: -2.320,000
-219,5

Если делать средствами Excel, "найти и заменить", то всё Ок.
Но, нужно не средствами Excel, а VBA.

Вопрос, как сделать?

Если делаю так: Cells.Replace What:=".", Replacement:="", LookAt:=xlPart, SearchOrder:= _
xlByColumns, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

то на выходе в ячейке имеем: -2320000 и -2195
?! Почему запятая потерялась?
budda999 вне форума Ответить с цитированием
Старый 17.08.2010, 20:12   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Почему запятая потерялась?
Потому что вы заменили точку What:="." на пустую строку Replacement:=""

Попробуйте так: Cells.Replace ".", ","
EducatedFool вне форума Ответить с цитированием
Старый 18.08.2010, 00:08   #3
budda999
Пользователь
 
Регистрация: 28.05.2009
Сообщений: 20
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Потому что вы заменили точку What:="." на пустую строку Replacement:=""

Попробуйте так: Cells.Replace ".", ","
Попробовал, помогло, но только на половину.
Где была запятая, там и осталась (219,5), а вот с числом 2.320,000 ничего не выходит. Выглядит по прежнему - 2320000
budda999 вне форума Ответить с цитированием
Старый 18.08.2010, 07:40   #4
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Если точка подразумевается как разделитель разрядов, а запятая - как разделитель целой и дробной части, то боюсь, что "оптом" эту задачу не решить. Предлагаю преобразовывать каждое значение отдельно. Но, при этом перебирать не все ячейки используемого диапазона, а только те, которые нас интересуют. Например, так:
Код:
Sub ConvNum()
    Dim x As Range: Application.ScreenUpdating = False
    For Each x In ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants, xlTextValues)
        If x Like "*#.#*" Then
            x = Val(Replace(x, ".", "")): x.NumberFormat = "General"
        End If
    Next
End Sub
Здесь присваивание формата необходимо для того, чтобы избежать автоматического преобразования полученных данных в формат "дата". Т.к. если это возможно, то Excel сделает это по умолчанию, чего нам совсем не нужно.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 18.08.2010, 12:34   #5
budda999
Пользователь
 
Регистрация: 28.05.2009
Сообщений: 20
По умолчанию

!!! О, круто!!!
Всё заработало!

Но, всё же есть но! Заметил, что есть такие числа: 1.883,900
После выполнения процедуры, число становится: 1883
Всё вроде бы хорошо, но почему 0,9 потерялось. ?!
Просто в дальнейшем, это числа будут обрабатываться математически.
А без сотых, итого будет отличаться

Как нить и это победить мона?

Спасибо всем заранее за помощь!!!
budda999 вне форума Ответить с цитированием
Старый 18.08.2010, 12:56   #6
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
Как нить и это победить мона?
Можно, если заменить Val() на CDbl(). При этом проигнорировав возможные ошибки. Например, так:
Код:
Sub ConvNum()
    Dim x As Range: Application.ScreenUpdating = False: On Error Resume Next
    For Each x In ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants, xlTextValues)
        If x Like "*#.#*" Then
            x = CDbl(Replace(x, ".", "")): x.NumberFormat = "General"
        End If
    Next
End Sub
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 18.08.2010, 15:05   #7
budda999
Пользователь
 
Регистрация: 28.05.2009
Сообщений: 20
По умолчанию

Спасибо огромное SAS888 и EducatedFool за помощь!!!
Все работает!

Остановился на последнем варианте от SAS888.

P.S.: Не ожидал, так быстро получить ответы! Хороший форум!
budda999 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
почему после for ставиться запятая Anett// Помощь студентам 2 24.12.2009 00:26
точка и запятая Владимир1988 Помощь студентам 2 10.11.2009 17:01
Одна запятая в поле Edit KoBRaAndrey Общие вопросы Delphi 8 18.10.2009 12:09
Константы массива (запятая и точка с запятой) IFRSoff Microsoft Office Excel 3 27.02.2009 18:11
Как проверть, есть ли в числе запятая? Look Общие вопросы C/C++ 5 06.11.2007 21:27