Эффективный способ экспорта диапазона ячеек, охватывающих два столбца - PullRequest
0 голосов
/ 17 февраля 2020

Я новичок в VBA и внес необходимые изменения в сценарий, который нашел в Интернете. Я хочу получить значения диапазона G2:H40000 из файла Excel, в котором каждая ячейка строки отделена вкладкой, а затем сохранена в текстовом файле UTF-8.

Я проверил скрипт для диапазона G2:H12, и он работает. Но когда в нем содержится более 40 000 строк (например, G2:H40000) с каждой ячейкой в ​​столбце H, содержащей много текста, сценарий занимает столько времени, чтобы завершить sh, что мне пришлось остановить процесс более чем через час.

Как сделать так, чтобы скрипт ниже работал быстрее и эффективнее?

Sub ExportToTxt()

    Dim data As Range, row As Range, cell As Range
    Dim output As String

    Set data = Range("G2:H40000")

    For Each row In data.Rows
      For Each cell In row.Cells(1, 1) '1st param 1 excludes the table header
          output = output & cell.Value & vbTab & cell.Offset(0, 1).Value ' Offset 2nd param gets the adjacent cell to its right
      Next cell
      output = output & vbNewLine
    Next row

    ' Write to a UTF-8 encoded text file:
    Filename = "C:\Users\lenovo\Desktop\output.txt"
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set out = fso.CreateTextFile(Filename, True, True) 'Syntax: object.CreateTextFile(filename[,overwrite[,unicode]])
    out.WriteLine (output)

    out.Close

End Sub

1 Ответ

3 голосов
/ 17 февраля 2020

Попробуйте этот код, пожалуйста. Это должно быть очень быстро ...

Sub ExportToTxt()
    Dim data As Range, fso As Object, out As Object, k As Long, i As Long
    Dim output As String, arrDat As Variant, fileName As String

    Set data = Range("G2:H40000")
    arrDat = data.Value 'an array is created from the above range

    Filename = "C:\Users\lenovo\Desktop\output.txt"
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set out = fso.CreateTextFile(fileName, True, True) 'Syntax: object.CreateTextFile(filename[,overwrite[,unicode]])
        For k = 1 To UBound(arrDat, 1)
           For i = 1 To UBound(arrDat, 2)
              output = output & arrDat(k, i) & vbTab
           Next i
           'the line string is created by array row elements concatenation:
           output = left(output, Len(output) - 1)
           out.WriteLine (output): output = ""'make the output string null after writing it in the text file.
        Next k
    out.Close
End Sub

Это может быть немного проще только для двух столбцов, но оно рассчитано на то, сколько столбцов вам нужно ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...