ワークシートを編集しているときに、ワークシート内の多数の製品の数量が0であり、数量が0のすべての行を削除する場合は、どうすればよいですか?
通常、Excelで指定された行を削除するには、2つの方法があります。1つはフィルタリングを使用して、もう1つはVBAステートメントです。
指定された行を削除する方法1
まずに領域(ヘッダー行を含む)を選択してから、[データ] –[並べ替えとフィルター]–[自動フィルター]を選択します。 [数量]列のドロップダウンリストで[0]を選択すると、数量が0のすべての行が一覧表示されます。 すべての行が選択され、右クリックして、[行の削除」を選択し、[OK]を押して0の行をすべて削除します。 最後に、フィルターをキャンセルします。
指定された行を削除する方法2
たとえば、テーブル内6の倍数である行をすばやく削除するにはどうすればよいですか?
VBAステートメントコードは次のとおりです。
for i=6 to 1000 step 6
rows(i & ":" & i).select
selection.delete shift:=xlup
i=i-1
next
上記の2つの方法では、指定した行のデータをすばやく削除でき、必要に応じて活用することができます。
データを削除するための条件がより複雑な場合はどうなりますか? Excelは、簡単にデータを削除することができます。次には例を挙げて、テーブル内の指定されたコンテンツの行をバッチで削除します。
このような問題には、EXCELにある[ジャンプ]機能で解決できます。
たとえば、列Aにエラー値がある行をバッチ削除します。
[a:a].SpecialCells(xlCellTypeFormulas, 16).EntireRow.Delete
たとえば、列Aのすべての空白行をバッチで削除します。
[a:a].SpecialCells(xlCellTypeBlanks).EntireRow.Delete
ただし、これ以上、より複雑の問題を解決する場合は、[ジャンプ]または[検索]機能を使用できません。次には例を挙げます。
上記の成績表から、名前に[高]と[藤]が含むセルの行を削除します。
コードは次となります。
Sub DltRow()
Dim Arr, x&, i&, Rng As Range, R
R = Array("高", "藤")
'配列rにキーワードを記述する
Arr = [a1].CurrentRegion
'データソースを配列arrに記述され、セルオブジェクトより配列のほうが効率的である
For i = 1 To UBound(Arr)
'配列arrを検索する
For x = 0 To UBound(R)
'配列Rからキーワードを検索する
If InStr(1, Arr(i, 1), R(x), vbTextCompare) Then
'配列rにキーワードを含めるかどうかを確認し、マッチングモードvbTextCompareは大文字と小文字を区別しない
If Rng Is Nothing Then
'rng変数が割り当てられていない場合は、検索結果がないことを意味する
Set Rng = Cells(i, 1)
Else
Set Rng = Union(Rng, Cells(i, 1))
'検索結果がすでに存在する場合、unionは複数の結果を返すセルを結合する
End If
Exit For
'結果が見つかった場合、配列Rの検索を終了して、不要なループを回避し、コードの効率を向上させる
End If
Next
Next
If Not Rng Is Nothing Then Rng.EntireRow.Delete
'検索条件を満たす結果がある場合は、行全体が削除される
MsgBox "完了"
End Sub
ヒント
1、 [テーブル]では複数のレコードを同時に削除できないため、このコードは[テーブル]に無効です。 [テーブル]は下の図にマークされたもので、作成するショートカットキーはCtrl + LまたはCtrl + Tです。
2、このような問題に対して、初心者がよく最初から最後まで検索し、検索しながら、削除します。
For i = 1 To 10
If Cells(i, 1) Like "*高*" Then Cells(i, 1).EntireRow.Delete
Next
コードは正しいように見えますが、計算結果が間違っています。
これは、テーブルの行全体が削除された後、次の行がデフォルトで上に移動されるためです。 たとえば、4行目を削除し、デフォルトで5行目を4行目になります。4行目が検索されたため、この行は検索範囲に外されます。
3、コードはunionステートメントを使用して、複数の結果であるセルを結合し、最後にバッチで削除します。1行づつを削除するより効率的です。効率と言えば…一番効率的な方法は、配列を使用して一致する結果を保存することですが、この方法では元の値があるセルの場所は変更され、データ形式も変更される可能性があります。さらに、この方法では数式の計算結果を数値に変換します。コードは次のように表示されます。
Sub DltRow2()
Dim Arr, x&, i&, R, Brr, K&, Book&, j&
R = Array("高", "藤")
'配列rにキーワードを記述する
Arr = [a1].CurrentRegion
'データソースを配列arrに記述する
ReDim Brr(1 To UBound(Arr), 1 To UBound(Arr, 2))
For i = 1 To UBound(Arr)
'配列arrを検索する
Book = 0'タグ値の初期化0
For x = 0 To UBound(R)
'配列Rからキーワードを検索する
If InStr(1, Arr(i, 1), R(x), vbTextCompare) Then Book = 1: Exit For
'配列rにキーワードを含めるかどうかを確認し、マッチングモードでは大文字と小文字が区別されない。含まれている場合は、Book=1と記述する
'Exit For結果が見つかった場合、配列Rの検索を終了して、不要なループを回避し、コードの効率を向上させる
Next
If Book = 0 Then
'キーワードが含まれていない場合、Bookは0であり、この行を保留し、結果を配列brrに記述する
K = K + 1'行数を増加する
For j = 1 To UBound(Arr, 2)
'arrがこの行を検索し、データをbrrに記述する
Brr(K, j) = Arr(i, j)
Next
End If
Next
[a1].CurrentRegion.ClearContents
'ローデータを削除する
If K > 0 Then [a1].Resize(K, UBound(Brr, 2)) = Brr
'結果の配列をセル範囲に返す
MsgBox "完了"
End Sub
コメントを残す