• ベストアンサー

Excel VBA Sheet2で指定した条件でSheet1の行削除

Sheetが2つあるExcelブックがあります。 Sheet2で検索条件(列とキーワード)を指定し、 この条件でSheet1を検索、 Sheet1で検索にヒットした行を行削除したいと考えています。 汎用性を高める為、Sheet2で指定する検索条件は可変とし、 検索対象とする列とキーワードは任意のものを必ず指定(""は無し)。 列&キーワードをひとつの検索条件として、 Sheet2の2行目~最終行までLoopしたいのです。 InStrを使用するなど、部分的には分かるのですが、 2つの条件を同時に変えながらLoopさせる方法が 色々試してみましたが、どうしても分かりません。 VBAに詳しい方、同様の処理をしたことがある方、 どうか助けてください!宜しく御願い致します。 [Sheet1] ・・・ 元データ     A   B   C ---------------------------- 1   あ ---------------------------- 2   い   該当 ---------------------------- 3   う       閉鎖 ---------------------------- 4   え   該当 ---------------------------- 5   お ---------------------------- [Sheet2] ・・・ 行削除する範囲とキーワードを指定。     A   B ---------------------------- 1   列   キーワード ---------------------------- 2   A   あ ---------------------------- 3   B   該当 ---------------------------- 4   C   閉鎖 ---------------------------- [求めている結果] 1, 2, 3, 4行目が削除される

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

  • ベストアンサー
  • pkh4989
  • ベストアンサー率62% (162/260)
回答No.1

以下のマクロを参考にしてください。 Sub 削除()   Dim mR     As Long   Dim cR     As Long   Dim wR     As Long   Dim shtC    As Worksheet   Dim shtM    As Worksheet      Set shtM = Worksheets("Sheet1")   '元データ   Set shtC = Worksheets("Sheet2")   '条件データ   '条件データの最大行数を求める   cR = shtC.Range("A" & Rows.Count).End(xlUp).Row   '条件データをLoop   For Each c In shtC.Range("A2:A" & cR)     '元データの最大行数を求める     mR = shtM.Range("A" & Rows.Count).End(xlUp).Row     For wR = mR To 1 Step -1       If shtM.Cells(wR, toR1C1(c)) = c.Offset(0, 1) Then         '削除         shtM.Rows(wR).Delete       End If     Next   Next End Sub '行ABC→123に変換 Function toR1C1(ByVal wAlpha As String) As Integer   Dim wStr      As String   wStr = Application.ConvertFormula("$" & wAlpha & "$1", xlA1, xlR1C1)   toR1C1 = Mid(wStr, InStr(1, wStr, "C") + 1) End Function

conguitos
質問者

お礼

pkh4989 様 迅速で明快なご回答、有難うございました! 見事に一発解決です。 まさか翌朝までに解決方法をアドバイスして頂けるとは 思っていなかったので感動しました。(T-T 実はExcelでVBAを扱うのは初めてで、 かれこれ1カ月あちこち調べましたが、 SheetやCell、Loopの考え方がいまいち理解出来ませんでした。 教えて頂いた方法で出来たことにまず感動していますが、 これからじっくりこの処理の仕組みを勉強したいと思います。 私の職場には、これまで同様の処理を手作業で大量にこなしてきた 事務の方が大勢居て、これで大勢の方を助けてあげることが出来ます! ありがとうございました。

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

質問を見ると、考えが整理されていないと思う。 スキルとしては、2つのシートを扱うとき、両者は区別して、コードを書かないといけないがわかっていますか。 Set Sh1=Worksheets("Sheet1") のようにSheet1,Sheet2を2つ定義する。 -- 後はSheet1の最下行、Sheet2の最数行を捉える方法わかりますか。例えばd1=Sh1.Range("A65536").End(xlUp).Row Sheet2も同じ。 ーー Sheet2の各行をForNextで繰り回し、有る1行で Sheet1の全行についてB列が「該当」かなど聞く。 (初等的な方法だがまずこれを考え、後に学習が進んでFindメソッドなど考える) ーーー B列が「該当」は Sheet1  のB3が「該当」 Sheet2のA2 「B」、B2が「該当」として Sub test01() Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") i = 2 j = 3 MsgBox sh1.Cells(j, "B") MsgBox sh2.Range(sh2.Cells(i, "A") & i) If sh1.Cells(j, "B") = sh2.Range(sh2.Cells(i, "A") & i) Then MsgBox "該当アリ " End If End Sub のようにすると、Sheet2のA,B列の対の変化の書き方を一般化できる。 ForNextを使うときは、行削除は、下から上に処理するほうが考えやすい。

conguitos
質問者

お礼

imogasi様 ご回答有難うございました。 >2つのシートを扱うとき、両者は区別して、コードを書かないといけないがわかっていますか。 仰るとおり!区別が必要なのは分かっていたので、 この部分はSheetをActivateで切り替えて処理しようとして コードの書き方がまずいのか上手くいきませんでした。 条件データを変数に代入するにしても、条件が可変だし、 どこでSheetを切り替えたら良いのか?等と試行錯誤していました。 下にも書いた様に、 根本的にVBAでSheetの扱い方などが分からなかったところが 行き詰まってしまった原因だと思うので、 今回教えて頂いたことをしっかり勉強したいと思います。 ありがとうございました。