質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

1142閲覧

【VBA】条件分岐で行の削除方法

temji

総合スコア14

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/10/27 07:47

編集2020/10/28 01:44

エクセル2013でVBAを作成していますが、どうやって作成すればいいか分からないので質問させてください。
以下のようなデータがあったときに太字の部分を削除するVBAを作るにはどうしたらよいでしょうか。
かなりのデータ量があるので時間のかからない処理ができる方法を探しております。

削除の条件としては以下条件すべてに当てはまった場合になります。
①A列~B列が同じ値
②①の条件かつ、D列が確定の次に未確定がある
③C列が確定日と同じ、もしくは確定日より前の場合

よろしくお願いいたします。

A列   B列   C列     D列
A100 1100 2020/10/25 確定
B100 1100 2020/10/26 確定
B100 1100 2020/10/26 未確定
A101 1101 2020/10/25 確定
A101 1101 2020/10/25 未確定
A101 2201 2020/10/25 確定
A101 2201 2020/10/28 未確定
A201 2200 2020/10/28 確定
A201 2200 2020/10/27 未確定
B201 1120 2020/10/25 未確定
B201 1120 2020/10/27 未確定

A列   B列   C列     D列
A100 1100 2020/10/25 確定
B100 1100 2020/10/26 確定
A101 1101 2020/10/25 確定
A101 2201 2020/10/25 確定
A101 2201 2020/10/28 未確定
A201 2200 2020/10/28 確定
B201 1120 2020/10/25 未確定
B201 1120 2020/10/27 未確定

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/10/27 09:17

> かなりのデータ量があるので時間のかからない処理ができる方法を探しております。 探してもこのような細かい要望を叶える方法はWEB上に都合よく転がってはいません。 探すのではなく、ご自身で考えて造ってください。低評価は私がしたものではありませんが、丸投げ感がその評価につながったのだと思います。
tatsu99

2020/10/28 01:29

1行目は見出し行ですか。それとも実際のデータが1行から開始していますか。 フィルターの作業用に1列使うとしたら、どの列があいていますか。(E列,F列,G列等) データはおよそ何行ありますか。また、削除対象となることが予想されるのは、およそ、何件ぐらいですか。
hatena19

2020/10/28 01:40 編集

データ例では並び順はA列B列のグループ毎にまとまってますが、実際のデータもそれが保障されてますか。 5行目の A101 1101 2020/10/25 未確定 は条件にあっていると思いますが、なぜ削除しないのですか。 他に条件があるのでしょうか。
temji

2020/10/28 01:40

tatsu99様 1行目は見出しになります。 F列以降であれば使用していませんのであいております。 データは前後があるのですが5万件~10万件程度です。 削除対象はあまりなく、あって100件程度です。
temji

2020/10/28 01:45

hatena19様 実際のデータも順番になっており、実際のデータでも保障されています。 5行目に関しては私のミスだったので編集しておきました。 申し訳ございません。
temji

2020/10/28 01:49

dodox86様 色々と試行錯誤し考えておりましたがなかなかうまくいかず、いい方法が思いつかなかったため質問させていただきました。 私の投稿の仕方が悪かったうえ勉強不足で理解が足りなかったです。 丸投げ感を感じさせてしまい不愉快な思いをさせてしまい申し訳ございませんでした。
guest

回答3

0

ベストアンサー

作業列にF列を使います。
削除対象となった行のF列に「削除」の文字が設定されます。
また、その行が正しいかどうかを比較する為に削除対象行の1行前に「元データ」の文字を設定します。
フィルターで「削除」と「元データ」のみを表示し、正しいかどうか目視してチェックしてください。
OKなら「削除」のみを表示し、それらの行を全て選択し、手作業で削除してください。
(慣れてきて、元データとの比較が不要なら、「元データ」の文字を設定している個所をコメントアウトしてください。そうすれば、いきなり、削除のみを選択して、削除することもできます)

VBA

1Option Explicit 2Public Sub 削除行抽出() 3 Dim sh1 As Worksheet 4 Dim wrow As Long 5 Dim maxrow As Long 6 Set sh1 = ActiveSheet 7 maxrow = sh1.Cells(Rows.Count, "A").End(xlUp).Row 'Sheet1 A列最大行 8 sh1.Columns("F").Clear 9 For wrow = 3 To maxrow 10 If sh1.Cells(wrow, "D").Value = "未確定" Then 11 If sh1.Cells(wrow - 1, "D").Value = "確定" Then 12 If sh1.Cells(wrow, "A").Value = sh1.Cells(wrow - 1, "A").Value Then 13 If sh1.Cells(wrow, "B").Value = sh1.Cells(wrow - 1, "B").Value Then 14 If sh1.Cells(wrow, "C").Value <= sh1.Cells(wrow - 1, "C").Value Then 15 sh1.Cells(wrow - 1, "F").Value = "元データ" 16 sh1.Cells(wrow, "F").Value = "削除" 17 End If 18 End If 19 End If 20 End If 21 End If 22 Next 23End Sub 24

投稿2020/10/28 02:17

tatsu99

総合スコア5438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

temji

2020/10/28 05:20

ご丁寧に回答していただきありがとうございました。 非常に参考になる内容でした。 こちらを参考にカスタマイズさせていただきたいと思います。
guest

0

1行目は見出しでデータは2行目からとして、F列を作業列とします。

F3セルに下記の式を記述します。

excel

1=IF(AND(A2=A3,B2=B3,D3="未確定",D2="確定",C3<=C2),1,0)

データの最後の行までフィルダウンします。

フィルターでF列で 1 のみ選択するようにします。
データ範囲を選択して削除します。

これで目的のデータが削除できると思います。

これをマクロの記録でVBA化して、それを元に書き換えるといいでしょう。

念のためにバックアップを取ってから作業をしてください。


作業列とオートフィルターを使って削除する場合のコード例

vba

1Sub Sample1() 2 Application.ScreenUpdating = False 3 4 Dim tbl As Range 5 Set tbl = Range("A1").CurrentRegion 6 Set tbl = tbl.Resize(, tbl.Columns.Count + 1) '作業列追加 7 8 Dim workCol As Range '作業列の式を設定する範囲 9 Set workCol = tbl.Columns(tbl.Columns.Count).Offset(2).Resize(tbl.Rows.Count - 2, 1) 10 workCol.Formula = "=IF(AND(A2=A3,B2=B3,D3=""未確定"",D2=""確定"",C3<=C2),1,0)" 11 12 tbl.AutoFilter Field:=6, Criteria1:="1" 13 tbl.Offset(1).EntireRow.Delete 14 tbl.AutoFilter 15 workCol.Clear 16 17 Application.ScreenUpdating = True 18End Sub

投稿2020/10/28 02:07

編集2020/10/28 03:22
hatena19

総合スコア33699

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

temji

2020/10/28 05:21

ご丁寧に回答していただきありがとうございました。 非常に参考になる内容でした。 色々カスタマイズさせて利用させていただきます。
guest

0

オートフィルターでそのデータを抽出できませんか?
できたら、その行を削除するだけです。
フィルターモード中は、非表示セルの操作は無効になりますので、
何も考えずに表示された範囲をずらずらドラッグで選択し削除していいと思います。

まずは、手動でやってみて、その操作をマクロの記録という機能でコードに
翻訳してもらいコードを探るところから始めてみてください。

②①の条件かつ、D列が確定の次に未確定がある

あぁ、これがオートフィルターでは抽出できませんね。

結局、A列、B列、C列が同じものがあるとき、
未確定を削除して確定を残したいということなら、
「重複の削除」の機能で削除できそうですか?

投稿2020/10/27 11:06

編集2020/10/27 11:13
mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

temji

2020/10/28 05:23

ご丁寧に回答していただきありがとうございました。 非常に参考になる内容でした。 ご提案いただいた方法だと今の自分では思い通りの動きにはできませんでした。 この先困った際にはこのような方法があると心に留めておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問