プロが教える店舗&オフィスのセキュリティ対策術

【至急】
当方初心者です。
マクロについて知恵をお貸しください。

★したい動作
①リストE列2行目から(1行目は項目名の為)、【残したい文字列】を含まない行の削除
②リストc列2行目から(1行目は項目名)、【消したい文字列】を含む行を削除

上記、①のみで組んだところ動作確認が出来ましたが、続けて②の動作を行いたい場合、どのように繋げるとよろしいのでしょうか。

A 回答 (4件)

こんにちは



横から失礼します。

>②と①は逆でもいいし、とにかく融合させたいんです。
①のマクロ と ②のマクロ が既にできていて、まとめて実行したいということでしょうか?

であるなら、同じモジュールに新たに

 Sub まとめて実行()
  Call ①のマクロ
  Call ②のマクロ
 End Sub

というものを作成しておいて、このマクロを実行すれば、記述した順に処理されます。
(上記の例では、①→②の順に実行されます)


※ 意味が違っていたらスルーしてください。
    • good
    • 0
この回答へのお礼

解決しました

説明が下手で尚且つ知識不足にも関わらず、大変細かく記載頂きありがとうございました!
そもそも支持のつなげ方?というか、ひとつのモジュールの中に複数の指示を入れ込む方法がわからなかったのですが、無事3つ目のサンプルで理想の形になりました!
本日中に作成する必要がありましたので、大変助かりました!!
本当にありがとうございましたm(*_ _)m

お礼日時:2022/09/30 19:59

>②と①は逆でもいいし、とにかく融合させたいんです。

伝わりますでしょうか…
作る側でなく使う側になりたいと言う事かな?

>①のみで組んだところ動作確認が出来ました
なので全回答をしなかったけれど・・
(意地悪ではけして無く、色々試して解決してほしいだけなのですけれど)

何処で躓いているか教えてくれるといいんだけれど・・
>複数の列に対して、これ以外を消す、これ以外を残すといった指示が可能なのでしょうか。ここかな?
行を削除するのだから出来ますよ(同じ行の他のセル消せるから)
あ、If文かな?
回答している条件式の列ナンバーを変更すれば・・出来ませんか?

こんなやり取りしても無駄になるかも知れませんので
今回はサンプルを試してみてください。処理できるもので理解する方が良いかも・・?

処理結果が同じになるサンプル3つですが希望としては・・理解できるものを使ってくださいね

①を処理した後に②の処理を行う
Sub Example1()
Dim i As Long
With ActiveSheet
Application.ScreenUpdating = False
For i = .Cells(.Rows.Count, 5).End(xlUp).Row To 2 Step -1
If InStr(.Cells(i, 5), "【残したい文字列】") = 0 Then
.Rows(i).Delete
End If
Next
For i = .Cells(.Rows.Count, 3).End(xlUp).Row To 2 Step -1
If InStr(.Cells(i, 3), "【消したい文字列】") > 0 Then
.Rows(i).Delete
End If
Next
Application.ScreenUpdating = True
End With
End Sub

①と②の条件で分岐 (Or)
Sub Example2()
Dim lastRow As Long
Dim i As Long
With ActiveSheet
lastRow = WorksheetFunction.Max(.Cells(.Rows.Count, 3).End(xlUp).Row, .Cells(.Rows.Count, 5).End(xlUp).Row)
Application.ScreenUpdating = False
For i = lastRow To 2 Step -1
If InStr(.Cells(i, 5), "【残したい文字列】") = 0 Or InStr(.Cells(i, 3), "【消したい文字列】") > 0 Then
.Rows(i).Delete
End If
Next
End With
Application.ScreenUpdating = True
End Sub

纏めてメイン処理をする
Sub Example3()
Dim i As Long
Dim rng As Range
With ActiveSheet
For i = 2 To WorksheetFunction.Max(.Cells(.Rows.Count, 3).End(xlUp).Row, .Cells(.Rows.Count, 5).End(xlUp).Row)
If InStr(.Cells(i, 5), "【残したい文字列】") = 0 Or InStr(.Cells(i, 3), "【消したい文字列】") > 0 Then
If rng Is Nothing Then
Set rng = .Cells(i, 1).EntireRow
Else
Set rng = Union(rng, .Cells(i, 1).EntireRow)
End If
End If
Next
End With
Application.ScreenUpdating = False
'メイン
If Not rng Is Nothing Then rng.Delete
Application.ScreenUpdating = True
End Sub
    • good
    • 0

条件を整理してみましょう


①【残したい文字列】が有ったら残す
②【消したい文字列】が有ったら消す

③【残したい文字列】を含むセルに【消したい文字列】が有ったら・・
どうする?

ご質問では①を行って次に②を行う としていますね
つまり、③は 消すになります

対象セルがA列でループ範囲の例

If InStr(Cells(i, 1), "【残したい文字列】") = 0 Or InStr(Cells(i, 1), "【消したい文字列】") > 0 Then
.Rows(i).Delete

行削除の例ですが
参考サイトのように1行ずつ消す場合は下の行から行います

または、unionメソッドでrangeオブジェクトをまとめ 1度に削除する方法があります。
(こちらの方が処理速度が速く、よく使います)
ご質問部分ではないので、自身で調べてみましょう
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!
仰る通りですが、
②と①は逆でもいいし、とにかく融合させたいんです。
伝わりますでしょうか…

お礼日時:2022/09/29 22:33

こんばんは


続けて②の動作と言うより、作成した条件に②の条件を加えれば良いのでは
そうすれば、削除は1度で済むと思います
①のコードを貼ると現在の内容が分かり易いかもですね
    • good
    • 0
この回答へのお礼

迅速なご回答ありがとうございます!
使用のものを貼り付けると文字数オーバーでした…。
疑問なんですが、複数の列に対して、これ以外を消す、これ以外を残すといった指示が可能なのでしょうか。
無知で大変申し訳ございません。

ちなみに参考にさせていただいたのは下記サイトです。https://kirinote.com/excelvba-without-rowdel/

お礼日時:2022/09/29 19:15

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