
下記のコードは以前、マクロを繰り返し実行される不具合を解決するために、教えて頂いたコードですが、やはり指定セル値指定文字が表示されるとマクロ「省エネ方法」が繰り返し実行されます。
例えば「省エネ方法」が実行されて「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.6ベストアンサー
- 回答日時:
#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
対象シートは "新築"
回答ありがとうございます。
私もなんだかわけがわからなくなってきました。
貴社の回答を元に設定してみます。
補足が出来ない為、ベストアンサーとさせて頂きます。
もし、何かありましたら
質問をさせて頂きます。
No.7
- 回答日時:
No3です。
>他のマクロを実行された場合に再度、
>「省エネ方法」が実行されます。
>解決方法をお願いできますか。
回答文をよくお読みください。
回答にあるように試してもいないし、内容を理解もしていないということでしょうか??
No3で示しているのは、
『targetSubを1度だけ実行するようにする』
方法です。
これを、質問者様の状況に合わせるようにすれば良いだけの話です。
当方には全体像がわかりませんので、何をどうするのかについては具体的にはわかりかねます。
(質問者様にしかわからない条件や情報が山ほどありますので・・)
>Sub targetSub()
>Const module = "Module56" ' ←モジュール名
>Const subName = "省エネ方法" ' ←プロシージャ名
>'1回だけ実行する処理内容を記述
>MsgBox "targetSubを実行しています"
>'1回だけにするための処理
としているようですが、それで一体いつtargetSubが実行されているのでしょうか?
更には、モジュール名が合致していない可能性がありそうに思われます。
No3の回答の内容は、停止したいプロシージャ内に「自分自身を2度目からは実行しないようにする処置」を記述しておくという意味なのですけれど・・・
No.5
- 回答日時:
マクロ「省エネ方法」の繰り返し実行がなくなった一方で、その後のマクロが実行されなくなってしまったとのこと、ご迷惑をおかけしております。
この状況は、以前お伝えしたコードで 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キーを押すと、何と表示されますか?
これらの情報に基づいて、より具体的なアドバイスをさせていただきます。
お手数をおかけしますが、よろしくお願いいたします。
No.4
- 回答日時:
こんにちは
エクセル小僧様のご質問は何々したいの条件が不十分だと思いますよ
>繰り返し実行しない
という事は、逆にこの場合のみ実行したいという事になると思うのですが如何ですか
その場合の条件は何?繰り返し処理したい場合もあるかも知れませんし
よく考えて・・・
少なくとも
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文で出来ると思うのでやって見てください
No.3
- 回答日時:
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
'------- ここまで -------
No.2
- 回答日時:
こんにちは
以前にも、同じことについて回答した気がしますね。
いつも無視されているので、これも無視なんでしょうけれど・・・
https://oshiete.goo.ne.jp/qa/13979898.html
※ 意味がわからない場合は、コードを作成した方に見せれば、理解してもらえるでしょうし、対応コードも作成してくれるでしょう。
No.1
- 回答日時:
原因は、マクロ「省エネ方法」内で A5セルまたは A13セルの値を変更している可能性が高いです。
例えば、「省エネ方法」の中で InputBox を使用して値を入力し、その値を A5セルや A13セルに書き込んでいる場合、Worksheet_Change イベントが再度トリガーされてしまうのです。繰り返し実行を防ぐためには、マクロ「省エネ方法」の実行中に Worksheet_Change イベントがトリガーされないようにする必要があります。そのためには、イベントを一時的に無効化する方法が有効です。

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
VBA Application.Matchについての質問です
Visual Basic(VBA)
-
VBAのエラー表示の対処法について
Visual Basic(VBA)
-
VBAのループ処理について教えてください
Visual Basic(VBA)
-
-
4
質問58753 このコードでうまく動作しません。どうしたら良いですか Private Sub Wor
Visual Basic(VBA)
-
5
VB.net 文字列から日付型へ変更したい
Visual Basic(VBA)
-
6
Excelのマクロについて教えてください。
Visual Basic(VBA)
-
7
Visualbasicの現状について教えてください
Visual Basic(VBA)
-
8
VBA 2次元配列の出力
Visual Basic(VBA)
-
9
excelVBAについて。
Excel(エクセル)
-
10
VBAで特定の文字が入った行をコピーして貼り付けたい
Visual Basic(VBA)
-
11
セル内が空白設定なのに#N/Aと出てくるのを回避する方法を教えてください。
Excel(エクセル)
-
12
VBA 同じフォルダ内のすべてのファイルに同じセルをペーストしたい
Visual Basic(VBA)
-
13
ExcelのVBAコードについて教えてください。
Visual Basic(VBA)
-
14
Excel VBAについて。こんな動作をさせるためにはどう書けばよいでしょうか。
Visual Basic(VBA)
-
15
不要項目の行削除方法について
Visual Basic(VBA)
-
16
【関数】データベースから2つの条件を満たす場合に「一致」と表示したい
Excel(エクセル)
-
17
VBAの「To」という語句について
Visual Basic(VBA)
-
18
ExcelのVBAコードについて教えてください。
Visual Basic(VBA)
-
19
【マクロ】モジュール変数の記述時、Callにて、呼び出されたプロシージャから実行するとエラーとなる?
Visual Basic(VBA)
-
20
【マクロ】変数を使った、文字の種類の変更にて、エラーとなる。
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでCOPYを繰り返すと、処理が...
-
vba textboxへの入力について教...
-
Vba セルの4辺について罫線が有...
-
複数のExcelファイルをマージす...
-
vbsでのwebフォームへの入力制限?
-
VBAでセルの書式を変えずに文字...
-
Vba Array関数について教えてく...
-
【マクロ】開いているブックの...
-
改行文字「vbCrLf」とは
-
【ExcelVBA】5万行以上のデー...
-
【マクロ】売上一覧YYYYMMDDHHS...
-
エクセルのマクロについて教え...
-
Vba FileSystemObject オブジェ...
-
エクセルのマクロについて教え...
-
【ExcelVBA】値を変更しながら...
-
【マクロ】シートの変数へ入れ...
-
【マクロ】並び替えの範囲が、...
-
vb.net(vs2022)のtextboxのデザ...
-
エクセルのVBAコードと数式につ...
-
【マクロ】値を渡されたプロシ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Vba Array関数について教えてく...
-
VBAでCOPYを繰り返すと、処理が...
-
【ExcelVBA】5万行以上のデー...
-
【マクロ】シートの変数へ入れ...
-
vbsでのwebフォームへの入力制限?
-
エクセルのマクロについて教え...
-
【マクロ】並び替えの範囲が、...
-
Vba セルの4辺について罫線が有...
-
【マクロ】売上一覧YYYYMMDDHHS...
-
VBAでユーザーフォームを指定回...
-
【マクロ】開いているブックの...
-
エクセルの改行について
-
vb.net(vs2022)のtextboxのデザ...
-
エクセルのVBAコードと数式につ...
-
算術演算子「¥」の意味について
-
Excelのマクロについて教えてく...
-
改行文字「vbCrLf」とは
-
ワードの図形にマクロを登録で...
-
VBAの「To」という語句について
-
【マクロ】変数を使った、文字...
おすすめ情報
回答ありがとうございます。
無視をしていたわけではないのですが、
申し訳ありません、
コードに関しては私が質問をして、作成しておりますので、対応コードが分かりません。
教えて頂く事は可能でしょうか。
勝手なお願いですが、よろしくお願いいたします。
回答ありがとうございました。
教えて頂いた通りに
Sub main()
MsgBox "mainからtargetSubを呼び出します"
Call 省エネ方法
End Sub
Sub targetSub()
Const module = "Module56" ' ←モジュール名
Const subName = "省エネ方法" ' ←プロシージャ名
'1回だけ実行する処理内容を記述
MsgBox "targetSubを実行しています"
'1回だけにするための処理
を設定しましたが、他のマクロを実行された場合に再度、
「省エネ方法」が実行されます。
解決方法をお願いできますか。
回答ありがとうございました。
教えて頂いたコードを設定しましたが、マクロ「省エネ方法」の繰り返しは無くなりましたが、
その後のマクロが実行されなくなってしましました。
解決方法を教えてください。
例えば、同じシートに
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」の数式が設定されており、
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
を改良して上手くできないでしょうか?
よろしくお願いいたします。
回答ありがとうございます。
№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
を設定しても上手く行きませんでした。
解決方法があれば教えてください。
回答ありがとうございます。
大変申し訳ありません。
補足が後3回しかできず、このままでのやり取りでは、解決迄、行かない可能性がありますので、一旦、貴者をベストアンサーとさせて頂きまして、
新しく質問をさせて頂けますか?