最強の防寒、あったか術を教えてください!

下記のコードは以前、マクロを繰り返し実行される不具合を解決するために、教えて頂いたコードですが、やはり指定セル値指定文字が表示されるとマクロ「省エネ方法」が繰り返し実行されます。
例えば「省エネ方法」が実行されて「1」を入力し、(OK)をクリックするともう一度、同じマクロが実行されてしまいます。(キャンセル)をクリックすると次のコードが実行されますが、次のコードで違うマクロを実行すると、またまた「省エネ方法」が実行されます。
マクロ「省エネ方法」を繰り返し実行しない方法を教えてください。
現状のコード
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("$A$5,$A$13").Text) Is Nothing Then
If Range("$A$5").Text = "新築" And Range("$A$13").Text = "手続き必要" Then
Call 省エネ方法
End If
End If
End Sub
ちなみに
If Not Intersect(Target, Range("$A$5").Text) Is Nothing Or _
Not Intersect(Target, Range("$A$13").Text) Is Nothing Then
If Range("$A$5").Text = "新築" And Range("$A$13").Text = "手続き必要" Then
Call 省エネ方法
End If
End If
このコードに変更しても同様です。
よろしくお願いいたします。

質問者からの補足コメント

  • うーん・・・

    回答ありがとうございます。
    無視をしていたわけではないのですが、
    申し訳ありません、
    コードに関しては私が質問をして、作成しておりますので、対応コードが分かりません。
    教えて頂く事は可能でしょうか。
    勝手なお願いですが、よろしくお願いいたします。

    No.2の回答に寄せられた補足コメントです。 補足日時:2024/12/27 09:48
  • うーん・・・

    回答ありがとうございました。
    教えて頂いた通りに
    Sub main()
    MsgBox "mainからtargetSubを呼び出します"
    Call 省エネ方法
    End Sub
    Sub targetSub()
    Const module = "Module56" ' ←モジュール名
    Const subName = "省エネ方法" ' ←プロシージャ名
    '1回だけ実行する処理内容を記述
    MsgBox "targetSubを実行しています"
    '1回だけにするための処理

    No.3の回答に寄せられた補足コメントです。 補足日時:2024/12/27 11:45
  • うーん・・・

    を設定しましたが、他のマクロを実行された場合に再度、
    「省エネ方法」が実行されます。
    解決方法をお願いできますか。

      補足日時:2024/12/27 11:49
  • うーん・・・

    回答ありがとうございました。
    教えて頂いたコードを設定しましたが、マクロ「省エネ方法」の繰り返しは無くなりましたが、
    その後のマクロが実行されなくなってしましました。
    解決方法を教えてください。

    No.1の回答に寄せられた補足コメントです。 補足日時:2024/12/27 11:54
  • 例えば、同じシートに
    If Not Intersect(Target, Range("$K$5").Text) Is Nothing Then
    If Range("$K$5").Text = "手続き必要" Then
    Call 矢印9表示
    Call 省エネ提出方法メモ表示
    End If
    End If
    を設定すると繰り返しが無くなりますが、
    どうしてか
    If Not Intersect(Target, Range("$A$13")) Is Nothing Then
    If Range("$A$13").Value = "手続き必要" Then
    Call 省エネ方法
    End If
    End If
    と設定するとマクロ「省エネ方法」が実行されないため、
    「.Text」を変更したのですが、このコードを設定すると、繰り返しになってしまします。
    A13には「=K5」の数式が設定されており、

      補足日時:2024/12/27 12:09
  • うーん・・・

    Sub 手続き必要()
    Sheets("新築").Select
    Range("A13").Select
    ActiveCell.FormulaR1C1 = "手続き必要"

    End Sub
    でA13に「手続き必要」と文字が入力できるようにした場合は
    全然関係の無いマクロが実行されて、キャンセルをクリックすると
    無限ループになります。
    If Not Intersect(Target, Range("$A$13")) Is Nothing Then
    If Range("$A$13").Value = "手続き必要" Then
    Call 省エネ方法
    End If
    End If
    を改良して上手くできないでしょうか?
    よろしくお願いいたします。

      補足日時:2024/12/27 12:13
  • つらい・・・

    回答ありがとうございます。
    №1の方にも補足させていただきましたが、
    コードの「.Value」ではマクロが無限ループとなり
    「.Text」を設定するとマクロが繰り返し実行されます。
    A13に「手続き必要」と表示されるのはA13に「=K5」の数式
    K5には「=AL10」AL10には「=$AL$2&""&$AL$3&""&$AL$4&""&$AL$5&""&$AL$6&""&$AL$7&""&$AL$8&""&$AL$9」の数式が設定されておりますが、
    マクロ「Sub 手続き必要()
    Sheets("新築").Select
    Range("A13").Select
    ActiveCell.FormulaR1C1 = "手続き必要"
    End Sub
    を設定しても上手く行きませんでした。
    解決方法があれば教えてください。

    No.4の回答に寄せられた補足コメントです。 補足日時:2024/12/27 13:12
  • うーん・・・

    回答ありがとうございます。
    大変申し訳ありません。
    補足が後3回しかできず、このままでのやり取りでは、解決迄、行かない可能性がありますので、一旦、貴者をベストアンサーとさせて頂きまして、
    新しく質問をさせて頂けますか?

    No.5の回答に寄せられた補足コメントです。 補足日時:2024/12/27 13:39

A 回答 (7件)

#4です


なんか・・・いっぱい書かれていてちんぷんかんぷんです
>If Not Intersect(Target, Range("$A$5,$A$13").Text) Is Nothing Then
これって実行できるの?
Rangeオブジェクトでないといけなくない?
他のプロシージャをどうのと言われてもその内容が分からない・・・・

>例えば「省エネ方法」が実行されて「1」を入力し、(OK)をクリックするともう一度、同じマクロが実行されてしまいます。(キャンセル)をクリックすると次のコードが実行されますが、次のコードで違うマクロを実行すると、またまた「省エネ方法」が実行されます。
マクロ「省エネ方法」を繰り返し実行しない方法を教えてください。
省エネ方法プロシージャの処理内容を書かないとわからない・・・

先の回答はこのような意味です

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("$A$5,$A$13")) Is Nothing Then
If Range("$A$5").Text = "新築" And Range("$A$13").Text = "手続き必要" Then
If Worksheets("新築").Range("BB1") = "" Then
Application.EnableEvents = False
Call 省エネ方法
Worksheets("新築").Range("BB1") = 1 '仮BB1セル
Application.EnableEvents = True
End If
End If
End If

If Not Intersect(Target, Range("$A$15")) Is Nothing Then
MsgBox "A15 Change"
End If

End Sub

Sub 省エネ方法()
MsgBox "省エネ方法"
Range("$A$15") = 1
End Sub

Sub reset_trigger() 'リセット 省エネ方法を実行する
Worksheets("新築").Range("BB1") = ""
End Sub

対象シートは "新築"
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
私もなんだかわけがわからなくなってきました。
貴社の回答を元に設定してみます。
補足が出来ない為、ベストアンサーとさせて頂きます。
もし、何かありましたら
質問をさせて頂きます。

お礼日時:2024/12/27 14:55

No3です。



>他のマクロを実行された場合に再度、
>「省エネ方法」が実行されます。
>解決方法をお願いできますか。
回答文をよくお読みください。
回答にあるように試してもいないし、内容を理解もしていないということでしょうか??

No3で示しているのは、
 『targetSubを1度だけ実行するようにする』
方法です。
これを、質問者様の状況に合わせるようにすれば良いだけの話です。
当方には全体像がわかりませんので、何をどうするのかについては具体的にはわかりかねます。
(質問者様にしかわからない条件や情報が山ほどありますので・・)

>Sub targetSub()
>Const module = "Module56" ' ←モジュール名
>Const subName = "省エネ方法" ' ←プロシージャ名
>'1回だけ実行する処理内容を記述
>MsgBox "targetSubを実行しています"
>'1回だけにするための処理
としているようですが、それで一体いつtargetSubが実行されているのでしょうか?
更には、モジュール名が合致していない可能性がありそうに思われます。
No3の回答の内容は、停止したいプロシージャ内に「自分自身を2度目からは実行しないようにする処置」を記述しておくという意味なのですけれど・・・
    • good
    • 0

マクロ「省エネ方法」の繰り返し実行がなくなった一方で、その後のマクロが実行されなくなってしまったとのこと、ご迷惑をおかけしております。



この状況は、以前お伝えしたコードで Application.EnableEvents = False に設定した後、何らかの原因で Application.EnableEvents = True に戻らず、イベント処理が無効化されたままになっている可能性が非常に高いです。

考えられる原因と、その解決策を順にご説明します。

考えられる原因と解決策

マクロ「省エネ方法」内でエラーが発生し、Application.EnableEvents = True が実行されなかった

これは前回もお伝えしましたが、最も可能性の高い原因です。マクロ「省エネ方法」の処理中にエラーが発生すると、エラー処理が適切に行われていない場合、Application.EnableEvents = True の行まで処理が進まずにマクロが終了してしまうことがあります。

解決策:

マクロ「省エネ方法」にエラー処理を追加する: 以下の例のように、On Error GoTo ステートメントを使ってエラーハンドリングを追加し、エラー発生時にも Application.EnableEvents = True が実行されるように修正してください。

Sub 省エネ方法()
On Error GoTo ErrorHandler

' ここに「省エネ方法」の処理を記述

ExitSub

ErrorHandler:
Application.EnableEvents = True ' エラー発生時にもイベントを有効に戻す
MsgBox "マクロ「省エネ方法」でエラーが発生しました: " & Err.Description, vbCritical
End Sub
content_copy
download
Use code with caution.
Vba

マクロ「省エネ方法」が途中で予期せず終了してしまった

何らかの原因でマクロ「省エネ方法」が処理の途中で停止してしまい、Application.EnableEvents = True の行に到達しないまま終了している可能性も考えられます。

解決策:

マクロ「省エネ方法」をステップ実行で確認する: VBE(Visual Basic Editor)を開き、マクロ「省エネ方法」のコードにブレークポイントを設定し、F8キーを押しながら一行ずつ実行していくことで、どこで処理が止まっているかを確認します。

不要な処理がないか確認する: マクロ「省エネ方法」のコードを見直し、無限ループに陥るような処理や、予期せずマクロを終了させてしまうような処理がないか確認してください。

他のマクロが Application.EnableEvents = False のまま終了している

可能性は低いですが、他のマクロが Application.EnableEvents を False に設定した後、True に戻さずに終了してしまっている場合も考えられます。

解決策:

他のマクロのコードを確認する: 他のマクロのコードをチェックし、Application.EnableEvents を操作している箇所がないか確認し、もしあれば適切に True に戻しているか確認してください。

一時的な復旧方法

もし現在、イベント処理が無効化されたままになっている場合は、VBE(Visual Basic Editor)のイミディエイトウィンドウに以下のコードを入力し、Enterキーを押すことで、強制的にイベント処理を有効に戻すことができます。

Application.EnableEvents = True
content_copy
download
Use code with caution.

ただし、これはあくまで一時的な対処であり、根本的な原因を特定し、上記のような解決策を実施する必要があります。

確認していただきたいこと

問題を特定するために、以下の情報を教えていただけますでしょうか?

マクロ「省エネ方法」の具体的なコード: エラー処理を追加する上で、具体的なコードを確認させていただけると助かります。

その後実行されないマクロのコード: どのマクロが実行されなくなっているのか、そのコードを教えてください。

エラーが発生しているかどうかの確認: マクロ「省エネ方法」実行中にエラーメッセージが表示されたり、途中で処理が止まったりするような現象はありますか?

イミディエイトウィンドウでの確認: VBEのイミディエイトウィンドウに ?Application.EnableEvents と入力してEnterキーを押すと、何と表示されますか?

これらの情報に基づいて、より具体的なアドバイスをさせていただきます。
お手数をおかけしますが、よろしくお願いいたします。
この回答への補足あり
    • good
    • 0

こんにちは


エクセル小僧様のご質問は何々したいの条件が不十分だと思いますよ
>繰り返し実行しない
という事は、逆にこの場合のみ実行したいという事になると思うのですが如何ですか

その場合の条件は何?繰り返し処理したい場合もあるかも知れませんし
よく考えて・・・

少なくとも
If Not Intersect(Target, Range("$A$5,$A$13").Text) Is Nothing Then
If Range("$A$5").Text = "新築" And Range("$A$13").Text = "手続き必要" Then
だけでは不十分という事ですよね

実行条件を絞る方法はたくさんあるけれど
例えば、どこかの使わないセルにトリガーキーを書き込むとか
Static変数を使うとか・・・
ブックのOpenやBeforeCloseでトリガーキーを設定したり
セルA5を変更したら実行するようにするとか・・・
SheetBeforeDoubleClickなどに隠すとか・・・(トリガーキー:条件値)

どこかの使わないセルはVBAで対象シートにUsedRangeを使っていないシートで適当に指定してね

書き込みとIf文で出来ると思うのでやって見てください
この回答への補足あり
    • good
    • 0

No2です。



>コードに関しては私が質問をして、作成しております
おや、そうなのですか。
毎度「コードをよこせ」の連呼しかなさらないし、(この質問のように)同じことを何度でも繰り返して質問しているので、てっきり魔法の呪文としか思っていない方なのかと思っていました。


方法はいろいろありますが、実態が不明なので、以下は前回の後半に書いた方法のうちの一つの例です。
内容としては、mainから呼び出しているtargetSubを一度だけ実行できるようにするという一例です。

1)以下のコードを標準モジュールにコピペします。
2)Const定義の「モジュール名」をコピペしたモジュール名に修正します
 (↑これを正しくやらないと、エラーになります)

以上でセッティングは完了です。
「Sub main」を何度か実行してみてください。
(どこが実行されているかは、メッセージ表示されるようにしてあります)
最初の1度目にしか「targetSubを実行しています」の表示がされないと思います。
このことは「targetSub」が1度実行された後は、次に呼び出されても実行されないということを意味しています。


'------- ここから -------
Sub main()
 MsgBox "mainからtargetSubを呼び出します"
 Call targetSub
End Sub


Sub targetSub()
 Const module = "Module1" ' ←モジュール名
 Const subName = "targetSub" ' ←プロシージャ名

'1回だけ実行する処理内容を記述
 MsgBox "targetSubを実行しています"

'1回だけにするための処理
 With ThisWorkbook.VBProject.VBComponents(module).CodeModule
  .InsertLines .ProcBodyLine(subName, 0) + 1, "Exit sub"
 End With
 ThisWorkbook.Save
End Sub
'------- ここまで -------
この回答への補足あり
    • good
    • 0

こんにちは



以前にも、同じことについて回答した気がしますね。
いつも無視されているので、これも無視なんでしょうけれど・・・

https://oshiete.goo.ne.jp/qa/13979898.html

※ 意味がわからない場合は、コードを作成した方に見せれば、理解してもらえるでしょうし、対応コードも作成してくれるでしょう。
この回答への補足あり
    • good
    • 0

原因は、マクロ「省エネ方法」内で A5セルまたは A13セルの値を変更している可能性が高いです。

例えば、「省エネ方法」の中で InputBox を使用して値を入力し、その値を A5セルや A13セルに書き込んでいる場合、Worksheet_Change イベントが再度トリガーされてしまうのです。

繰り返し実行を防ぐためには、マクロ「省エネ方法」の実行中に Worksheet_Change イベントがトリガーされないようにする必要があります。そのためには、イベントを一時的に無効化する方法が有効です。
「ExcelのVBAコードについて教えてく」の回答画像1
この回答への補足あり
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A