質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

1722閲覧

VBA callの呼び出しでの無限ループ?について

kumaaya92

総合スコア8

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/07/30 07:58

編集2018/07/30 07:59

前提・実現したいこと

ExcelVBAにて、
「登録」シートの、複数あるうちの一つのチェックボックスをクリックすると
「更新」マクロを走らせてチェックしてあるものの内容を表示するマクロを作りたいと思っています。
シート名を右クリックして、「コードの表示」で出るスペースにマクロを記入しています。
チェックボックス_Click()は、チェックボックスを右クリックしてマクロを登録で紐づけ(?)しました。

自分のイメージだと、
チェックボックスが押される

チェックボックス_Click に入る

「更新」が呼び出されて走る

値が書き換えられて、チェックボックス_ClickのEnd Subに到達して終了する

なのですが、設定したブレークポイントを見てみると、
無限に「更新」が呼び出されているようでした。

マクロを書く場所が悪いのか、書き方が悪いのか素人の為判断できず、行き詰っています。
どこをどう改良すればループに陥らなくなるのか、教えていただけると有難いです。
どうかよろしくお願いいたします。

発生している問題・エラーメッセージ

Excelが固まって落ちます。

該当のソースコード

Sub チェックボックス_Click() Call 更新 End Sub Private Sub 更新() Dim str As String For I = 0 To 19 If Sheets("データ").Range("A" & I + 123).Value = "True" Then str = str + "・" + Sheets("データ").Range("B" & I + 123).Value End If Next I Dim strl As Long strl = Len(str) str = Right(str, strl - 1) Sheets("登録").Range("B6").Value = str End Sub

試したこと

更新のSubをFunctionに変えてみましたが同じように固まってしまいました。

補足情報(FW/ツールのバージョンなど)

Excel2016です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sysjojo

2018/07/30 08:19

チェックボックスに「リンクするセル」を設定したりしていませんか? そのうえで、「リンクするセル」に設定されたセルの値をマクロで書き換えたりしていませんか?このコードだけだと問題ないように見えますが、他にコードがあれば前述の観点で該当しそうなコードがあれば挙げられるとよいかと。
kumaaya92

2018/08/01 06:44

回答ありがとうございます。先ほど解決したのですが、今回の問題はWorksheetイベントの部分に不用意に更新()を置いてしまった事により発生しておりました。おっしゃる通り、そのシートに関わるであろうコードを全文載せなかった私の不手際でした。少ない情報でここまで考えて頂いて、心から感謝申し上げます。また行き詰ったときに参考にさせて頂きます、ありがとうございました。
guest

回答3

0

同じような構成で試してみましたが現象は発生しませんでした。
またコード的にも特に問題は見られません。
状況報告だけ見るとイベントの連鎖が起きているように思えますが、実際のところどうなのかはわかりません。
仮にイベントの連鎖が起きていると仮定して、次のコードを更新関数の入り口と出口に書いてみてどうなるか試していただけますか。

VBA

1Private Sub 更新() 2 ' イベント抑止 3 Application.EnableEvents = False 4 5~省略~ 6 7 ' イベント抑止解除 8 Application.EnableEvents = True 9End Sub

投稿2018/07/30 08:17

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kumaaya92

2018/08/01 06:32

回答ありがとうございます。 同じ環境にして試してまで頂いて、ありがとうございます…! 上の部分だけだと問題が起こらない、という所がとんでもないヒントになりました。 そして怪しいところは全文載せなければいけませんでした…申し訳ないです。 提案していただけたコードも今後躓いた時にぜひ活用させて頂きます! 本当に助かりました、ありがとうございます。
guest

0

単に更新()処理だけを見ると無限ループする要素は無さそうなので、Worksheetのイベントか何かで更新()を呼び出しているのでは無いでしょうか?
検索を掛けてみて下さい。

もし、該当しないのであれば、新しいブックを作って試してみるとか。

投稿2018/07/30 08:17

sazi

総合スコア25184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kumaaya92

2018/08/01 06:28

回答ありがとうございます。 Worksheetのイベントでハッとして、別の更新を呼び出している箇所を確認したら解決しました! Ifの中に納めなくてはいけない更新()が収まっておらず、Worksheetの内容が変更される度に走ってしまうようになっておりました。。 載せていない部分まで考慮して頂いて、もう本当に頭が上がりません。 本当に助かりました、ありがとうございました。
sazi

2018/08/01 06:35

頭は上げて下さいね。 因みに、こういう場合は「頭が下がります」ですね。
kumaaya92

2018/08/01 06:54

頭が下がります。 重ねてお礼申し上げます!
guest

0

自己解決

Private Sub Worksheet_Change(ByVal Target As Excel.Range) If Target.Cells(1, 1).Address = "$B$1" Then 'セルB1が変えられた時の処理 End If Call 廃棄物種類更新 Exit Sub myError: 'エラーだった時の処理 End Sub

同じシートに書いてあるこちらの部分で、
Callを呼び出す位置をIf Target.Cells~~のIF内に入れなければならなかった
ようでした。
お二方の回答のおかげでようやく気付くことができました、ありがとうございます。

投稿2018/08/01 06:52

kumaaya92

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問