2017-01-25 22 views
0

行全体にデータがない場合に行を削除するコードを実行しようとしています。私は現在、以下のコードを使用していますが、1つのセルが空であっても行を削除しています。私は交差関数を使用する必要があると思うが、まだどのようにすればよいかわからない。VBAを使用してExcelテーブルの空の行を削除

Dim Rng As Range 
    Dim MainSheet As Worksheet 
    Set MainSheet = Sheet9 
    MainSheet.Select 

    On Error Resume Next 
    Set Rng = MainSheet.Range("table3").SpecialCells(xlCellTypeBlanks) 

    On Error Resume Next 
    If Not Rng Is Nothing Then 
     Rng.Delete Shift:=xlUp 
    End If 

答えて

0

本当にすべてが空であることに依存します。私はあなたがxlCellTypeBlanksを使用していることに気づいています。その範囲プロパティを引き続き使用したい場合は、行のセル数とSpecialCellsセル数を比較することができます - 一致すれば空の行があります。

これを行う方法は他にもたくさんありますが、私はあなたのテーブルの各行を繰り返し処理する必要がないものは認識していません。

Dim lo As ListObject 
Dim lRow As ListRow 
Dim rng As Range 
Dim delRows As Collection 

Set lo = Sheet1.ListObjects("Table1") 'change to your table name 
On Error Resume Next 
For Each lRow In lo.ListRows 
    Set rng = Nothing 
    Set rng = lRow.Range.SpecialCells(xlCellTypeBlanks) 
    If Not rng Is Nothing Then 
     If rng.Count = lRow.Range.Cells.Count Then 
      If delRows Is Nothing Then 
       Set delRows = New Collection 
       delRows.Add lRow 
      Else 
       delRows.Add lRow, Before:=1 
      End If 
     End If 
    End If 
Next 
On Error GoTo 0 

If Not delRows Is Nothing Then 
    For Each lRow In delRows 
     lRow.Delete 
    Next 
End If 
0

これは代替ソリューションですが、それが行を削除するとき、それが効果的にテーブルの数を変更しているので、悪い形で考慮されるべきである:あなたがSpecialCellsルートに行きたいと仮定すると、あなたの反復は、このようなものである可能性があります。それがプログラミングの習慣に悪影響を及ぼします。

また、空白が埋め込まれている場合は、それをキャッチしません。 FYI私はシート9ではなくシート1を使用してデバッグしました。

プラス側では、それは価値があるかもしれません。

私は完全に感謝していないVBAの癖もあります。たとえば、findコマンドの 'rng'を式に置き換えると、なぜこれが理にかなっているのか分からない限り、直感的ではないと考えられるエラーが表示されます。

Sub DeleteEmptyTableRows() 
    Dim MainSheet As Worksheet 
    Dim tabRng As Range, rng As Range, found As Range 
    Dim row As Integer 

    Set MainSheet = Sheet1 
    MainSheet.Select 

    Set tabRng = MainSheet.Range("table3") 

    row = 1 
    Do While row < tabRng.Rows.Count + 1: 
     Set rng = tabRng.Rows(row) 
     Set found = rng.Find("*", rng.Cells(, 1), SearchDirection:=xlPrevious) 
     If found Is Nothing Then 
     tabRng.Rows(row).EntireRow.Delete Shift:=xlUp 
     Else 
     row = row + 1 
     End If 
    Loop 
End Sub 

バグが見つかった場合はお知らせください。空白が入っているエントリを削除しないだけでなく、使用したテストデータでも機能しました。

関連する問題