2017-08-02 1 views
1

範囲内の空白行を削除する方法や、空白行を基準にしてテーブル行を削除する方法についてはいくつかの記事がありますが、完全に空白の行を削除する方法については何も記載されていません。Excelテーブルのすべての空白行を削除する最も簡単な方法は何ですか?

これを行う最も簡単な方法は何ですか?

他の人を助けるために私の解決策を掲載しましたが、誰かがより速い方法を持っているかどうかを知りたいと思っています。

答えて

2

空の表の行を削除する手順は次のとおりです。大規模な(Excel用の)データセットで作業することもあり、この方法は高速です。テーブルの行を配列にロードし、配列の空白行をチェックし、最後にrange.deleteオペレーションを実行します。

あなたはこのように手順を実行します。

Sub Test() 
    DeleteBlankTableRows ActiveSheet.ListObjects(1) 
End Sub 

ActiveSheet.ListObjects(1)は、(通常は)アクティブワークシート上の最初のテーブルのテーブルです。ここ

は、実際の手順は次のとおり

Sub DeleteBlankTableRows(ByVal tbl As ListObject) 
    Dim rng As Range 
    Set rng = tbl.DataBodyRange ' Get table data rows range. 
    Dim DirArray As Variant 
    DirArray = rng.Value2  ' Save table values to array. 

    ' LOOP THROUGH ARRAY OF TABLE VALUES 
    Dim rowTMP As Long 
    Dim colTMP As Long 
    Dim combinedTMP As String 
    Dim rangeToDelete As Range 

    ' Loop through rows. 
    For rowTMP = LBound(DirArray) To UBound(DirArray) 
     combinedTMP = vbNullString ' Clear temp variable. 

     ' Loop through each cell in the row and get all values combined. 
     For colTMP = 1 To tbl.DataBodyRange.Columns.Count 
      combinedTMP = combinedTMP & DirArray(rowTMP, colTMP) 
     Next colTMP 

     ' Check if row is blank. 
     If combinedTMP = vbNullString Then 
      ' Row is blank. Add this blank row to the range-to-delete. 
      If rangeToDelete Is Nothing Then 
       Set rangeToDelete = tbl.ListRows(rowTMP).Range 
      Else 
       Set rangeToDelete = Union(rangeToDelete, tbl.ListRows(rowTMP).Range) 
      End If 
     End If 
    Next rowTMP 

    ' DELETE BLANK TABLE ROWS (if any) 
    If Not rangeToDelete Is Nothing Then rangeToDelete.Delete 
End Sub 

これは他の方法に勝るいくつかの利点を有する:

  1. SPEED 20万行8列のテーブルのテストでは、この方法がかかったが19秒。それは同じテーブルのために必要とされる方法のSpecialCells(xlCellTypeBlanks)の34秒のちょうど半分以上です。
  2. :いくつかの状況では実際には非常に便利なthis oneのような他のメソッドとは異なり、このメソッドは行の各セルで空白を1つではなく探します。
1

これは機能するはずです。わからないそれは高速ですが、それはそれを行うための別の方法だ場合:

Sub delete_blank_table_rows() 
Dim Rng As Range, tempRng As Range 
Set Rng = Range("Table1") ' Change as necessary 
Set Rng = Range(Cells(Rng.Rows(1).Row, Rng.Columns(1).Column), Cells(Rng.Rows(Rng.Rows.Count).Row, Rng.Columns(Rng.Columns.Count).Column)) 

Dim i  As Long 
For i = Rng.Rows.Count To 1 Step -1 
    Cells(Rng.Rows(i).Row, Rng.Columns(1).Column).Select 
    Set tempRng = Range(Cells(Rng.Rows(i).Row, Rng.Columns(1).Column), Cells(Rng.Rows(i).Row, Rng.Columns(Rng.Columns.Count).Column)) 

    If WorksheetFunction.CountA(tempRng) = 0 Then 
     tempRng.Delete shift:=xlUp 
    End If 

Next i 
End Sub 

編集:それは実行中そしてもちろんのは、あなたが画面の更新をオフにする必要があります計算を、それをスピードアップします。

+0

感謝。私はこれを最初に実行し、4分13秒で完了しました。画面の更新と計算を手動に設定すると、1分17秒に短縮されました。しかし、高速ではあるが、まだ答えとして投稿された方法で達成された19秒よりもずっと遅いです...より速い方法があるはずです。 – ChrisB

0

私は、これは(あなたがあなたのテーブルの寸法を満たすためにLASTROWとlastcolを変更することができます)より速いかもしれないと思う:これを掲示するための

Sub delete_rows_blank2() 

t = 1 
lastrow = ActiveSheet.UsedRange.Rows.Count 
lastcol = ActiveSheet.UsedRange.Columns.Count 

Do Until t = lastrow 

For j = 1 To lastcol 

    If Cells(t, j) = "" Then 

     j = j + 1 

      If j = lastcol Then 
      Rows(t).Delete 
      t = t + 1 
      End If 

    Else 

     t = t + 1 

    End If 

Next 

Loop 

End Sub 
関連する問題