Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2007)
一時停止と再開始
投稿日時: 19/03/22 18:21:05
投稿者: o_taroh

MsgBoxで中断しているプロシージャですが、<OK>でMsgBoxを抜けた後プロシージャの進行を一時止めて
Excelを点検したいのですが方法があるでしょうか?
ちなみに、ユーザーホームに「点検」などのコマンドボタンを設定したとしたら、どんなプログラムを書けばいいのでしょうか、よろしくお願いします。

回答
投稿日時: 19/03/22 19:51:35
投稿者: WinArrow
投稿者のウェブサイトに移動

MsgBoxを抜けた後
に、ブレークポイントを設定して実行すればよいです。
ブレークポイントを設定した行でプログラムは止まります。
 
そのあと、実行する場合は、「F8]を押すと
1行づつ進んでいきます。
 
詳細は、"ステップ実行"というキーワードで検索してみてください。

回答
投稿日時: 19/03/22 19:57:32
投稿者: WinArrow
投稿者のウェブサイトに移動

追加レス
 
ブレークポイント
は、自分が止めたいところに、いくつでも設定することができます。
 
もう一つの方法
 
ウォッチ式を設定して
条件を指定して、プログラムの実行を止めることができます。
 

変数:ACBD=100というように設定すると
変数:ABCDが100になった時点で止まります。

回答
投稿日時: 19/03/23 18:44:07
投稿者: simple

私もブレークポイント(もしくはもっと原始的にStopというコードの挿入)が
適当と考えますが、敢えてユーザーさんの質問を分析してみます。
 
[MsgBoxで中断しているプロシージャ]とは別に、
ユーザーフォームを表示しておいて、
そこにある「点検」ボタンを押すことで、
元のプロシージャを外部からコントロールして、
MsgBox表示後の状態でストップさせたい、ということですか?
 
そういうことはできません。
 
「点検」ボタン押し下げによって、なんらかの変数なりシート上の値なりを
変更したとしても、元のプロシージャ側にその変更を察知する仕組みがないと、
そのプロシージャの動作を変えることはできません。
 
で、「ブレークポイントという基本のデバッグ手法に戻って下さい」ということです。
 
ちなみに、前回の質問(「自動メンバー表示」)はどうなったのですか?
放置は良くないです。

回答
投稿日時: 19/03/23 20:12:53
投稿者: WinArrow
投稿者のウェブサイトに移動

説明をよく読んだら
>ちなみに、ユーザーホームに「点検」などのコマンドボタンを設定し
 とありますが、
 「ユーザーフォームにユーザーホームに「点検」などのコマンドボタンを設定すること」
は無駄なことです。
  
理由
ユーザーフォーム上のコマンドボタンAで、実行しているプロシジャが
実行している途中で、「コマンドボタンB」はクリックできない。
どんなコードを記述しても実行できない・・・から、無駄なことというわけです。
 
それよりも実行中のプロシジャを一時停止させるために用意されている「ブレークポイント」というツールを使いましょう。ちなみにこの機能を使うためにコードを修正する必要はありません。

回答
投稿日時: 19/03/24 08:23:14
投稿者: WinArrow
投稿者のウェブサイトに移動

>プロシージャの進行を一時止めて、Excelを点検したい
 
何を点検するのかよくわかりませんが、
「実行結果をセルの値で検証」
するというような場合、
ユーザーフォームが邪魔(大きすぎて)をしてシートがよく見えない・・・
なんてこともよくあること・・・
また、ある程度実行した結果を検証することになるので、問題があった場合、問題をピンポイントで把握することも難しいです。問題が、データ側にあるのか?プログラム側にあるのか?を探るには、1件毎に検証する必要があります。
 
このような場合、シートへ表示切替しなくても、プログラムを一時的に止めて、
変数の値と流れを同時に確認するなど、効率的なデバッグ方法があります。
それは、前にも紹介した「ステップ実行」という方法です。
面倒くさいと思われますが、この方法がプログラムの品質向上(早期仕上がりとバグ撲滅)には最も有効な方法と考えて、私は使っています。

投稿日時: 19/03/26 10:09:21
投稿者: o_taroh

私の説明の仕方が悪かったのでしょうか申し訳ありません。
プログラムを一時中断しておいてプログラムの内容ではなくExcel(セル)の表示結果を点検したのですがどうでしょうか?

回答
投稿日時: 19/03/26 11:01:24
投稿者: Suzu

ループ処理の中でなら希望の動作は可能でしょう。
 
フォーム上に、
ボタン    btn_Start、btn_Stop
トグルボタン tgl_Pause
 
を配置し、
Start で カウントアップ開始
Stop で カウントアップ初期化
Pause で 一時停止
 
 

Option Explicit

Public i As Long
Public j As Long

Public flg As Boolean
Public bln_end As Boolean

Sub sumple()
  i = i
  Do While i < 100000
    j = 0
    Do While j < 100000
      DoEvents
      If tgl_Pause = True Then Exit Sub
      j = j + 1
    Loop

    Cells(1, 1) = i

    If bln_end = True Then
      i = 0
      j = 0
      Cells(1, 1) = i
      Exit Sub
    End If
    i = i + 1
  Loop
End Sub

Private Sub btn_Start_Click()
  bln_end = False
  Call sumple
End Sub

Private Sub btn_Stop_Click()
  bln_end = True
End Sub

Private Sub tgl_Pause_Click()
  Call sumple
End Sub

 
 
そうではなく、ループの外で行いたいなら、
素直にVBEのリボンにある一時停止ではダメなの?

投稿日時: 19/03/26 15:13:37
投稿者: o_taroh

みなさん親切にいろいろありがとうございます、40年ほど前にFortranでプログラムを勉強した老人で質問も恥ずかしいような気がしますが、お見捨ておきなくよろしくご指導ください。
具体的には、25000個ぐらいのセルのうち条件の合ったセルに色付けをして、色付けが終わったところでプログラムを中断して確認し、確認出来たら表全体を塗りつぶし無しにする続きのプログラムを実行したいのですが、Userform のコマンドボタンにどう書けばプログラムの実行が続けられるのか解らなくて苦慮しています。(セルの数が多いので縦、横のスクロールが必要です)
DoEventsのこともまだよく理解できていません。

投稿日時: 19/03/26 15:36:24
投稿者: o_taroh

申すわけありません、suzuさんのCall sumpleで気が付きました、別のプログラムを書いて呼べばいいわけですね。
試みてみます。