多くの場合、1つ以上の列の基準に基づいて行を削除する方法を尋ねられますが、これにSpecialCellsトリックを使用できますか?
3 に答える
まず、ループには何も問題はないということを断定的に言わせてください。ループには確かにその場所があります。
最近、以下の状況が発生しました。
400000 | Smith, John| 2.4 | 5.66| =C1+D1
400001 | Q, Suzy | 4.6 | 5.47| =C2+D2
400002 | Schmoe, Joe| 3.8 | 0.14| =C3+D3
Blank | | | | #VALUE
Blank | | | | #VALUE
OPは、列Aが空白の行を削除したかったのですが、列Eに値があります。
これは、SpecialCellsと一時的なエラー列を使用して削除する行を特定できる例であることをお勧めします。
これらの行を識別しようとするために列Hを追加する可能性があることを考慮してください。その行では、次のような式を使用できます。
=IF(AND(A:A="",E:E<>""),"DELETE THIS ROW","LEAVE THIS ROW")
これで、その数式を取得して、テストした行にエラーを入れてTrueを返すことができます。これを行う理由は、SpecialCellsと呼ばれるExcelの機能です。
Excelで空のセルを選択し、数式バーに次のように入力します
=NA()
次に、F5キーまたはCtrlキーを押しながらGキーを押し( [編集]メニューの[ ... ]に移動)、[特別]ボタンをクリックして[SpecialCells]ダイアログを表示します。
そのダイアログで、[数式]の横にあるラジオをクリックし、その下にあるチェックボックスをオフにして、[エラー]のみが選択されるようにします。[OK]をクリックします
Excelは、エラー( #N / A )が含まれるワークシート内のすべてのセルを選択する必要があります。
以下のコードは、このトリックを利用して、削除するすべての行に#N / Aを配置する数式を列Hに作成し、SpecialCellsを呼び出して行を検索し、それらをクリア(削除)します...
Sub clearCells()
'
Dim sFormula As String
'
' this formula put's an error if the test returns true,
' so we can use SpecialCells function to highlight the
' rows to be deleted!
数式がTRUEを返したときに#NAを返す数式を作成します
sFormula = "=IF(AND(A:A="""",E:E<>""""),NA(),"""")"
その数式を列Hに入れて、削除する行を見つけます。
Range("H5:H" & Range("E65536").End(xlUp).Row).Formula = sFormula
次に、SpecialCellsを使用して、削除する行を強調表示します。
Range("H5:H" & Range("E65536").End(xlUp).Row).SpecialCells(xlCellTypeFormulas, xlErrors).entirerow.select
このコード行は、行全体を削除する代わりに、テキストを入力またはクリアしたい場合に備えて、 OFFSETを使用して列Aのみを強調表示します。
Range("H5:H" & Range("E65536").End(xlUp).Row).SpecialCells(xlCellTypeFormulas, xlErrors).Offset(0, -7).select
以下のコード行では、次のことができるため、行全体が削除されます:)
Range("H5:H" & Range("E65536").End(xlUp).Row).SpecialCells(xlCellTypeFormulas, xlErrors).EntireRow.Delete shift:=xlup
' clean up the formula
Range("H5:H" & Range("E65536").End(xlUp).Row).Clear
'
End Sub
ところで、本当に必要な場合は、ループを使用することも可能です:)
もう1つ、Excel 2010以前には8192行の制限がありました(この機能はExcelの8ビットバージョンにまでさかのぼったためだと思います)
VBAの伝説であるRondeBruin(特に、この手法を最初に取り上げたWebサイト)には、これについて何か言いたいことがあります。
フィリップ
または、自動フィルターを使用できます。
Sub clearCells()
'
' Example code for StackOverflow post
'http://stackoverflow.com/questions/15431801/how-to-delete-multiple-rows-without-a-loop-in-excel-vba
'
Dim rngTable As Range
Dim ws As Worksheet
Dim StartCell As Range
Const ColumntoFilter1 As Integer = 1
Const FilterCriteria1 As String = "="
Const ColumntoFilter2 As Integer = 5
Const FilterCriteria2 As String = "<>"
Set ws = ActiveSheet
'Set the starting position (Top-left most position) of your data range
Set StartCell = ws.Range("A1")
'Turn off autofilter in case it's already active
ws.AutoFilterMode = False
'Define data table
Set rngTable = StartCell.CurrentRegion
'Filter and delete data
With rngTable
.AutoFilter Field:=ColumntoFilter1, Criteria1:=FilterCriteria1
.AutoFilter Field:=ColumntoFilter2, Criteria1:=FilterCriteria2
.Offset(1, 0).EntireRow.Delete
End With
'Turn filters off again
ws.AutoFilterMode = False
Set rngTable = Nothing
Set StartCell = Nothing
Set ws = Nothing
End Sub