プロが教えるわが家の防犯対策術!

PC画面でご覧ください。
コードを教えてください。

状況

 列A   列B   列C   列D   列E
 あああ  いいい  ううう  りんご  えええ
 かかか  ききき  くくく  ばなな  こここ
 さささ  ししし  すすす  もも   そそそ
 たたた  ちちち  つつつ  かき   ととと

 1行目に見出しが列AからE列まであり。
 縦方向に、列Dに、合計12種類の単語が入っています。
 単語は、果物で、りんご、ばなな、もも、かき といった具合です。

 このうち、りんご、ばなな 以外の単語すべてというコードの書き方ができるでしょうか。
 そのふたつの果物以外が格納されている場合、行をすべて削除したいのです。

 総行数は毎月変わり、50000行から70000行です。
 毎月の経験としては、150行程度が残るだけです(それらふたつの単語ある行)。

 経験的にいって、削除処理スピードを上げるためには、その果物名で並び替えすると早そうです。
 並び替える前後での行方向の順番は、どうなってもまったく問題なしです。

 質問の背景、果物の種類は、現在、12種類を登録していますが
 今後は、突然に、種類が増える可能性があります。
 これまでは、果物10個の単語を登録して、並び替えてVBA処理していきましたが、
 コードの中に、削除する具体的な名前を書く必要がないように、したいです。

 りんご ばなな 以外の あらゆる単語の場合 行全体を削除、という風にしたいです。

A 回答 (2件)

こんばんは



>このうち、りんご、ばなな 以外の単語すべてというコードの書き方ができるでしょうか。
キーワードが2種類程度なら、「りんご」でなく、かつ、「ばなな」でないものを条件にすれば良いでしょう。
数が増えるようなら、キーワードを配列にしておいて処理する方が簡潔なコードになると思います。

>削除処理スピードを上げるためには、その果物名で並び替えすると早そうです。
50000程度ならさほど気にしなくても良さそうな気もしますが、処理速度を上げたければ、極力メモリ上で処理するようにするのが効果的かと思います。

D列の最終行が、データ全体の範囲と考えてよいものと仮定して、以下はメモリ上で処理を行う例です。
ひとまず、削除対象行を選択する形にしてありますが、内容的に問題がなければ、削除に変えることで対象行をまとめて削除できます。

Sub Sample()
Dim val, u As Range, rw As Long

val = Range("D1").Resize(Cells(Rows.Count, 4).End(xlUp).Row).Value
For rw = 2 To UBound(val)
If val(rw, 1) <> "りんご" And val(rw, 1) <> "ばなな" Then
If u Is Nothing Then Set u = Cells(rw, 1) Else Set u = Union(u, Cells(rw, 1))
End If
Next rw

If Not u Is Nothing Then u.EntireRow.Select
End Sub
    • good
    • 2
この回答へのお礼

ありがとうございます。
1行目が見出しで、シート名1で
4と5行目が横方向にハイライトされた状態で、静止し、
画面上は、変化なしでした(当初のデータセットのまま)。
ここまでは意図された通りだと思います。

参照行を削除するコードを教えてください

Selection.Delete Shift:=xlUp
Range("A1").Select
これを、End Subの上に加筆すればいいのかな

お礼日時:2021/11/03 22:38

こんばんは。



例えばですが、フィルターで、りんごとばななを残して、表示されたものを
他のシートへコピーするのはダメなのでしょうか? これが一番早いかと。
コピーしたシートが、結果だと思うのですが。

削除って、時間が掛かったりするので。
並べ替えするにも、りんごとばななを上に持ってきた方が早いのですが、
あいうえお順だと、かき、ばなな、もも、りんご となりますね。
ユーザー定義で、りんごとばななを設定するという方法もありますが。
その後、ユーザー定義で並べ替えて、ばななの下を全て削除でしょうかね。
    • good
    • 1
この回答へのお礼

アイデアありがとうございます
やってみます

お礼日時:2021/11/03 19:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!