範囲内の空白行を削除する方法や、空白行を基準にしてテーブル行を削除する方法についてはいくつかの記事がありますが、完全に空白の行を削除する方法については何も記載されていません。Excelテーブルのすべての空白行を削除する最も簡単な方法は何ですか?
これを行う最も簡単な方法は何ですか?
他の人を助けるために私の解決策を掲載しましたが、誰かがより速い方法を持っているかどうかを知りたいと思っています。
範囲内の空白行を削除する方法や、空白行を基準にしてテーブル行を削除する方法についてはいくつかの記事がありますが、完全に空白の行を削除する方法については何も記載されていません。Excelテーブルのすべての空白行を削除する最も簡単な方法は何ですか?
これを行う最も簡単な方法は何ですか?
他の人を助けるために私の解決策を掲載しましたが、誰かがより速い方法を持っているかどうかを知りたいと思っています。
空の表の行を削除する手順は次のとおりです。大規模な(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
これは他の方法に勝るいくつかの利点を有する:
SpecialCells(xlCellTypeBlanks)
の34秒のちょうど半分以上です。これは機能するはずです。わからないそれは高速ですが、それはそれを行うための別の方法だ場合:
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
編集:それは実行中そしてもちろんのは、あなたが画面の更新をオフにする必要があります計算を、それをスピードアップします。
私は、これは(あなたがあなたのテーブルの寸法を満たすために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
感謝。私はこれを最初に実行し、4分13秒で完了しました。画面の更新と計算を手動に設定すると、1分17秒に短縮されました。しかし、高速ではあるが、まだ答えとして投稿された方法で達成された19秒よりもずっと遅いです...より速い方法があるはずです。 – ChrisB