принудительный формат данных Excel

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

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

Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

Добрый день, уважаемые.
Все мы знаем о "сверхпредупредительности" и "сверхуслужливости" продуктов MS, доводящих нормального пользователя до белого каления.
Вот пришлось столкнуться, не знаю как справиться.
Из внешней программы сохраняю отчет в формате *.csv (формат Excel с разделителями-запятыми). При открытии в Excel некоторая часть данных принимает формат "дата". Если теперь эти данные все же преобразовать в формат "числовой" естественно получается полная лажа. :(
Поотключал ему (Excel) уже кажется все, что можно, все автозамены и т.д., не помогает :confused:
Кто знает, как с этим можно поборотся?
Может кто уже решил эту заморочку?
Спасибо.
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
Asya
Сообщения: 110
Зарегистрирован: 06 фев 2007, 14:33
Откуда: Киев
Контактная информация:

Была обратная проблема с нераспознаванием дат в .csv - предложили:
"открыть файл .csv как текстовый (ибо, по сути, это и есть текстовый файл) указав, при этом, формат данных для нужных столбов, как дату (ДМГ). Осуществить указанное действо можно различными способами, например, как импорт текстового файла (QueryTables.Add(Connection:="TEXT;...) или воспользоваться методом OpenText" - посмотрите тут, может что-то подскажет )
Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

Asya, спасибо за ссылку.
pashulka как всегда дает нужную инфу. Буду пробовать.
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

Первые результаты неутешительны :(
вот это (код взят из примера pashulka)

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

iPath = ThisWorkbook.Path & "\"
iFileName = iPath & "отчет.csv"
     .Workbooks.OpenText Filename:=iFileName, _
     Origin:=xlWindows, StartRow:=1, DataType:=xlDelimited, _
     TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, _
     Tab:=True, Semicolon:=False, Comma:=False, Space:=False, _
     Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 4), Array(3, 4))
открывает файл действительно как обыкновенный текст. т.е. вся строка в одной ячейке, никаких разделителей. Но такого же эффекта можно добиться просто переименовав файл csv в txt
я вот с этим

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

FieldInfo:=Array(Array(1, 1), Array(2, 4), Array(3, 4)
не могу разобраться. У меня данные находятся в столбцах I,J,L.

p.s. а может можно все-таки "отучить" Excel "умничать"?
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

ViktorM, IMHO, так как csv по определению формата не содержит интерпретация данных
осуществляется только Excel по умолчанию отключить автоматическое определение типа данных нельзя. Есть несколько вариантов решения проблемы:

1) Экспортировать данные не в .csv а в .htm или .xml - это немногим сложнее но позволяет задавать формат данных в текстовом файле

2) При экспорте перед значением каждой ячейки писать ' а затем удалять его макросом
Вариант: перед импортом считывать весь сsv в строку и выполнять Replace c последующим
сохранением файла и импортом текста (потом опять же удалить лидирующие апострофы)

3) Импортировать csv c помошью собственного макроса
a) читаете в строку весь файл
b) Конвертируете строку в массив, используя split( ...,vbCrLF)
c) для каждого полученного элемента массива делаете split(...,",") и разносите элементы по ячейкам как текст

Код не привожу так как он очевиден.
Андрей Энтелис,
aentelis.livejournal.com
Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

Aent,
отключить автоматическое определение типа данных нельзя
спасибо, один вопрос снят.
А дальше...
дело в том, что я ничего не могу сделать с исходными данными. Все заложено разработчиками. Есть кнопулечка "сохранить" и предлагаются (кроме "родного" формата) *.csv и *.htm. Все.
И вот из этих условий я и пытаюсь как-то выбраться.
надо еще позаниматься с *.htm форматом.
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

ну что, *.htm сохраняет, красиво, нормально.
Но мне-то нужен формат, с которым я могу работать :( , а не просто на него смотреть...
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
Asya
Сообщения: 110
Зарегистрирован: 06 фев 2007, 14:33
Откуда: Киев
Контактная информация:

А можно глянуть на Ваш .csv файл?

FieldInfo:=Array(Array(1, 1), Array(2, 4), Array(3, 4)
"........FieldInfo, т.е. в данном примере для первого столбца устанавливается Общий формат, а для второго и третьего столбца - MDY date"

Я так поняла, что Array(номер столбца, формат данных)
Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

FieldInfo:=Array(Array(1, 1), Array(2, 4), Array(3, 4)
"........FieldInfo, т.е. в данном примере для первого столбца устанавливается Общий формат, а для второго и третьего столбца - MDY date"
это я читал и примерно так и понял. Непонятно почему вообще ничего с данными происходит. Открывается просто как *.txt
(файлик подготовлю)
***
написал

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

 FieldInfo:=Array(Array(9, 1), Array(10, 1), Array(12, 1))
для своих данных, все равно никакого результата :confused:
странно, не могу подгрузить файл :( , пишет ошибка.
не пойму, что с форумом. После переезда не могу прикрепить файлы.
ладно, тогда здесь http://narod.ru/disk/335419000/отчет.zip.html
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
Serge_Bliznykov
Сообщения: 375
Зарегистрирован: 31 авг 2007, 03:06

VictorM, мне кажется, что я знаю решение...
я дам направление для дальнейших исследований.
Откройте Excel, пустой документ, Сервис-Параметры - Международные...
снять галочку "[ ] использовать системные разделители"
в поле разделитель целой и дробной части поставьте ТОЧКУ
"Ок"
теперь Файл - Открыть - Отчёт.csv
...если всё получилось, то тот же эффект даст использование системых разделителей, но в панели управления -Язык и международные стандарты разделителем дробной части надо сделать точку...

отпишитесь о достигнутых результатах, пожалуйста.
Ответить