

logファイル（7～8万行程度）を読み込み、A列に空白があった場合に、  
その列を削除する処理ですが、この処理だけでも  
3～5分程度かかってしまいます。  
Excelの処理では、7～8万行の処理では、このぐらいの時間がかかって  
しまうものなのでしょうか？

PCのスペックは、Win10pro core i7 メモリ16GBです。

[code]

    Sub test()
        Dim txtPath As String
        Dim TmpMaxRow As Long
        
        txtPath = "C:\sample.log"
        
        Workbooks.OpenText Filename:=txtPath, _
            DataType:=xlDelimited, _
            Tab:=True, _
            Space:=True
        
    'A列に空白行があった場合は、その列を削除
        TmpMaxRow = Cells(Rows.Count, "A").End(xlUp).Row
        Range("A1:A" & TmpMaxRow).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    end sub
    
[/code]


CC BY-SA 4.0
2022-08-20T06:23:48.457
90643
2022-08-20T16:24:41.510
question
vba excel
VBA（Excel）の処理速度について


Excelのセルの操作はCPUとメモリへの負荷が大きいオペレーションですので、どうしても重くなりがちです。小手先のテクニックとしては「再計算を手動にする」「画面の再描画をオフにする」などがありますが、効果は限られます。本質的な解決としては、Excelのセルにデータを書き出す前に、不要な行の削除などできる限りの処理を行っておくべきです。

方法としては、たとえばADOでテキストファイルをSQLテーブルとして扱い、クエリ処理する方法があります。私の環境（Core i5 /
16GB）で10万行を読み込むのに1～2秒です。

[code]

    Dim Conn As Object
    Dim Command As Object
    Dim Recordset As Object
        
    Set Conn = CreateObject("ADODB.Connection")
    Conn.Provider = "Microsoft.Ace.OLEDB.12.0"
    Conn.Properties("Data Source") = "C:"
    Conn.Properties("Extended Properties") = "Text;"
    Conn.Open
        
    Set Command = CreateObject("ADODB.Command")
    Set Command.ActiveConnection = Conn
    Command.CommandText = "SELECT * FROM [sample.log] WHERE NOT IsNull(F1)"
        
    Set Recordset = Command.Execute()
        
    Range("A1").CopyFromRecordset Recordset
    
[/code]

なお細かい補足になりますが、この方法でタブ区切りファイルを扱う場合は、schema.iniというファイルを元データと同じフォルダ内に作成する必要があります。以下が内容の例ですが、詳細はMicrosoftのドキュメントにてご確認ください。  
<https://docs.microsoft.com/ja-jp/sql/odbc/microsoft/schema-ini-file-text-
file-driver?view=sql-server-ver16>

[code]

    [sample.log]
    ColNameHeader=False
    Format=TabDelimited
    Col1=F1 Text
    Col2=F2 Text
    
[/code]


CC BY-SA 4.0
2022-08-20T15:44:16.247
90653
2022-08-20T16:24:41.510
2022-08-20T16:24:41.510
3060
36398
90643
answer