Хорошо, в основном у меня есть файл XSLM, содержащий около 40 тысяч строк. Мне нужно экспортировать эти строки в настраиваемый формат CSV - с разделителями ^ и ~, отмечая границы каждой ячейки. После экспорта они считываются приложением-импортером Joomla и обрабатываются в базе данных. Я нашел хороший макрос-скрипт, который делает именно это, и настроил его, чтобы использовать правильные разделители.
Sub CSVFile()
Dim SrcRg As Range
Dim CurrRow As Range
Dim CurrCell As Range
Dim CurrTextStr As String
Dim ListSep As String
Dim FName As Variant
FName = Application.GetSaveAsFilename("", "CSV File (*.csv), *.csv")
'ListSep = Application.International(xlListSeparator)
ListSep = "^" ' Use ^ as field separator.
If Selection.Cells.Count > 1 Then
Set SrcRg = Selection
Else
Set SrcRg = ActiveSheet.UsedRange
End If
Open FName For Output As #1
For Each CurrRow In SrcRg.Rows
CurrTextStr = ìî
For Each CurrCell In CurrRow.Cells
CurrTextStr = CurrTextStr & "~" & CurrCell.Value & "~" & ListSep
Next
While Right(CurrTextStr, 1) = ListSep
CurrTextStr = Left(CurrTextStr, Len(CurrTextStr) - 1)
Wend
Print #1, CurrTextStr
Next
Close #1
End Sub
Однако я обнаружил, что сгенерированные CSV слишком велики, чтобы их можно было обрабатывать с доступным временем выполнения скрипта. Я могу вручную разбить файлы примерно на 5000 строк, и это достаточно хорошо. Я бы хотел изменить приведенный выше сценарий следующим образом:
- Сохраняет строку заголовка для вставки в каждый файл.
- Спрашивает пользователя, сколько строк должно выводиться на файл.
- Добавляет -pt # к выбранному имени файла сохранения.
- Преобразует файл Excel в необходимое количество файлов CSV.
Например, если мое имя файла было выведено, номер разрыва файла был 5000, а в файле Excel было 14000 строк, я бы получил output-pt1.csv, output-pt2.csv и output-pt3.csv.
Если бы это делал только я, я бы просто продолжал ломать файлы вручную, но когда все сказано и сделано, мне нужно передать эти файлы клиенту, запускающему проект, так что чем проще, тем лучше.
Очень признателен за любые идеи.
CurrTextStr = CurrTextStr & ("~" & CurrCell.Value & "~" & ListSep
) (3) Используйте строковую функциюRight$
, а не ее более медленный вариант-кузенRight
- person brettdj   schedule 25.03.2012