会社を卒業したのんちおじさん。

人生は知恵と工夫と思いやり!
優しさほど強いものはなく、本当の強さほど優しいものはない -ラルフ・W・ソックマン-

徒労・・・。

2009-01-09 18:04:10 | Excelのお話
あるメーカーの出荷データの印刷をエクセルのマクロでやっています、ところが大きなメーカーなので全国いろいろな所に工場があって場所によっては土曜日に出荷するところもあります、そのため週明けは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秒もかかってしまいました。

丸一日を無駄なことに費やしてしまいました。
あーあ・・・。