1. ホーム
  2. excel

[解決済み] エクセルVBAで行を削除する

2022-03-06 22:05:28

質問

私は、リストからアイテムのExcel行を見つけ、リストからアイテムを削除するコードのこの部分を持っています。私が欲しいのは...同様にExcelの行を削除することです。

コードはこちら

Private Sub imperecheaza_Click()
Dim ws As Worksheet
Dim Rand As Long
Set ws = Worksheets("BD_IR")    
Rand = 3
Do While ws.Cells(Rand, 4).Value <> "" And Rand < 65000
   If ws.Cells(Rand, 4).Value = gksluri.Value * 1 And ws.Cells(Rand, 5).Value = gksluri.List(gksluri.ListIndex, 1) * 1 Then
            ws.Range(Rand, 1).EntireRow.Delete '(here I want to delete the entire row that meets the criteria from the If statement)
            gksluri.RemoveItem gksluri.ListIndex
            Exit Do
    End If
Rand = Rand + 1
Loop
End Sub

ws.Range(Rand,1).EntireRow.Delete を追加したところは、行全体を削除したいのですが、どうすればいいのでしょうか。もし、あるセルで同じ値が見つかったら、リストボックスの項目と行全体を削除できるようにしたいのですが。リストボックスから項目を削除するために動作しますが、私は同様に行を削除する方法がわかりません。

解決方法を教えてください。

Chris Nielsenの解決策はシンプルでうまくいくでしょう。もう少し短い選択肢は...

ws.Rows(Rand).Delete

...行を削除する際に Shift を指定する必要がないことに注意してください。なぜなら、定義上、左にシフトすることはできないからです。

ちなみに、私が好んで使っている行削除の方法は...

ws.Rows(Rand) = ""

...最初のループで。その後、ソート関数を使って、これらの行をデータの一番下に押し出しています。この主な理由は、1行の削除に非常に時間がかかるからです(>100行を削除する場合)。また、Robert Ilbrink氏のコメントにあるように、見落としがないようにするためでもあります。

ソートのコードは、マクロを記録して、次のようにコードを縮小することで学ぶことができます。 エキスパートExcelビデオ . 私は、最も巧妙な方法(Range("A1:Z10").Sort Key1:=Range("A1"), Order1:=xlSortAscending/Descending, Header:=xlYes/No) は2007以前のバージョンのみで発見できるのではないかという疑念を持っていますが、2007/2010相当のコードをいつでも縮小できるのですから......。

もし、リストがまだ列でソートされておらず、順番を保持したい場合は、各行の右側にある予備の列に行番号「Rand」を貼り付けてループさせることができます。そうすると、そのコメントでソートされ、コメントが削除されます。

データ行に書式が含まれている場合、新しいデータ範囲の終端を探し、先にクリアした行を削除するとよいでしょう。それは、ファイルサイズを小さくするためです。プロシージャの最後に大きな削除を一つ入れても、単一の行を削除するのと同じようにコードのパフォーマンスを損なうことはないことに注意してください