1

失敗することなく実行されるExcel2007のコードがあります。

  1. しかし、それは非常に非常に遅く、実行中の1〜2分間コンピュータが応答しなくなります。
  2. ファイルは約14,000kbなので、大きすぎません。

可能であれば、コンピュータをハングさせずに実行するために何ができるかを誰かに教えてもらいたいです。前もって感謝します。

Sub ReadFileIntoExcel()

Dim fPath As String
Const fsoForReading = 1
Dim readlength As Integer
Dim readstart As Integer
readlength = Worksheets("READFILE").Cells(1, "E").Value
readstart = Worksheets("READFILE").Cells(1, "D").Value
fPath = Worksheets("READFILE").Cells(1, "C").Value

Dim objFSO As Object
Dim objTextStream As Object, txt, allread, rw


Set objFSO = CreateObject("scripting.filesystemobject")
If objFSO.FileExists(fPath) Then
Set objTextStream = objFSO.OpenTextFile(fPath, fsoForReading)
rw = 1

Do Until objTextStream.AtEndOfStream
    txt = objTextStream.ReadLine
    allread = Trim(Mid(txt, readstart, readlength))
    With ActiveWorkbook.Sheets("READFILE").Cells(rw, 7).Resize(1, 1)
        .NumberFormat = "@" 'format cells as text
        .Value = Array(allread)
    End With
    rw = rw + 1
Loop

objTextStream.Close
Set objTextStream = Nothing
Set objFSO = Nothing
Exit Sub
4

2 に答える 2

3

セルごとに記述されたものではなく配列を使用するようにコードを更新したところ、すぐに実行されました

最適化が行われました

  1. セル範囲のループ、特にセルごとの書き込みは避けてください。代わりに配列を使用してください。これは大きなものです
  2. Resize(1,1)セルを単一のセルとして保持するため、何もしません
  3. Longより効率的ですInteger
  4. Mid$遅いバリアントの代替ではなく、文字列関数を使用しますMid
  5. allread変数は不要な中間ステップでした
  6. オブジェクト(つまりwsワークシート)に変数名を使用すると、参照が長くなるのを防ぐことができます

コード

Sub ReadFileIntoExcel()

Dim fPath As String
Dim ws As Worksheet
Const fsoForReading = 1
Dim readlength As Long
Dim readstart As Long
Dim rw as Long
Dim X()

Set ws = Worksheets("READFILE")
readlength = ws.Cells(1, "E").Value
readstart = ws.Cells(1, "D").Value
fPath = ws.Cells(1, "C").Value

Dim objFSO As Object
Dim objTextStream As Object


Set objFSO = CreateObject("scripting.filesystemobject")
If objFSO.FileExists(fPath) Then
Set objTextStream = objFSO.OpenTextFile(fPath, fsoForReading)
rw = 1

ReDim X(1 To 1, 1 To 1000)

Do Until objTextStream.AtEndOfStream
    txt = objTextStream.ReadLine
    If rw Mod 1000 = 0 Then ReDim Preserve X(1 To 1, 1 To UBound(X, 2) + 1000)
    X(1, rw) = Trim$(Mid$(txt, readstart, readlength))
    rw = rw + 1
Loop

ws.[G1].Resize(UBound(X, 2), 1) = Application.Transpose(X)
ws.Columns("G").NumberFormat = "@"

objTextStream.Close
Set objTextStream = Nothing
Set objFSO = Nothing
Exit Sub
End If
End Sub
于 2013-03-07T22:37:38.357 に答える
0

セルが更新されている間は、画面の更新をオフにしてみてください。あなたが非常に多くの細胞に触れているなら、これは間違いなく物事をスピードアップします。

Application.ScreenUpdating = False
...update cells...
Application.ScreenUpdating = True

計算をオフにするなど、他にもできることはありますが、設定したセルを評価しようとする数式があるようには思えません。

于 2013-03-07T19:46:38.760 に答える