Страница 2 из 4
Re: Автоматическое сохранение отчета в CSV формате
Добавлено: 19 июл 2008, 14:56
LOKI-85
Девелоперы молчат, лето солнце на дворе))
Я кто то работает)))
Люди, ну подскажите а))как исправить глюк Excel?))Как программно задаются разделители строк в CSV формате?
Re: Автоматическое сохранение отчета в CSV формате
Добавлено: 19 июл 2008, 16:45
Aent
Разделители строк в CSV формате отдельно программно не задаются.
LOKI-85, есть 2 пути:
1) Cохранять данные в CSV файл самой вручную в цикле обходя требуемые ячейки,
формируя csv файл в string переменной и затем записывая его как обычный текстовый файл.
2) После сохранения в CSV cохраните ещё раз ваш файл в формате xls. После чего
примените к сохранённому csv файлу описанную ранее в топике процедуру замены "," на ";".
После сохранения файла в xls формате файл с csv cохранением будет закрыт ...
Лично мне симпатичнее первый способ. Но во втором писать меньше

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

Re: Автоматическое сохранение отчета в CSV формате
Добавлено: 19 июл 2008, 16:55
Aent
Tеslenko EA, если позволите 2 замечания:
1) Замена разделителя будет работать неправильно если в сохраняемых данных
присутствуют "," или ";". По хорошему надо парсить строку, добавляя в случае необходимости
кавычки для элемента (значения ячейки)
2) Использование FSO несколько избыточно, учитывая что EXCEL cам умеет отлично работать
с последовательными файлами. Ключевые слова: Open, Close, Get, Put.
Re: Автоматическое сохранение отчета в CSV формате
Добавлено: 19 июл 2008, 19:10
LOKI-85
Спасибо,
Aent, за ответ

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

Re: Автоматическое сохранение отчета в CSV формате
Добавлено: 19 июл 2008, 19:27
VictorM
LOKI-85, а не могли бы Вы выложить хотя-бы пример сохраненного файла? Помнится в моем случае, только после того, как я выложил файл - общими усилиями было найдено решение.
Re: Автоматическое сохранение отчета в CSV формате
Добавлено: 19 июл 2008, 20:40
LOKI-85
Да, пожалуйста, посмотрите!
Весь день сегодня сижу, никаких результатов!!
ВО вложении многострадальный файл.
При нажатии кнопки "Отчет о состоянии требований" выполняется соответствующий макрос.
Заранее всем благодарна хоть за какое то внимание к моей проблеме!!
Re: Автоматическое сохранение отчета в CSV формате
Добавлено: 19 июл 2008, 22:25
VictorM
LOKI-85, а вот теперь я ничего не пойму

выполнил Ваш код (записанный макрос) и получил, по моему, нормальный результат. Строки на месте, все вроде правильно.
Во вложении полученный *.cvs файл. Открывал блокнотом.
Re: Автоматическое сохранение отчета в CSV формате
Добавлено: 19 июл 2008, 22:41
Aent
LOKI-85, в каком формате в CSV файле должны быть даты ?
06.07.2008 или как у вас 7/6/2008 те нужно ли передавать даты как строки?
Кодировка текста действительно win-1251, а не 866 (MS DOS) ?
To ViktorM: LOKI-85 использует csv файл для передачи данных стороннему приложению. По всей видимости этому приложению необходимо что бы текст ячеек был отделён ";" а не "," как делает Excel при выполнении из кода SaveAs
Re: Автоматическое сохранение отчета в CSV формате
Добавлено: 19 июл 2008, 22:53
VictorM
Конечно. Я же не знаю всех требований к файлу. Я исходил из
Увы, но проблема у меня не с числами, а со строками...
Re: Автоматическое сохранение отчета в CSV формате
Добавлено: 20 июл 2008, 01:13
Aent
Код: Выделить всё
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 квотирование осуществляется
парной кавычкой. На самом деле это (и представление дат) зависит от программы которой
вы намерены передать сформированный файл.