2015-08-13 2 views
0

Мне нужно создать строку CSV с пользовательским разделителем из рабочей книги.Лист в CSV с пользовательским разделителем?

Я написал эту функцию, которая делает трюк, но проблема заключается в том пробегает по строкам происходит слишком медленно:

Public Function CSVStringFromWB(wb As Workbook, FieldTerminator As String) As String 
    Dim Line As String 
    Dim r As Long 
    Dim ColsCount As Long 
    Dim RowsCount As Long 
    ColsCount = wb.Sheets(1).UsedRange.Columns.Count 
    RowsCount = wb.Sheets(1).UsedRange.Rows.Count 
    With wb.Sheets(1) 
     For r = 1 To RowsCount 
      Line = Join(Application.Transpose(Application.Transpose(.Range(.Cells(r, 1), .Cells(r, ColsCount)).Value)), FieldTerminator) 
      CSVStringFromWB = CSVStringFromWB + Line + vbNewLine 
     Next r 
    End With 
End Function 

Есть ли более быстрых альтернативы для создания преобразования диапазона в строку CSV с пользовательским разделителем?

+0

http://www.howtogeek.com/howto/21456/export-or-save-excel-files-with-pipe -или-другие-разделители-вместо-запятые/могут представлять интерес. – pnuts

ответ

1

Это примерно в 20 раз быстрее (используя 6k строки х 20 Cols)

Public Function FasterCSVStringFromWB(wb As Workbook, _ 
             FieldSep As String) As String 
    Dim data, lines() As String, line As String, sep As String 
    Dim ColsCount As Long, r As Long, c As Long 
    Dim RowsCount As Long 

    data = wb.Sheets(1).UsedRange.Value 
    ColsCount = UBound(data, 2) 
    RowsCount = UBound(data, 1) 
    ReDim lines(1 To RowsCount) 

    For r = 1 To RowsCount 
     sep = "" 
     line = "" 
     For c = 1 To ColsCount 
      line = line & sep & data(r, c) 
      If c = 1 Then sep = FieldSep 
     Next c 
     lines(r) = line 
    Next r 

    FasterCSVStringFromWB = Join(lines, vbNewLine) 
End Function 
+0

Я думаю, что это может быть еще быстрее в моих тестах. большое спасибо – lisovaccaro

0

Чтение всей ячейки листа Excel по ячейке происходит медленно. Если вы можете, сохраните желаемые строки/cols excel в виде отдельного файла csv, а затем напишите отдельную небольшую программу, чтобы изменить запятую в csv на что-то другое.

Если вам нужно пройти весь лист excel с помощью vba, то то, что вы сделали, возможно, является единственным способом.

Если вам нужно иметь дело с большим количеством файлов excel, попробуйте скопировать строки/столбцы, которые вы хотите, затем вставьте в новый рабочий лист, затем сохраните рабочий лист как csv, а затем измените разделитель.