qii-yah
@qii-yah

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

エクセルVBA 1つのシートモジュールに複数のマクロを設定したときのエラー

解決したいこと

エクセルVBA 1つのシートモジュールに複数のマクロを設定したときのエラーを解消したいのです。

エクセルバージョン:365

###現在の設定概略
①処理済み移動処理を行う
②次にソースコード②の処理
③次に出荷の処理
という3つのマクロを設定しています。
(名前について臨時の名前ですので、おかしい箇所無視してください。)

それぞれのマクロに関連はありません。

発生している問題・エラー(全体で2か所)

エラー1:
<①処理済み移動処理を行う>
のマクロを実行すると
<②次にソースコード②の処理>のマクロについてのエラーがでます。
●<①処理済み移動処理を行う>のマクロは正しく完了します。

エラー2:
<②次にソースコード②の処理>
のマクロを実行すると
<③次に出荷の処理>のマクロについてのエラーがでます。
●<②次にソースコード②の処理>は正しく完了します。

<③次に出荷の処理>のマクロを実行した時にはエラーはでません。

ご存じの方いらっしゃいましたらお教えいただけます様よろしくお願い申し上げます。

0

1Answer

スクショを貼られた2箇所でエラーが発生するマクロ自身ですが、
スクショを見ると、どちらも、「受注リスト」シートのChangeイベントマクロだと思います。

Worksheet_Changeイベントは、ユーザが当シートのどこかのセルを更新した際に発生するイベントです。
ここで、確認なのですが、エラーが起きる下記マクロ処理において、「受注リスト」Worksheet_Changeイベントが発生することは、マクロ作者の意図通りの動作なのでしょうか?

エラー1:
<①処理済み移動処理を行う>
のマクロを実行する

エラー2:
<②次にソースコード②の処理>
のマクロを実行する

マクロ処理中に、他のイベントが発生することを前提として、イベント処理を書くことは、普通はしないと思います。複雑すぎますから。

もし、マクロ処理中の Worksheet_Changeイベントの発生が想定外であれば、グローバル変数を使って、「マクロ処理中は、Worksheet_Changeイベントは何もせず終わる」といった制御をすることで対応できると思います。

0Like

Comments

  1. @qii-yah

    Questioner

    @nak435 さま

    今回も迅速にご連絡いただきありがとうございます。
    以前、投稿方法で質問を修正してと教えていただいたのですが
    そうすると、慣れないせいか、全体の閲覧が難しかったので
    このコメントに返信させていただいております。

    ●エラーが起きる下記マクロ処理において、「受注リスト」Worksheet_Changeイベントが発生することは、マクロ作者の意図通りの動作なのでしょうか?

    ➡単純に、3つのマクロが<受注リスト>の特定のセルに変化が出た場合に実行するというものでしたので、記述しただけで、
    結果、こんな記述は弊害がでるようだと痛感しておりますが、
    深い意味は理解できておりません。

    ●もし、マクロ処理中の Worksheet_Changeイベントの発生が想定外であれば、グローバル変数を使って、「マクロ処理中は、Worksheet_Changeイベントは何もせず終わる」といった制御をすることで対応できると思います。

    ➡もしよろしけれあ、この方法を教えていただいてもよろしいでしょうか。

    不躾なお願いで申し訳ございません。
    よろしくお願い申し上げます。

  2. 以前、投稿方法で質問を修正してと教えていただいたのですが・・・

    今回はそれには当たらないと思いますので、ご心配なく。


    ➡もしよろしけれあ、この方法を教えていただいてもよろしいでしょうか。

    下図に示します。参考にしてください。

    scr1.png scr2.png
  3. @qii-yah

    Questioner

    @nak435 さま
    早速のご連絡ありがとうございます。
    教えていただいた方法は、
    現在、設定しているソースコードはそのままにして
    追加で設定するということになりますでしょうか?

    それとも、現在の設定方法を全て変更するということになるのでしょうか?
    <グローバル変数>が全く理解できていませんので
    まず、<グローバル変数>を調べてみてトライさせていただきます。
    結果を後日になるかも知れませんが、ご報告させていただきます。

  4. 現在、設定しているソースコードはそのままにして
    追加で設定するということになりますでしょうか?

    「追加」で実現できる内容です。

  5. 追加情報です。

    3つのマクロが<受注リスト>の特定のセルに変化が出た場合に実行するというものでしたので

    3つのマクロの起動の契機が、どれも「受注リスト」Worksheet_Changeイベントだけであるなら、(3つのマクロに手を入れる必要はなく、)Worksheet_Changeイベントだけで、対応することもできます。
    その場合は、以下のように、既存のWorksheet_Changeイベントの先頭と最後にコードを追加するだけです。(グローバル変数の定義は必要)

    「受注リスト」Worksheet
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        if inProgress then exit sub
        inProgress = True
    
        '
        '処理  
        '
    
        inProgress = False     '(途中でExitする場合も漏れなくリセットする必要がある)
    End Sub
    
  6. @qii-yah

    Questioner

    @nak435 さま
    本当にありがとうございます。
    実装を急いでおりましたので、(3つのマクロに手を入れる必要はない方法)にて設定したのですが、上手くいきませんでした。

    ●3つのマクロの起動の契機が、どれも「受注リスト」Worksheet_Changeイベントだけであるなら
    ➡起動の契機=「受注リスト」の特定のセルに値が入ったらという設定ですので
    ★マクロ①はセルA, マクロ②と③はセルM
    <3つのマクロの起動の契機が、どれも「受注リスト」Worksheet_Changeイベントだけである>と理解しているのですが、正しかったでしょうか?

    また、先ほど教えていただいたコードの上が
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    となっているのですが、
    元々は、
    Private Sub Worksheet_Change(ByVal Target As Range)
    となっておりました。
    この場合、入れ替えるという事でよかったでしょうか?

    ●グローバル変数の定義は、新しい標準モジュールで設定しましたが
    これで正しかったでしょうか?

    何度も申し訳ありません。

    よろしくお願い申し上げます。

  7. 実装を急いでおりましたので、(3つのマクロに手を入れる必要はない方法)にて設定したのですが、上手くいきませんでした。

    「質問時と同じエラーが 相変わらず起きる」ということですか?

    次のように、If文の前に MsgBox を入れて、ポップアップが出力されるタイミングと、値を調べてください。

    Private Sub Worksheet_Change(ByVal Target As Range)
        MsgBox prompt:="inProgress: " & inProgress & ", cell: " & Target.Address, Buttons:=vbOKOnly
        if inProgress then exit sub
        inProgress = True
    
    

    ➡起動の契機=「受注リスト」の特定のセルに値が入ったらという設定ですので
    ★マクロ①はセルA, マクロ②と③はセルM
    <3つのマクロの起動の契機が、どれも「受注リスト」Worksheet_Changeイベントだけである>と理解しているのですが、正しかったでしょうか?

    Worksheet_Changeイベントのすべてのコードを見せてもらっていないので、当方では判断できませんが、おそらく、そうなんだろうと理解しています。

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    となっているのですが、

    すみません、Worksheet_Changeの間違いです。

    ●グローバル変数の定義は、新しい標準モジュールで設定しましたが
    これで正しかったでしょうか?

    正しいです

  8. @qii-yah

    Questioner

    @nak435 さま

    おはようございます。
    引続きのアドバイスありがとうございます

    ●質問時と同じエラーが 相変わらず起きる」ということですか?
    ➡はい。同じエラーが変わらず発生しております。

    発生タイミングは、マクロに設定した値を入力した時点で発生しました。
    画像を添付させていただきます。

    よろしくお願い申し上げます。

  9. @qii-yah

    Questioner

    @nak435 さま
    何度も申し訳ありません。
    念の為、全体ソースも送信させていただきます。
    よろしくお願い申し上げます。

  10. ➡はい。同じエラーが変わらず発生しております。
    発生タイミングは、マクロに設定した値を入力した時点で発生しました。
    画像を添付させていただきます。

    ポップアップ表示は、このときの一回だけでしょうか?(inProgress: False, cell: M3)
    その後に、エラー2のエラーが発生しているなら、これまで想定していた動作とは違うことになります。(『マクロ処理中に再びWorksheet_Changeイベントが発生している』と想定)

    ●3つのマクロの起動の契機が、どれも「受注リスト」Worksheet_Changeイベントだけであるなら

    ★マクロ①はセルA, マクロ②と③はセルM

    貼っていただいた全体ソースから、
    マクロ①:Call 処理済み注文シート移動処理(Target.row)
    マクロ②と③:Call文が見当たりません。どこで呼び出しているのでしょうか?

  11. @qii-yah

    Questioner

    @nak435 さま
    お待たせしてしまい申し訳ありませんでした。
    まず、先ほどの報告は漏れが多かったです。(申し訳ありません)
    実際の動きは、
    例えばマクロ①を実行した際に(該当セルに値が入力した時点)
    ポップアップ表示は3回、次にデバッグ画面2回、最後にマクロリセットボタンを
    クリック後、終了するという流れでした。
    (マクロ①の内容自体は正常に終了できております。)
    ・一連の画像を添付させていただきます。

    ●マクロ②と③:Call文が見当たりません。どこで呼び出しているのでしょうか?

    ➡マクロ②と③の必要なアクション記述は当シート<受注リスト>に全て記述しましたので必要だとは知りませんでしたので、設定しておりませんでしたが
    必要なものでしょうか?
    本当に初心者レベルで申し訳ございません。

    引き続きよろしくお願い申し上げます。

  12. @qii-yah

    Questioner

    @nak435 さま
    マクロ③についてもご報告させていただきます。
    ポップアップ表示は1回、次にデバッグ画面はなく、
    想定外のメッセージクリック後、マクロが正常に実行され
    終了するという流れでした。

  13. マクロ①について、回答します。マクロ②と③は後に回答します。

    例えばマクロ①を実行した際に(該当セルに値が入力した時点)
    ポップアップ表示は3回、次にデバッグ画面2回、最後にマクロリセットボタンを
    クリック後、終了するという流れでした。

    ↓スクショにコメント書きましたので、ご確認ください。

    scr3.png

    その後の「4回目の表示」も関連が分からず、理解が追い付きません。

  14. @qii-yah

    Questioner

    @nak435 さま

    煩雑で申し訳ありません。
    画像を返信させていただきます。

    よろしくお願い申し上げます。

  15. @qii-yah

    Questioner

    @nak435 さま

    大変お世話になりありがとうございます。
    解決したようです。
    各マクロが関連しないので再度調べ、ダメ元で試しました
    そうすると
    ①各マクロの処理が完了したら、Exit Subを使用してその時点でサブルーチンを終了させる。
    ②各処理の最後に inProgress = False を設定し、状態フラグをリセットする。
    ということで以下のソースができあがりました。
    エラー等は発生せず、3つのマクロが正常に動作できました!
    ●ただ、教えていただいたポップアップを設定していると
    ポップアップが出てくる場面もあるので
    これはエラーになるのでしょうか?
    出現画面例を添付させていただきます。

  16. マクロ②と③についてです。

    ●マクロ②と③:Call文が見当たりません。どこで呼び出しているのでしょうか?

    ➡マクロ②と③の必要なアクション記述は当シート<受注リスト>に全て記述しましたので必要だとは知りませんでしたので、設定しておりませんでしたが
    必要なものでしょうか?

    私は、このExcelファイルの全体像を理解している訳ではなく、冒頭の質問をきっかけに、やりとりで得た情報だけした分かりません。

    冒頭の質問文

    ①処理済み移動処理を行う
    ②次にソースコード②の処理
    ③次にスコア出荷の処理
    という3つのマクロを設定しています。

    より、
    3つのマクロは どれも「受注リスト」Worksheet_Changeイベントから呼び出していると理解したのですが、そうでないということであれば、事実を教えてください。

    『マクロ②と③の必要なアクション記述は当シート<受注リスト>に全て記述しました』とは、マクロ②と③を別マクロとして独立して定義しているわけではなく、Worksheet_Changeイベント内に処理コードを書いている、と、いうことでしょうか?

    コードを見ると、

        ' ②次にソースコード②の処理
        ' 対象セルが列Mの変更でない場合は終了
        If Target.Column = 13 Then
            ' 「微微手配済」と一致しない場合は終了
            If Target.Value = "微微手配済" Then
    

    と、

         ' ③次にスコア出荷の処理
        ' 対象セルが列Mの変更でない場合は終了
        If Target.Column = 13 Then
            ' 「完了スコア」と一致しない場合は終了
            If Target.Value = "完了スコア" Then
    

    が、直列に書かれているので、
    「②次にソースコード②の処理」の次に、「③次にスコア出荷の処理」が実行されますが、
    本来は、②か③のどちらかを実行、もしくはどちらも実行しない が期待した動作ではないでしょうか?
    もし、そうであれば、次のコードに書き換えるとよいと思います。

        ' 対象セルが列Mの変更でない場合は終了
        If Target.Column = 13 Then
    
            ' ②次にソースコード②の処理
            ' 「微微手配済」と一致しない場合は終了
            If Target.Value = "微微手配済" Then
        
    
                ' 「微微手配済」の処理
    
    
                ' メッセージを表示(必要に応じて)
    	        MsgBox "微微からの発送リスト準備が整いました。次に商品の色と画像を設定してください。"
    
        
             ' ③次にスコア出荷の処理
            ElseIf Target.Column = 13 Then
                ' 「完了スコア」と一致しない場合は終了
                If Target.Value = "完了スコア" Then
    
        
                '「完了スコア」の処理
    
            
            End If
        
        End If
    
        inProgress = False     '(途中でExitする場合も漏れなくリセットする必要がある)
    End Sub
    

    もし、①も含めて、①か②か③のどれかを実行、もしくはどれも実行しない が期待した動作ならば、次のコードに書き換えるとよいと思います。

    
        If Not Intersect(Target, Me.Columns("A")) Is Nothing Then
    
            ' ①処理済み移動処理を行う
            If IsDate(Target.Value) Then
                ' 入力された行を処理
                Call 処理済み注文シート移動処理(Target.Row)
            End If
    
    
        ' 対象セルが列Mの変更でない場合は終了
        ElseIf Target.Column = 13 Then
    
            ' ②次にソースコード②の処理
            ' 「微微手配済」と一致しない場合は終了
            If Target.Value = "微微手配済" Then
        
    
                ' 「微微手配済」の処理
    
    
                ' メッセージを表示(必要に応じて)
    	        MsgBox "微微からの発送リスト準備が整いました。次に商品の色と画像を設定してください。"
    
        
             ' ③次にスコア出荷の処理
            ElseIf Target.Column = 13 Then
                ' 「完了スコア」と一致しない場合は終了
                If Target.Value = "完了スコア" Then
    
        
                '「完了スコア」の処理
    
            
            End If
        
        End If
    
        inProgress = False     '(途中でExitする場合も漏れなくリセットする必要がある)
    End Sub
    
  17. @qii-yah

    Questioner

    @nak435 さま

    本当に面倒なことにお付き合い、アドバイスいただきありがとうございます。
    私は、それぞれの記述の意味もしっかり理解しないまま続いておりました。
    再度、やりたいこと、記述内容を整理し
    ご報告させていただきます。

  18. 解決したようです。
    各マクロが関連しないので再度調べ、ダメ元で試しました
    そうすると
    ①各マクロの処理が完了したら、Exit Subを使用してその時点でサブルーチンを終了させる。
    ②各処理の最後に inProgress = False を設定し、状態フラグをリセットする。
    ということで以下のソースができあがりました。
    エラー等は発生せず、3つのマクロが正常に動作できました!
    ●ただ、教えていただいたポップアップを設定していると
    ポップアップが出てくる場面もあるので
    これはエラーになるのでしょうか?
    出現画面例を添付させていただきます。

    ↑この情報を見落としていました。すみません。

    Exit Subの追加、inProgress = False も正しいと思います。結果的に先に答えた、ElseIf と同様の効果です。

    ポップアップが出ること自体は、問題ありません。追加したMsgBoxの1行を削除してもらえればよいです。

  19. @qii-yah

    Questioner

    @nak435 さま

    ご連絡ありがとうございます。
    ポップアップがでてくることが不安でしたが
    お陰様で安心できました。
    いつも、細かく的確にアドバイスいただき
    心より感謝しております。
    取り急ぎ御礼申し上げます。

  20. 次のように、If文の前に MsgBox を入れて、ポップアップが出力されるタイミングと、値を調べてください。

    どのように動いているのかを知るために入れてもらいました。デバッグ技法の一つでした。
    解決してなによりです。

  21. @qii-yah

    Questioner

    @nak435 さま

    ご連絡ありがとうございます。
    教えていただいた<ポップアップ>ですが
    これで動きが見れると、本日初めて知り
    本当に勉強になりました。
    エラーがでると、ただそれだけで焦ってしまうレベルですが
    @nak435さまのアドバイスで
    どんどんステップアップできている気がしています。
    もっと学習いたしますが、
    今後とも、よろしくお願い申し上げます。

Your answer might help someone💌