Заменить точку на запятую или пребразовать тип данных?

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Vaseninbox
Сообщения: 34
Зарегистрирован: 05 сен 2008, 15:11
Контактная информация:

Проблема заключена в следующем:
После копирования таблицы сделок из торгового терминала в блокнотовский файл "Test.txt", в нём остаются только два столбца, например:
Время Цена
10:59:32 160.20
11:16:32 165.48
и т.д.
Вставив эти столбцы в Excel, я оставляю только:
160.20
165.48
Тип данных этих чисел "Range"

Код: Выделить всё

'Проверил: 
MsgBox TypeName(cells(1, 1))
'Результат Range
В конечном итоге мне нужно построить график по этим значениям. Но сделать этого не получается,т.к. значения в этих ячейках Excel,похоже, не воспринимает как числовые..
Всё становится на свои места, когда точка меняется на запятую. Но количество ячеек 32000, количество столбцов более 10.
Как можно программно в каждой ячейке этого столбца поменять запятую на точку??
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

А как производится вставка?
Недавно Вы поднимали тему загрузки текстового файла на рабочий лист с разбиением по столбцам. Если разбиение по столбцам выполнять методом Range.TextToColumns, то там в параметрах можно указать, что считается десятичным разделителем.
heisnod
Сообщения: 70
Зарегистрирован: 24 ноя 2008, 16:53

Cells.Replace What:=".", Replacement:=",", LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Это запросто может непомочь.
Данные уже вставлены и ячекам скорее всего уже присвоен формат "Текстовый". Если там произвести замену, то то формат не поменяется. После замены надо этим ячекам присвоить также формат "Общий".
heisnod
Сообщения: 70
Зарегистрирован: 24 ноя 2008, 16:53

ну еще пару строчек кода=)
Vaseninbox
Сообщения: 34
Зарегистрирован: 05 сен 2008, 15:11
Контактная информация:

Сижу уже час и ничего не получается...Поджскажите как правильно работать с методом ".Replace"???
Чтобы не было недопониманий,я прикрепил 2 файла:
тупо скопировал в ексель данные и удалил из них не нужные...Что дальше-то делать?? Уже с массивом пытался завязаться-и ничего...((
Вложения
25.11.08.zip
(6.29 КБ) 51 скачивание
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Replace не помогает, как я и предполагал.
Даже не смотря на то, что формат у ячеек не текстовый, а General!

Помогает все тот же TextToColumns

Код: Выделить всё

    Columns("B:B").TextToColumns Destination:=Range("B1"), DataType:=xlDelimited, _
        Tab:=True, Semicolon:=False, Comma:=False, Space:=False, Other:=False, _
        FieldInfo:=Array(1, 1), DecimalSeparator:=".", TrailingMinusNumbers:=True
heisnod
Сообщения: 70
Зарегистрирован: 24 ноя 2008, 16:53

Ну не знаю, я проверил на этом документе свой способ, все работает. Может я упустил какую-то деталь, что вам важна.
Но конечно, Ваш метод намного правильнее в данном случае.
Vaseninbox
Сообщения: 34
Зарегистрирован: 05 сен 2008, 15:11
Контактная информация:

Ну не знаю, я проверил на этом документе свой способ, все работает.
Ну если всё получилось,не пропадать же доброму труду....Поделитесь успешным опытом,выложив файлик... ;)
А я попытаюсь обоими методами решить поставленную задачу :)
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Зачем выкладывать лишнее? :) Он же привёл уже код макроса - это одна строчка с вызовом метода Replace. См. сообщ. #3. Это все. (Также как и у меня 1 строчка)

Но дело в том, что я тоже на Вашей книге его проверял. Replace даст нестабильный результат, который зависит от версии Excel и, возможно, настроек. Например, мой Excel 2003 после Replace просто пометил все ячейки с дробными числами зелёным маркером и предлагает текст сконвертировать их числа (т.е. "ручками" по одному).

Все дело в типе Variant, который позволяет выделить память для значений различных типов и доступаться к ним ппредварительно проверяя какого они сейчас типа (см функции IsNull, IsEmpty, IsNumber и т.д.). У нас есть строковое Variant значение "123.25". Replace для текстовых значений заменяет в них символы не выполняя попыток приведения типов (что, надо заметить, логично и правильно). В результате получается "123,25".

TextToColumns поступает иначе. Он пытается взять текст "123.25", разделить его на столбцы по табуляциям (в моем примере ниже Tab:=true) (получается 1 столбец, так как табуляция в этом тексте не встречается). А затем пытается привети это к числу (не даром же там есть аргумент DecimalSeparator:="."). Если получается, то значение Variant Number сохраняется в ячейку, если не получается, то получается значание Variant String.
Ответить