Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3547 / 13644 ツリー ←次へ | 前へ→

【61455】ループ処理 HAM 09/5/9(土) 17:49 質問[未読]
【61456】Re:ループ処理 ゆみこん 09/5/9(土) 18:31 発言[未読]
【61486】Re:ループ処理 HAM 09/5/13(水) 11:07 お礼[未読]
【61457】Re:ループ処理 kanabun 09/5/9(土) 18:55 発言[未読]
【61487】Re:ループ処理 HAM 09/5/13(水) 11:08 お礼[未読]

【61455】ループ処理
質問  HAM  - 09/5/9(土) 17:49 -

引用なし
パスワード
   A B C
10 15 20

1


1 3 2

  4


   5
2 5 8
いつも大変お世話になっております。
上記のように途中の行で全ての列の値がブランクの表があり
ブランクでない列が含まれていない行のみを削除しようろ思い
下記のMacroを組みました。
これが三列であれば下記のように簡単にできたのですが
これを20列ほどになると長くなってしまい
おまけにデータの最終行を過ぎても計算が止まらずにどこまでも頑張ってくれます。

  Endrow = Cells(Rows.Count, 1).End(xlUp).Row
  For Loop_Row = 1 To Endrow
    If Cells(Loop_Row, 1) = "" Then
      If Cells(Loop_Row, 2) = "" Then
        If Cells(Loop_Row, 3) = "" Then
          Rows(Loop_Row).Delete
          Loop_Row = Loop_Row - 1
          Loop_Count = Loop_Count + 1
        End If
      End If
    End If
  Next Loop_Row

その為、下記のように書きくわえましたが
ごてごてしておりすっきりさせたいと思いました。
これをうまく纏める方法をご教授願えませんでしょうか。

  Endrow = Cells(Rows.Count, 1).End(xlUp).Row
  For Loop_Row = 1 To Endrow
    If Loop_Count < Endrow Then
      If Cells(Loop_Row, 1) = "" Then
        If Cells(Loop_Row, 2) = "" Then
          If Cells(Loop_Row, 3) = "" Then
            Rows(Loop_Row).Delete
            Loop_Row = Loop_Row - 1
            Loop_Count = Loop_Count + 1
          End If
        End If
      End If
    End If
  Next Loop_Row

【61456】Re:ループ処理
発言  ゆみこん  - 09/5/9(土) 18:31 -

引用なし
パスワード
   A〜C列の2行目以下で、A〜C列に値が含まれる行を削除と言う事なら、

With Range("A:C")
   .AutoFilter
   .AutoFilter Field:=1, Criteria1:="<>"
   .AutoFilter Field:=2, Criteria1:="<>"
   .AutoFilter Field:=3, Criteria1:="<>"
  
   ' Select を Delete に変更
   Range("A2", Cells(Rows.Count, 1).End(xlUp).Resize(, 3)).SpecialCells(xlCellTypeVisible).EntireRow.Select
  
   ' 下記をコメントアウト
   '.AutoFilter
End With

と言う事ですか?

【61457】Re:ループ処理
発言  kanabun  - 09/5/9(土) 18:55 -

引用なし
パスワード
   ▼HAM さん:
おじゃまします。

まず調べる範囲ですが、
> Endrow = Cells(Rows.Count, 1).End(xlUp).Row
ですと、A列がたまたま 1行目にだけデータがあったりすると
全範囲を調べることができなくなりますので、ここは
UsedRangeプロパティで範囲を取得しましょう。

あと、本題の「列数」可変のときの空白行削除の件ですが、
UsedRangeの1列目から、最後の列までLoopすればいいと思います。
こんな風に↓
Sub Try1()
  Dim EndRow As Long
  Dim EndCol As Long
  Dim iRow As Long
  Dim jCol As Long
  EndRow = ActiveSheet.UsedRange.Rows.Count
  EndCol = ActiveSheet.UsedRange.Columns.Count
  For iRow = EndRow To 1 Step -1
    For jCol = 1 To EndCol
      If Not IsEmpty(Cells.Item(iRow, jCol)) Then
        Exit For
      End If
    Next
    If jCol = EndCol + 1 Then Rows(iRow).Delete
  Next
End Sub

あるいは 列を1つづつ調べなくても、「行をまとめて」調べても
いいかと思います。
Sub Try2()
  Dim EndRow As Long
  Dim iRow As Long
  With ActiveSheet.UsedRange
    For iRow = .Rows.Count To 1 Step -1
      If WorksheetFunction.CountA(.Rows(iRow)) = 0 Then
        Rows(iRow).Delete
      End If
    Next
  End With
End Sub

。。。などと、提示コードに合わせて ちまちま書いていたら、
ゆみこん さんから、ナイスアドバイスがありました。(^^

Loopで 行を削除したり挿入したりするときは 下からやるのが安全ですが、
AutoFilterなら そういうこと配慮しなくて一括削除できるのでぼくも
こちらをお勧めします。(1行も抽出されなかったり、1行だけのときは
注意が必要ですが)

では

【61486】Re:ループ処理
お礼  HAM  - 09/5/13(水) 11:07 -

引用なし
パスワード
   ▼ゆみこん さん:
AutoFilterを使う発想は大変勉強になりました。
ありがとうございました。

【61487】Re:ループ処理
お礼  HAM  - 09/5/13(水) 11:08 -

引用なし
パスワード
   ▼kanabun さん:
なにぶん独学でやってきたもので
Step -1で戻るという発想は出てきませんでした
これまた大変勉強になりました。

いままで余計な変数を使用し
無駄に長くなってしまっていた個所が
すっきりと短縮できました
ありがとうございました。

3547 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free