Автоматическое сохранение отчета в CSV формате
Модератор: Naeel Maqsudov
Девелоперы молчат, лето солнце на дворе))
Я кто то работает)))
Люди, ну подскажите а))как исправить глюк Excel?))Как программно задаются разделители строк в CSV формате?
Я кто то работает)))
Люди, ну подскажите а))как исправить глюк Excel?))Как программно задаются разделители строк в CSV формате?
- Aent
- Сообщения: 1129
- Зарегистрирован: 01 окт 2006, 14:52
- Откуда: Saratov,Russia
- Контактная информация:
Разделители строк в CSV формате отдельно программно не задаются.
LOKI-85, есть 2 пути:
1) Cохранять данные в CSV файл самой вручную в цикле обходя требуемые ячейки,
формируя csv файл в string переменной и затем записывая его как обычный текстовый файл.
2) После сохранения в CSV cохраните ещё раз ваш файл в формате xls. После чего
примените к сохранённому csv файлу описанную ранее в топике процедуру замены "," на ";".
После сохранения файла в xls формате файл с csv cохранением будет закрыт ...
Лично мне симпатичнее первый способ. Но во втором писать меньше
,
считая что convertSCV (convertCSV ?) Tеslenko EA Вам уже написал
LOKI-85, есть 2 пути:
1) Cохранять данные в CSV файл самой вручную в цикле обходя требуемые ячейки,
формируя csv файл в string переменной и затем записывая его как обычный текстовый файл.
2) После сохранения в CSV cохраните ещё раз ваш файл в формате xls. После чего
примените к сохранённому csv файлу описанную ранее в топике процедуру замены "," на ";".
После сохранения файла в xls формате файл с csv cохранением будет закрыт ...
Лично мне симпатичнее первый способ. Но во втором писать меньше

считая что convertSCV (convertCSV ?) Tеslenko EA Вам уже написал

Андрей Энтелис,
aentelis.livejournal.com
aentelis.livejournal.com
- Aent
- Сообщения: 1129
- Зарегистрирован: 01 окт 2006, 14:52
- Откуда: Saratov,Russia
- Контактная информация:
Tеslenko EA, если позволите 2 замечания:
1) Замена разделителя будет работать неправильно если в сохраняемых данных
присутствуют "," или ";". По хорошему надо парсить строку, добавляя в случае необходимости
кавычки для элемента (значения ячейки)
2) Использование FSO несколько избыточно, учитывая что EXCEL cам умеет отлично работать
с последовательными файлами. Ключевые слова: Open, Close, Get, Put.
1) Замена разделителя будет работать неправильно если в сохраняемых данных
присутствуют "," или ";". По хорошему надо парсить строку, добавляя в случае необходимости
кавычки для элемента (значения ячейки)
2) Использование FSO несколько избыточно, учитывая что EXCEL cам умеет отлично работать
с последовательными файлами. Ключевые слова: Open, Close, Get, Put.
Андрей Энтелис,
aentelis.livejournal.com
aentelis.livejournal.com
Спасибо, Aent, за ответ
суббота все таки..
Как ни пыталась осуществить предложенные вами задумки - не получается.
Метод Tеslenko EA полагаю не подходит мне, поскольку в тексте ячеек имеется строки с "," и ";", а также кавычки. ПОэтому парсить строки, если правильно поняла, уже можно с каким то другим элементом, например, "$" или что то еще в этом роде.
Предложенный вами, Aent, первый путь мне не понятен. К тому же мне незачем сохранять вручную данные в CSV формате, либо я просто не врубилась что предлагаете))
Avsha, слишком размытое объяснение.
А вообще всем спасибо огромное, конечно, но все способы такие сложные и непонятные, хотя я почему то дуала, что данная задача относится к простейшим

Как ни пыталась осуществить предложенные вами задумки - не получается.
Метод Tеslenko EA полагаю не подходит мне, поскольку в тексте ячеек имеется строки с "," и ";", а также кавычки. ПОэтому парсить строки, если правильно поняла, уже можно с каким то другим элементом, например, "$" или что то еще в этом роде.
Предложенный вами, Aent, первый путь мне не понятен. К тому же мне незачем сохранять вручную данные в CSV формате, либо я просто не врубилась что предлагаете))
Avsha, слишком размытое объяснение.
А вообще всем спасибо огромное, конечно, но все способы такие сложные и непонятные, хотя я почему то дуала, что данная задача относится к простейшим

- VictorM
- Сообщения: 794
- Зарегистрирован: 23 окт 2006, 01:44
- Откуда: Lugansk, Ukraine
- Контактная информация:
LOKI-85, а не могли бы Вы выложить хотя-бы пример сохраненного файла? Помнится в моем случае, только после того, как я выложил файл - общими усилиями было найдено решение.
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
научите их ловить рыбу - и вы накормите их на всю жизнь".
Да, пожалуйста, посмотрите!
Весь день сегодня сижу, никаких результатов!!
ВО вложении многострадальный файл.
При нажатии кнопки "Отчет о состоянии требований" выполняется соответствующий макрос.
Заранее всем благодарна хоть за какое то внимание к моей проблеме!!
Весь день сегодня сижу, никаких результатов!!
ВО вложении многострадальный файл.
При нажатии кнопки "Отчет о состоянии требований" выполняется соответствующий макрос.
Заранее всем благодарна хоть за какое то внимание к моей проблеме!!
- Вложения
-
- Ведомость требований_test.zip
- (11.94 КБ) 34 скачивания
- VictorM
- Сообщения: 794
- Зарегистрирован: 23 окт 2006, 01:44
- Откуда: Lugansk, Ukraine
- Контактная информация:
LOKI-85, а вот теперь я ничего не пойму 
выполнил Ваш код (записанный макрос) и получил, по моему, нормальный результат. Строки на месте, все вроде правильно.
Во вложении полученный *.cvs файл. Открывал блокнотом.

выполнил Ваш код (записанный макрос) и получил, по моему, нормальный результат. Строки на месте, все вроде правильно.
Во вложении полученный *.cvs файл. Открывал блокнотом.
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
научите их ловить рыбу - и вы накормите их на всю жизнь".
- Aent
- Сообщения: 1129
- Зарегистрирован: 01 окт 2006, 14:52
- Откуда: Saratov,Russia
- Контактная информация:
LOKI-85, в каком формате в CSV файле должны быть даты ?
06.07.2008 или как у вас 7/6/2008 те нужно ли передавать даты как строки?
Кодировка текста действительно win-1251, а не 866 (MS DOS) ?
To ViktorM: LOKI-85 использует csv файл для передачи данных стороннему приложению. По всей видимости этому приложению необходимо что бы текст ячеек был отделён ";" а не "," как делает Excel при выполнении из кода SaveAs
06.07.2008 или как у вас 7/6/2008 те нужно ли передавать даты как строки?
Кодировка текста действительно win-1251, а не 866 (MS DOS) ?
To ViktorM: LOKI-85 использует csv файл для передачи данных стороннему приложению. По всей видимости этому приложению необходимо что бы текст ячеек был отделён ";" а не "," как делает Excel при выполнении из кода SaveAs
Андрей Энтелис,
aentelis.livejournal.com
aentelis.livejournal.com
- VictorM
- Сообщения: 794
- Зарегистрирован: 23 окт 2006, 01:44
- Откуда: Lugansk, Ukraine
- Контактная информация:
Конечно. Я же не знаю всех требований к файлу. Я исходил из
Увы, но проблема у меня не с числами, а со строками...
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
научите их ловить рыбу - и вы накормите их на всю жизнь".
- Aent
- Сообщения: 1129
- Зарегистрирован: 01 окт 2006, 14:52
- Откуда: Saratov,Russia
- Контактная информация:
Код: Выделить всё
Sub Create_report()
ExportCSV "D:\Work\Отчет о состоянии требований.csv"
End Sub
Public Sub ExportCSV(sFile As String)
Dim f As Integer
Dim s As String
Dim sCell As String
Dim i As Long
Dim j As Long
Dim k As Long
Dim iFirstRow As Long
Dim iLastRow As Long
Dim ECL As Variant
ECL = Array(1, 3, 4, 8, 9) 'Индексы экспортируемых колонок
Const cQ As String = """"
On Error Resume Next
Kill sFile 'уничтожаем старый файл отчёта на тот случай если количество строк сократилось
f = FreeFile
Open sFile For Binary As #f
If Err.Number <> 0 Then
MsgBox "Ошибка создания файла отчёта", vbCritical, ""
Exit Sub
End If
'Предполагаем что первая колонка экспорта заполненна полностью
With ActiveSheet
k = CLng(ECL(0))
If Len(.Cells(1, k).Value) = 0 Then
iFirstRow = .Cells(1, k).End(xlDown).Row
Else
iFirstRow = 1
End If
iLastRow = .Cells(.Rows.Count, ECL(0)).End(xlUp).Row 'последняя строка нашего листа
For i = iFirstRow To iLastRow
s = vbNullString
For k = LBound(ECL) To UBound(ECL)
j = ECL(k)
sCell = Trim$(.Cells(i, j).Value)
If Len(sCell) > 0 Then
sCell = Replace(sCell, cQ, cQ & cQ) 'удваиваем присутствующие кавычки
'если нужно перекодировать текст вставляем код для перекодировки сюда
End If
'если нужно добавляем сюда условие для квотирования дат
If InStr(sCell, cQ) + InStr(sCell, " ") + InStr(sCell, ";") > 0 Then
sCell = cQ & sCell & cQ
End If
s = s & sCell
If k < UBound(ECL) Then
s = s & ";"
End If
Next k
s = s & vbCrLf
Put #f, , s
Next i
End With
Close #f
End Sub
Предполагается что в соответствии со спецификацией CSV квотирование осуществляется
парной кавычкой. На самом деле это (и представление дат) зависит от программы которой
вы намерены передать сформированный файл.
Андрей Энтелис,
aentelis.livejournal.com
aentelis.livejournal.com