あるメーカーの出荷データの印刷をエクセルのマクロでやっています、ところが大きなメーカーなので全国いろいろな所に工場があって場所によっては土曜日に出荷するところもあります、そのため週明けは2日、あるいは3日分のデータがアップロードされていることもあります。
そこで複数のデータを読み込んで処理できるようにしてあるのですがそうするとデータ毎に項目行が存在するので一行目以外はすべて削除しなければならないのです、そのための処理を下記のようにやっています。
Sub 行削除()
行 = Cells(1).CurrentRegion.Rows.Count
For i = 行 To 2 Step -1
If Cells(i, 1).Value = "客先注番" Then
Rows(i).EntireRow.Delete
End If
Next i
End Sub
もっと早くする方法はないかと考えて「Find」メソッドというのを使えないかとヘルプを見ていたら正にすぐ応用が利きそうな例文がありました、「FindNext」メソッドを併用するやり方です、でもその通りにやっても「実行時エラー 1004・・・」てのが出てできないのです。
そこで「Find」メソッドだけを使う方法でできそうなので作ったのが下のやつです。
Sub 行削除2()
With Range(Cells(2, 1), Cells(行, 1))
Set f = .Find("客先注番", LookIn:=xlValues)
Do
f_row = f.Row
Rows(f_row).EntireRow.Delete
Set f = .Find("客先注番", LookIn:=xlValues)
Loop While Not f Is Nothing
End With
End Sub
でもこれ、やたら遅い、前者は10,000行の処理に1回目は2秒、2回目は1秒でしたが後者は2回ともなんと7秒もかかってしまいました。
丸一日を無駄なことに費やしてしまいました。
あーあ・・・。
そこで複数のデータを読み込んで処理できるようにしてあるのですがそうするとデータ毎に項目行が存在するので一行目以外はすべて削除しなければならないのです、そのための処理を下記のようにやっています。
Sub 行削除()
行 = Cells(1).CurrentRegion.Rows.Count
For i = 行 To 2 Step -1
If Cells(i, 1).Value = "客先注番" Then
Rows(i).EntireRow.Delete
End If
Next i
End Sub
もっと早くする方法はないかと考えて「Find」メソッドというのを使えないかとヘルプを見ていたら正にすぐ応用が利きそうな例文がありました、「FindNext」メソッドを併用するやり方です、でもその通りにやっても「実行時エラー 1004・・・」てのが出てできないのです。
そこで「Find」メソッドだけを使う方法でできそうなので作ったのが下のやつです。
Sub 行削除2()
With Range(Cells(2, 1), Cells(行, 1))
Set f = .Find("客先注番", LookIn:=xlValues)
Do
f_row = f.Row
Rows(f_row).EntireRow.Delete
Set f = .Find("客先注番", LookIn:=xlValues)
Loop While Not f Is Nothing
End With
End Sub
でもこれ、やたら遅い、前者は10,000行の処理に1回目は2秒、2回目は1秒でしたが後者は2回ともなんと7秒もかかってしまいました。
丸一日を無駄なことに費やしてしまいました。
あーあ・・・。