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

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

ただいまの
回答率

90.51%

  • VBA

    2296questions

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

  • Excel

    1921questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 773

kumaaya92

score 2

 前提・実現したいこと

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です。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • sysjojo

    2018/07/30 17:19

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

    キャンセル

  • kumaaya92

    2018/08/01 15:44

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

    キャンセル

回答 3

+3

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

Private Sub 更新()
    ' イベント抑止
    Application.EnableEvents = False

~省略~

    ' イベント抑止解除
    Application.EnableEvents = True
End Sub

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/01 15:32

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

    キャンセル

+2

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/01 15:28

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

    キャンセル

  • 2018/08/01 15:35

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

    キャンセル

  • 2018/08/01 15:54

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

    キャンセル

check解決した方法

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内に入れなければならなかった
ようでした。
お二方の回答のおかげでようやく気付くことができました、ありがとうございます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • VBA

    2296questions

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

  • Excel

    1921questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。