使用excel到记事本时避免循环

时间:2014-04-01 17:25:53

标签: excel excel-vba notepad vba

我使用下面的代码将一些范围从excel复制到记事本。但是当我处理超过1万(100,000)个数据时它非常慢。如果不使用发送密钥方法,有没有更短的方法来实现这一点。

Sub PrintToTextFile()

Dim FileNum As Integer, cl As Range, z As Integer, y As Integer

Dim myStr As String

FileNum = FreeFile ' next free filenumber

'Open "C:\Temp\TEXTFILE.TXT" For Output As #FileNum ' creates the new file

Open "C:\temp\TEXTFILE.TXT" For Append As #FileNum

Print #FileNum, [a1]

z = 10

For Each cl In [b1:b123400]

    y = cl.Row

    If y = z Then

        myStr = myStr & "|" & cl

        'appends the input to an existing file write to the textfile

    Else: Print #FileNum, myStr

        z = cl.Row

        myStr = "": myStr = myStr & "|" & cl

    End If

Next

'appends the input to an existing file write to the textfile

Print #FileNum, myStr

Close #FileNum ' close the file

End Sub

1 个答案:

答案 0 :(得分:2)

测试和测试(1.5 Lakhs,即150,000行) - 时间为1秒

这应该更快,因为它不会循环遍历单元格并同时写入文件。它使用了数组。

Sub PrintToTextFile()
    Dim ws As Worksheet
    Dim FileNum As Integer, z As Long, y As Long, i As Long
    Dim myStr As String
    Dim Myar, ArOutput() As String

    '~~> Set this to the relevant sheet
    Set ws = ThisWorkbook.Sheets("Sheet1")

    Myar = ws.Range("b1:b123400").Value

    FileNum = FreeFile ' next free filenumber

    Open "C:\temp\TEXTFILE.TXT" For Append As #FileNum

    Print #FileNum, ws.Range("A1").Value

    z = 10

    For i = LBound(Myar) To UBound(Myar)
        If i = z Then
            myStr = myStr & "|" & Myar(i, 1)
        Else
            ReDim Preserve ArOutput(y)
            ArOutput(y) = myStr
            y = y + 1
            z = i
            myStr = "": myStr = myStr & "|" & Myar(i, 1)
        End If
    Next i

    For i = LBound(ArOutput) To UBound(ArOutput)
        Print #FileNum, ArOutput(i)
    Next i

    'appends the input to an existing file write to the textfile
    Print #FileNum, myStr
    Close #FileNum ' close the file
End Sub

<强>截图

enter image description here

用于上述测试的代码。

Sub PrintToTextFile()
    Dim ws As Worksheet
    Dim FileNum As Integer, z As Long, y As Long, i As Long
    Dim myStr As String
    Dim Myar, ArOutput() As String

    Debug.Print "Process Started at " & Now

    '~~> Set this to the relevant sheet
    Set ws = ThisWorkbook.Sheets("Sheet1")

    Myar = ws.Range("B1:B150000").Value

    FileNum = FreeFile ' next free filenumber

    Open "C:\temp1\TEXTFILE.TXT" For Output As #FileNum

    Print #FileNum, ws.Range("A1").Value

    z = 10

    For i = LBound(Myar) To UBound(Myar)
        If i = z Then
            myStr = myStr & "|" & Myar(i, 1)
        Else
            ReDim Preserve ArOutput(y)
            ArOutput(y) = myStr
            y = y + 1
            z = i
            myStr = "": myStr = myStr & "|" & Myar(i, 1)
        End If
    Next i

    For i = LBound(ArOutput) To UBound(ArOutput)
        Print #FileNum, ArOutput(i)
    Next i

    'appends the input to an existing file write to the textfile
    Print #FileNum, myStr
    Close #FileNum ' close the file

    Debug.Print "Process ended at " & Now
End Sub