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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2015, 10:46   #1
27102014
Форумчанин
 
Регистрация: 27.10.2014
Сообщений: 248
По умолчанию Разделитель дробной части

всем доброго времени суток!
Прошу подсказать как решить проблему
Суть - нужно использовать в качестве разделителя дробной части точку, меняю либо в настройках, либо событие при открытии книги
Код:
Private Sub Workbook_Open()
Application.DecimalSeparator = "."
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.DecimalSeparator = ","
End Sub
Визуально все меняется, в ячейке действительно "1.25", а не "1,25"
Значение из ячейки требуется подтянуть в документ xml, формируймый макросом из excel, и вот туда ставится "1,25", т.е. системным разделителем является запятая не смотря на настройки

решил проблему так (мне нужен 1 знак после запятой)

Код:
      
 f = Val(Range("A1"))
 d = (Round(Range("A1") - f, 1)) * 10
 Нужное_число = f & "." & d
но данный способ не подойдет, например, для числа 0,98

что еще можно придумать? лучше было бы конечно что-то поменять в настройках, у меня 2010 офис, поиск в интернете прямого ответа не дал, только то, что я описал в начале
27102014 вне форума Ответить с цитированием
Старый 28.10.2015, 10:57   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вариант 1. поменять глобально в настройках Windows

вариант 2. задать руками в настройках MS Excel - "Файл" - "Параметры Excel" - "Дополнительно"
убрать галочку с "Использовать системные разделители" и задать нужный вручную

вариант 3. исправить скрипт выгрузки данных в XML

вариант 4. обработать готовый XML файл после выгрузки


p.s.
ничего не проверял.
каждый из вариантов имеет свои достоинства и недостатки. выбирать исходя из конкретных условий.


добавлено.
ваш код лучше не использовать.
на крайний случай можете попробовать такой "хак"
Код:
  f = 1 / 3
  Need = Replace(CStr(f), ",", ".")
  MsgBox "Число: " & Need

Последний раз редактировалось Serge_Bliznykov; 28.10.2015 в 11:08.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.10.2015, 11:16   #3
27102014
Форумчанин
 
Регистрация: 27.10.2014
Сообщений: 248
По умолчанию

Сергей, спасибо!
Вариант 1 - нет полномочий
Вариант 2 - пробовал, не помогло
Вариант 3 - тут вроде все нормально
Вариант 4 - возможно, не могли бы дать ссылку на пример?
27102014 вне форума Ответить с цитированием
Старый 28.10.2015, 11:59   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Вариант 3 - тут вроде все нормально
лучше покажите этот скрипт для выгрузки.
Имхо, проще его поправить.

Цитата:
Вариант 4 - возможно, не могли бы дать ссылку на пример?
пример нужно искать/писать.
Но плохо не это, плохо то, что непонятно, какие данные у Вас могут быть в XML
допустим, там могут быть строки, содержащие запятые. Их тоже заменять на точки? Универсальное решение не факт, что возможно.
Нужно брать реальные XML файлы и на них тестировать
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.10.2015, 12:09   #5
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

до полного удовлетворения

а для чего нужен этот "XML"?
чтобы глазами пробежаться? тогда какая разница что там написано 19.25 или 19,25
в любом случае совершенно не задумываясь по контексту человеческий мозг отличит:
что 19. - это не конец предложения, а 25 не начало нового, а это одно число 19 целых 25 сотых
что 19,25 это не два числа 19 и 25, а одно 19 целых 25 сотых

Regular Expression - это тот инструмент, который позволит 3-мя строками решить задачу
1. создать обьект
2. указать маску
3. заменить в тексте
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете

Последний раз редактировалось IgorGO; 28.10.2015 в 12:31.
IgorGO вне форума Ответить с цитированием
Старый 28.10.2015, 13:09   #6
27102014
Форумчанин
 
Регистрация: 27.10.2014
Сообщений: 248
По умолчанию

XML - это стандартный бланк отчетности, который предоставляется через программу с ЭЦП
В Excel происходит расчет данных, и чтобы не перебивать руками, написал макрос
Данными будут только цифры - "10,12" и "10,1225648" - отличаются только количеством знаков после запятой

макрос довольно большой, место где берутся данные из Excel
Код:
Set objcol = objDoc.createElement("col")
objcol.setAttribute "code", "1"
objcol.Text = Range("A1")
objrow.appendChild objcol
27102014 вне форума Ответить с цитированием
Старый 28.10.2015, 17:40   #7
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Код:
objcol.Text = Range("A1").formula 'если в ячейках только константы
'или
objcol.Text = trim(str(Range("A1")))
'или
objcol.Text = replace(Range("A1"),",",".")
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 30.10.2015, 08:52   #8
Virtuallab
Пользователь
 
Регистрация: 03.08.2012
Сообщений: 38
По умолчанию

Уважаемый ТС!
Из Ваших сообщений неясно, как и что читает формируемый XMl. Т.е., заточен ли он на чтение строчного значения с точкой в качестве интерпретируемого децимального знака (именно "1.25" , а не "1,25")? Не исключаю, что это ни как не документировано и определить (предположить) это можно только с помощью научного метода тыка.
По второму коду из первого поста: round("1.25",1) и round ("1,25",1) дадут один и тот же результат.
Если Вы в дальнейшем для передачи в XML используете функцию Str, то следует помнить, что 0,98 преобразуется в ".98", что можно подправить чем-то вроде Format(str(round(range("A!1",1)))," 0.0")
И!
Serge_Blyznikov писал:
Цитата:
лучше покажите этот скрипт для выгрузки.
Подозреваю, что именно это поможет разобраться с Вашим вопросом.
Virtuallab вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разделитель дробной части userrrr C# (си шарп) 24 02.10.2015 06:33
Разделитель целой и дробной части IgorGO Microsoft Office Excel 3 25.11.2012 11:08
Разделитель целой и дробной части. gusluk Общие вопросы Delphi 2 12.11.2008 08:45
Разделитель целой и дробной части neugadal Microsoft Office Excel 3 09.10.2008 07:20
Задать разделитель дробной части Taurus Win Api 1 04.09.2007 08:20