[Excel VBA]マルチファイルで条件に該当する行を削除する方法

このQ&Aのポイント
  • Office 365を使用して複数のExcelファイルで条件に該当する行を削除する方法について説明します。
  • 具体的には、3つのExcelファイルの中で特定の条件を満たす行を削除する方法をマクロで記述する方法について解説します。
  • それぞれのファイルでの削除対象の条件と処理内容を詳しく説明します。
回答を見る
  • ベストアンサー

[Excel VBA]複数ファイルで条件を満たす行

Office 365を使用しています。 下記の条件で行削除したいのですが、マクロではどうのよに記述したら良いでしょうか? ・対象のExcelファイルが↓3つあります >グループリスト >一般顧客 >特別顧客 条件; >グループリストファイル; F列 ---- 1-1 'グループ番号 D列 ---- XXXX '顧客番号 ・グループ番号 1-1のすべての顧客番号が削除対象 処理; 1. >一般顧客ファイル A列 ---- XXXX-XX 'サブ顧客番号 B列 ---- XXXX '顧客番号、グループリストファイルのD列 ・B列、グループリストファイルのD列がマッチした全行を削除して、削除件数をカウント 2. >特別顧客ファイル H列 ---- XXXX-XX 'サブ顧客番号 ・H列、一般顧客ファイルのA列がマッチした全行を削除して、削除件数をカウント *一般顧客ファイルでマッチした行の削除前に、特別顧客ファイルの対象行を削除する必要があると思います

質問者が選んだベストアンサー

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1608/2445)
回答No.3

削除したら元に戻せないので念のために Ws3.Cells(Ws3Row, "H").Offset(0, 2).Value = "Delete" ↑コメントにしているこれを有効にして(H列の2列右のセルにDeleteと書き込みます) ↓これをコメントにして Ws3.Rows(Ws3Row).Delete ここも同じようにして(B列の2列右のセルにDeleteと書き込みます) Ws2.Cells(Ws2Row, "B").Offset(0, 2).Value = "Delete" Ws2.Rows(Ws2Row).Delete テストしてください。 Deleteと書き込まれた行が削除になりますから間違いがないか確認してください。 テストがうまくいけば Ws3.Rows(Ws3Row).Delete と Ws2.Rows(Ws2Row).Delete を有効にして実行してください。 Sheet1は実際のシート名に変更してください。 それぞれのファイルは開いておいてください。 If Ws1.Cells(Ws1Row, "F").Value = "1-1" Then の "1-1"は実際のグループ番号を記載してください。 Sub Test() Dim Ws1 As Worksheet, Ws2 As Worksheet, Ws3 As Worksheet Dim Ws1Row As Long, Ws2Row As Long, Ws3Row As Long Set Ws1 = ThisWorkbook.Sheets("Sheet1") Set Ws2 = Workbooks("一般顧客ファイル.xlsx").Sheets("Sheet1") Set Ws3 = Workbooks("特別顧客ファイル.xlsx").Sheets("Sheet1") For Ws1Row = 1 To Ws1.Cells(Rows.Count, "G").End(xlUp).Row If Ws1.Cells(Ws1Row, "F").Value = "1-1" Then For Ws2Row = Ws2.Cells(Rows.Count, "B").End(xlUp).Row To 1 Step -1 If Ws2.Cells(Ws2Row, "B").Value = Ws1.Cells(Ws1Row, "G").Value Then For Ws3Row = Ws3.Cells(Rows.Count, "H").End(xlUp).Row To 1 Step -1 If Ws3.Cells(Ws3Row, "H").Value = Ws2.Cells(Ws2Row, "A").Value Then ' Ws3.Cells(Ws3Row, "H").Offset(0, 2).Value = "Delete" Ws3.Rows(Ws3Row).Delete End If Next Ws3Row ' Ws2.Cells(Ws2Row, "B").Offset(0, 2).Value = "Delete" Ws2.Rows(Ws2Row).Delete End If Next Ws2Row End If Next Ws1Row Set Ws1 = Nothing Set Ws2 = Nothing Set Ws3 = Nothing End Sub

genesis50
質問者

補足

ありがとうございました。 .deleteでなく、.Interior.ColorIndex =XXで削除予定行を確認しました 問題はございませんでした。 大変申し訳ございませんが、Ws2シート、Ws3シートで削除合計をMsgBox関数などで 表示したいのですが、どのようにしたら良いでしょうか?

その他の回答 (3)

  • kkkkkm
  • ベストアンサー率65% (1608/2445)
回答No.4

> Ws2シート、Ws3シートで削除合計をMsgBox関数などで > 表示したいのですが、どのようにしたら良いでしょうか? カウントをどうするのか聞こうと思って忘れてました。 Dim Ws2Count As Long, Ws3Count As Long: Ws2Count = 0: Ws3Count = 0 を追加して それぞれ削除後にカウントアップして Ws3.Rows(Ws3Row).Delete の後に Ws3Count = Ws3Count + 1 Ws2.Rows(Ws2Row).Delete の後に Ws2Count = Ws2Count + 1 最後に MsgBox "一般顧客 削除件数 [ " & Ws2Count & " 件 ]" & vbCrLf & _ "特別顧客 削除件数 [ " & Ws3Count & " 件 ]" シート名がいい場合は MsgBox Ws2.Name & " 削除件数 [ " & Ws2Count & " 件 ]" & vbCrLf & _ Ws3.Name & " 削除件数 [ " & Ws3Count & " 件 ]" で試してみてください。

回答No.2

それだと質問というよりは、仕事用のVBA作成依頼になってしまう。 意地悪では無く、全部回答するのは難しい。特にソースコードは、あとで質問と回答を参照するOKWAVEユーザーの参考になりにくいので。 問題の1点だけを解決・解説するような単純な・上手く動かないソースコードを提示してくれれば、とても回答しやすい。

回答No.1

条件判定で、andとorを正しく書く。 例えば、 if (A or B) and C then D で処理の流れは、 AもCも成り立つ →D。 BもCも成り立つ →D。 AもBもCも成り立つ →D。 Cだけ成り立つ →Dにはならない。 となる。

genesis50
質問者

補足

ありがとうございます。 大変もうしわけございませんが、可能でしたら具体的なサンプルコードをいただけませんでしょうか?

関連するQ&A

  • 【Excel VBA】条件つき行削除

    Excel2003を使用しています。 システムからCSVで落としたデータで、データの並び方に規則性があるので、それを利用して、不要部分のデータをマクロで削除できないかと思い、質問させていただきます。 A列に『累計』を含む文字があった場合、その行のD列が0だったら、その行より上の行のA列に『計上日』と入力されている行までを削除するということをしたいです。 下記でいうと、2~5行までを削除したいです。    A     B     C     D 1 2 計上日 3 4 5 累計                0 6 7 計上日 8 9 累計              1000 上記では、B列、C列には何も書いていませんが、実際はデータが入力されていたり、空欄だったりです。 D列が0の行を削除するコードはわかるのですが、さらに、条件が加わっても同じように処理は可能でしょうか? よろしくお願いします。

  • Excel_VBAでできることでしょうか?

    マクロの記録では何も記録されなかったため下記のことについて質問します。 よろしくお願いいたします。 フォルダABCに1から(増えていくので仮にですが)20までのフォルダがあるとします。 その各フォルダの中に多くのファイルがあります。 例)「1」のフォルダで保存されている「あいうえお.xls」ファイルのショートカットキーを作成し,「3」のフォルダの中にそのショートカットキーを移動させたいと思います。可能でしょうか? これを手動ではなくVBAで行いたいと思っています。  A列にグループ番号   ※グループとグループの間は空白行あり   ※行の追加,削除が行われるためセル指定(行番号指定)はできない  AB列にファイルが保存されているフォルダの場所   ※A列が第一グループなら「1」  AC列に同名ファイルがあるかどうかを数字で記載しているます   ※A列が第三グループでなのAB列に「3」と入っているが同名ファイルが「1」にある場合     そのファイルのショートカットキーをAC列の「3」のフォルダ場所へ作成したい   「1」のフォルダから中をチェックし,同名ファイルがあった場合はショートカットキーを作成し,保存。  同名ファイルがなかった時はそのまま保存というようなものを作成したいためです。 以上になります。相変わらずの説明下手で申し訳ありませんが,よろしくお願いいたします。

  • ExcelのVBAで複数行削除を行う場合

    Excel2007のVBAで複数行を削除する方法を教えて下さい。 Excel2003で使用していたマクロが使えなくなってしまいました・・・。 下記のようなExcelシートに対して複数行ずつ行を削除し、削除対象が無くなるまで 削除処理を行うか、指定した行まで削除処理を行うという事をしたいのですが うまく動きません。 例      A列   B列   C列   D列   E列 1行目 aaa1   bbb1  ccc1 2行目             ccc2 3行目             ccc3 4行目             ccc4 5行目 aaa2   bbb2  ccc1 6行目             ccc2 7行目             ccc3 8行目             ccc4 例に対しての結果      A列   B列   C列   D列   E列 1行目 aaa1   bbb1  ccc4 2行目 aaa2   bbb2  ccc4 例に対して、複数行(指定した行数ここでは3行)の削除を行いたいのですが、 単純に複数行(3行)ずつ削除していくのではなく。 1行目や5行目にあるように文字や情報が入力されているA列とB列の情報は 残しつつ、4行目のC列以降の列の情報はすべて活かしていくという事をしたいのです。 Excel2003の時に使用していたVBAは以下のものです。 Sub 行を削除するマクロ() Workbooks("xxxx.xlsx").Activate '処理を行いたいExcel ※1 n = n + 0 LastRow = 2138           '処理を終了させたい行 ※2 Sheets("Sheet1").Select '処理を行いたいシート ※3 Do Until (n > LastRow) Rows(n + 4).Delete Shift:=xlsiftUp '削除したい行指定 ※4 n = n + 3 Loop End Sub 皆様の良いアドバイスやお知恵をお貸しください。 よろしくお願いします。

  • 複数EXCELファイル中のデータを1つのファイルへ

    同じシート名、同じフォーマットで記載されている約400個のEXCELファイルから、『Participant List』というシート名のB列~H列、8行目~50行の範囲の記載を1つのEXCELファイルに纏めるVBAスクリプトを作成し実行したいのですが、VBAが全く分からず大変困っております。 マクロを実行した時に、入力ファイルと出力ファイルの保存ホルダーを聞いて指定出来るように出来た良いと思っています。 何方か、お分かりでしたらどうぞお力添えをお願いいたします。 <詳細> ・400個の入力EXCELファイルには、『Participant List』、『特定類型』の2つのシートが入っており、今回の入力用シートは『Participant List』になります。 ・今回抜き出したい記載は、『Participant List』シート中のB列~列、8行目~50行の範囲の記載になります。 ・『Participant List』シート中のB列の6行目と7行目のセルは結合しており、各列のタイトルは以下の通りになっています。  このタイトル名を出力ファイルの1行目へデータの各列のタイトルとして付けて、2行目以降より400個の入力ファイル中のデータを連結したいです。   B列:6,7行=『職員番号(nimsID)』     C列:6,7行=『名前(Name)』       D列:6,7行=『部門(Research Center, Division)』   E列:6,7行=『グループ(Group)』   F列:6,7行=『役職(Title)』   G列:6,7行=『開始年月(Start)』   H列:6,7行=『終了年月(End)』 ・出力ファイル名や出力のシート名は特に考えておりません。 ・入力データは以下ような記載のフォーマットになります。   B列=『職員番号(nimsID)』       例:14769     C列=『名前(Name)』         例:田中 一郎    D列=『部門(Research Center, Division)』 例:総合開発・情報部門   E列=『グループ(Group)』   例:科学リーダー   F列=『役職(Title)』     例:リーダ-   G列=『開始年月(Start)』  例:2023/5/1   H列=『終了年月(End)』   例:2023/5/31 ・入力ファイル名の例=科学登録者_23BB3001.xlsx            科学登録者_23BB3005.xlsx            科学登録者_23BB3405.xlsx ※拙い口足らずな説明となってしまいましたが、どうぞ宜しくお願い致します。

  • セルの値が同じ行を条件に従って行削除するマクロ

    A~E列までデータがあり 行数は約30,000行あります。 A列は半角英数字と-で桁数は11桁又は14桁です。 数字のみもあれば数字と英字の組み合わせもあります。 (英字はどこの桁にあるか何個あるかは不規則です) 例 ABCD123456789X 124345678901234 55555-55555 ABC12345DEF678 E列には半角の 1 か 2 しかありません。 A列が同じ値の行を検出して重複している行は1行だけ残して 後は行削除をしたいです。 行削除はE列の値によって判定したいです。 重複行は1つの値に対して何行あるか不明です。 30,000行のうち、重複行を削除すると10,000行くらいになる予定です。 (1)重複行にてE列の値が1だけの場合    どれでもいいので1行残して残りは行削除 (2)重複行にてE列の値が2だけの場合   どれでもいいので1行残して残りは行削除 (3)重複行にてE列の値が1も2もある場合   E列の値が2の行をどれでもいいので1行残して残りは削除 例 (1) 1234567890XXXX-1 1234567890XXXX-1 1234567890XXXX-1 ↓ 1234567890XXXX-1 (2) 123ABCDE901234-2 123ABCDE901234-2 ↓ 123ABCDE901234-2 (3) 12345678901234-1 12345678901234-2 ↓ 12345678901234-2 ABC45678901234-1 ABC45678901234-2 ABC45678901234-1 ABC45678901234-2 ↓ ABC45678901234-2 手作業では5時間かかりましたがミスだらけです。 まだ数ファイル残っており手作業では厳しいのでマクロを 作成したいのですが、どう記述していのかまったく検討が付きません。 どうかよろしくお願いします。

  • VBA 特定の行を別シートへコピー・削除

    下記のように、VBAで特定の行を抽出して別シートへコピーし、コピーした行については元リストデータを削除したいです。 具体的には、【出荷sheet】(C列注文番号は、出荷があった時に入力済)へ、注文番号に対応する行を【リストsheet】から抜き出してコピーし、コピー後は、【リストsheet】から該当行を削除したいです。 検索により調べてもうまく合致する回答が見当たらず困っています。 VBAの理解度は未熟ですが、何卒ご教授いただけると幸いです。 【リストsheet】 A列 B列  C列   D列 ・ ・ ・ J列 No. 日付 注文番号  品名 ・ ・ ・ ・ 1  1/1   A111   鉛筆  ・ ・ ・ ・ ←コピー後、削除  2   1/2   B222   ペン  ・ ・ ・ ・ 3    1/5  C555 消しゴム・ ・ ・ ・ ←コピー後、削除  ・ ・   ⇓ 【出荷Sheet】 A列 B列  C列   D列 ・ ・ ・ J列 No. 日付 注文番号  品名 ・ ・ ・ ・ 1  1/1 A111   鉛筆   ・ ・ ・ ・ 3   1/5   C555 消しゴム・ ・ ・ ・

  • <EXCEL>複数の条件を指定して抽出

    データの抽出に関して分からないことがありましたので質問させてください。 現在顧客管理表を作成中で、顧客リストから条件に合うデータを抽出し、 そのデータの個数を同シート内に表示させるような作りになっています。 そのひとつの数式が以下のような感じです。 =SUMPRODUCT((INDIRECT("C3"):C190="○支店")*(INDIRECT("D3"):D190="新規")*INDIRECT("A3"):A190) "範囲 B3:M190の顧客リストからC列(支店名)が『○支店』、かつD列(契約の種類) が『新規』のものを抽出し、個数を表示させる"・・・という数式なのですが、 (A列には、オートフィルにも対応させるため1を表示させる別の数式を入れています) この条件を"C列が『○支店』または『△支店』、かつD列が『新規』のものを抽出" と変えるには、どうすればいいのでしょうか・・・ 単純な内容なのかもしれませんが、教えていただけると助かります。 よろしくお願いします。

  • エクセルVBAによる、行の整理

     始めまして、よろしくお願いします。  シート1とシート2に次のようになっています。 シート1      A  B  C   1     2       ・      99      100 9     101 5     102 3       103 7    104        105   ・  ・ シート2      A  B  C   1     2       ・      99      100 9  3  4  ・・・・     101 5  3  2  ・・・・   102 3  1  0  ・・・・     103 7  5  3  ・・・・  104  105  106 9  ・・ 107 5  ・・ 108 3  ・・ 109 7  ・・ 110  111 9  ・・ 112 5  ・・ 113 3  ・・ 114 7  ・・ 115 116 ・  ・  ・  ・  シート1、シート2のA列にはデーター銘の番号が。シート2のB、C、D・・・列にはデーターが入っています。シート1のA列データー銘の番号の追加(データー銘番号1)、順番を変え、マクロを実行すると シート1      A  B  C   1     2       ・      99      100 3     101 7     102 1       103 9    104        105   ・  ・ シート2      A  B  C   1     2       ・      99      100 3  1  0  ・・・・     101 7  5  3  ・・・・   102 1       103 9  3  4  ・・・・  104  105  106 3  ・・ 107 7  ・・ 108 1   109 9  ・・ 110  111 3  ・・ 112 7  ・・ 113 1   114 9  ・・ 115 116 ・  ・  ・  ・ シート2の(100-103、106-109,111-114の3グループ)行ごとデーターすべてが、シート1A列のデーター銘番号順に整理したいと思います。実際は整理されるデーター銘番号や、行ごと(ここでは整理される100-103、106-109,111-114の3グループですが)の数はかなり多くなります。シート1で削除されたデーター銘番号は、シート2ではデーターすべてが削除されます。(ここではデーター銘番号5がそうです)  解る方、できる方、よろしくお願いします。

  • エクセルで複数の同じ列に文字がある行をまとめる

    エクセル2007です。 エクセルに300行のデータがあります。 各行には複数の列に文字がありますが全て同じ列に文字があるわけではありません。 1行にはA,B,D,K 2行にはC,S,T 3行にはB,C,K,N 4行にはD,F,G,O,P のように文字が入っていますがまったく同じ列に文字が入っている行があり、同じ列に文字が入っている行をまとめる事は可能でしょうか? 例えば 1行のA,B,D,Kと同じ列に文字の入っている他の行を2行目から続けて表示し、そのグループが終われば2行のグループが続くと言う具合です。 1行目のグループが最初で2行目のグループが2番目に来る必要はなくグループ分けが出来れば目的達成です。 具体的には色使い表があり行には製品番号、列には各色が表記されており個別の商品に使われている色の列に文字は入っています。 違う商品で同じ色使いがある物も多数あるのですが同じ色使いの商品をグループとしてまとめたいと言う希望があります。 素人でこの事が可能かどうかもわかりません。 いろいろ探しましたが答えが見つかりませんでしたのでお尋ねします。 以上宜しくお願い致します。

  • VBAの条件の書き方を教えてください。

    こんにちは。 現在、フォーマット同じ(件数が異なる)のデータファイルを取り込み、変換したファイルをアウトプットするマクロを作っています。 ここで、図のように列Cのデータをもとに、列Dのデータをそれぞれ列Eと列Fに振り分ける構文を教えてください。 VBAについては少しかじった程度です。よろしくお願いします。

専門家に質問してみよう