. и , при вставке в ячейку

Программирование на Visual Basic for Applications
Wasup!
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 21.06.2005 (Вт) 11:09

. и , при вставке в ячейку

Сообщение Wasup! » 27.11.2006 (Пн) 1:12

Встретился с некоторой особенностью. При вставке в ячейку строки с числом, Excel вне зависимости от локальных настроек считает "." разделителем дробной части, а "," разделителем групп разрядов.
1) Это всегда так? Для любой версии Excel?
Такое поведение значимо при работе с БД, когда числа в запросе возвращаются как to_char().
Например: из БД (Oracle) нужно получить число с точностью большей чем double. Делается to_char() получается строка "1234567890,123456789" Excel видит "," и преобразует эту строку в число 123 456 789 012 345 выставляя для ячейки числовой формат. То есть результат получается не просто округленным, а совсем не верным. Без to_char все работет нормально, но теряется точность.

WinXp Prof Sp2, Excel 2000

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 27.11.2006 (Пн) 4:22

Как вставляешь?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Сообщение HandKot » 27.11.2006 (Пн) 10:15

Wasup!
посмотрите в настройках Excel
вкладка "Международные"
галочка "использовать системные разделители"
I Have Nine Lives You Have One Only
THINK!

Wasup!
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 21.06.2005 (Вт) 11:09

Сообщение Wasup! » 27.11.2006 (Пн) 10:15

cells(i,j)=rs.fields(i)

Аналогичный результат наблюдается:
Cells(1, 1) = "12345.678" - будет вставлено число 12345.678
Cells(2, 1) = "12345,678" - будет вставлено число 12 345 678

в региональных настройках разделитель целой и дробной частей ",", разделитель групп разрядов " ".

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 27.11.2006 (Пн) 12:03

Думаю, правильно. Value пишется на языке кода, как и formula. Намано.

Если полученная строка соответствует текущим назиональным настройкам компа, то юзай просто CDbl().
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Wasup!
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 21.06.2005 (Вт) 11:09

Сообщение Wasup! » 28.11.2006 (Вт) 17:57

посмотрите в настройках Excel
вкладка "Международные"
галочка "использовать системные разделители"

К сожалению, такую настройку найти не смог. Excel 2000

Если я правильно понял, тогда единственный способ правильно передать число большой разрядности, это to_char() и явно выставлять текстовый формат ячейки?

Wasup!
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 21.06.2005 (Вт) 11:09

Сообщение Wasup! » 06.12.2006 (Ср) 11:53

В продолжении темы.
Обнаружил, что в зависимости от того как на лист вставлаются данные из recordset`а, результат может отличаться.
Если из базы данных передается число в строковом представлении, to_char(), например "12345,6789" то разные способы вставки приводят к разным результатам:

Код: Выделить всё
cells(i,j)=СStr(rs.Fields(i))
cells(i,j)=rs.Fields(i).Value
cells(i,j)=rs.Fields(i)
cells(i,j)=rs(i)

'rs.field имеет тип adVarChar


Для первых двух случаев запятая в числе воспринимается, как разделитель групп разрядов и в ячейку вставляется 123 456 789.00 формат ячейки становится "числовой". Сюдя по написанному выше так и должно быть.
В последующих случаях эта запятая никак не воспринималась Excel`ем и в ячейку вставлялось
12345,6789 формат ячеки "общий".
Кто-то может пояснить почему rs(i) и rs.Fields(i).Value не одно и то же?


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 80

    TopList