すべてのカテゴリ » インターネット・パソコン » 技術・プログラミング

質問

終了

エクセルのVBAを勉強しています。

再実行ボタンを作成したのですが、
処理中に変数Bが1のときは、
再実行ボタンが押されるまで
処理を中断することはVBAでコーディングすれば
可能でしょうか?
waitとかあるのかなぁと思っていましたが、
なかなか検索してもヒットしません。
(探し方が悪いと思いますが。)

今、AAAファイルを処理する前に、
セルの値のチェックを行っていますが、
エラーがあるときは、そのエラーを修正した
あとに、再実行ボタンを押したときに
処理を再実行できるようにしたいと
おもっています。

何か、関数等はありますでしょうか?
今日から勉強していますので、
アドバイスをいただけると助かります。

  • 質問者:エクセル勉強中
  • 質問日時:2009-02-03 21:58:57
  • 0

並び替え:

再実行ボタンを押下した時最初から処理するのはだめですか?

途中からならどこから再開するかをマクロを記述したBookのSheetに記録しておき
ボタン押下で当該Sheet参照して処理を再開するとかで可能と思います。

セルの書き換えをキャッチするのは同一Book内であればWorkBook_ChangeSheetイベント(VBEのヘルプ参照)が使えます。

別Bookで特定のセル書き換えをキャッチするならエラーを確認した時にエラーのあったセルをVBAを記述しているBookの特定セルにマクロでリンクを張り、このリンクセルをWorkBook_ChangeSheetで監視できるかも。(この方法は未確認です)
リンクの張り方はヘルプやネット上で探してみてください。

この回答の満足度
  
とても参考になり、非常に満足しました。回答ありがとうございました。
お礼コメント

ありがとうございました。

参考になりました。

ExcelのVBAはモーダルダイアログを出したり、Wait等で待ちループを入れたくてもアプリケーションがブロックされてしまうのでシートを操作できません。かと言ってモードレスダイアログを使うとイベントを使ったり、待ちループの小技が必要になってコーディングは面倒になります。一箇所ならば大した事は有りませんが、複数の処理でコレが必要になって来ると頭が痛くなります(笑。

なので、セルの変化をチェックしながら待つのが良さそうですので素直にプログラムを組むとExcelが単に待ち時間の消費目的だけでシステム時間を沢山消費してしまい、シートもブロックされて非常に重いシステムになります←マルチコアならばまだ辛うじて救われますが(笑。

そこで、数秒毎にセルの変化をチェックしつつ、他の処理にシステム時間を明け渡す為にDoEventsを使います。

以下の例はA1セルにゼロを入れ、メッセージを出してA1セルへの入力を促しつつA1セルがゼロの間は先に進まないように作った物です。A1にゼロ以外の数が入力されるとB1セルに50をA1で割った値とC1セルに『割り算完了』と表示してマクロを終了します。

Range("A1").Value = 0
If Range("A1").Value = 0 Then
  MsgBox (Range("A1").Address + "に0以外の数を入れてください")
  While Range("A1").Value = 0
    StartTime = Timer
    While Timer < StartTime + 1
      DoEvents
    Wend
  Wend
End If
Range("B1").Value = 50 / Range("A1").Value
Range("C1").Value = "割り算完了"

上の例では1秒の待ち時間を使っています→StartTime + 1。ここを2~3秒程度で適当に変えてみてください。ただし余り大きくすると応答性が悪くなります。

例なので作りは簡単にしました。それぞれの目的のアプリケーションに合わせてメッセージやループ構成等を作り直してみてください。

再実行ボタンを押した時に反応させたければ、SheetChange等で変更を監視しながらフラグを立てて『While Range("A1").Value = 0』の代わりにフラグをチェックするように作ればOKだと思います。チェック結果がダメならもう一度ループに入り直す等の小細工は適当に処理してください。

===補足===
ちょっとした実験用マクロを組んでみたので、お時間が有りましたらお試しください。先に書いたマクロを実際に動作チェックまで出来るようにチョットだけ変えたものです。

新規ブックを起こして、そこに二つのフォームボタンを挿入してください。そのボタンのイベントプロシージャはそれぞれ『ボタン1』→『ボタン1_Click』、『ボタン2』→『ボタン2_Click』に割り振ります。新規にボタンを作成して中身は空にして作っておいてから、以下の内容をそれぞれのSub等に適当にコピペしてください。

Dim WaitFlg As Integer

Sub ボタン1_Click()
  Range("C1").Value = "計算開始"
  While Range("A1").Value = 0
'    Range("h1").Value = 0
    WaitFlg = 0
    Range("C1").Value = Range("A1").Address + "に0以外の数を入れてボタン2を押してください"
    MsgBox (Range("c1").Value)
'    While Range("h1").Value = 0
    While WaitFlg = 0
      StartTime = Timer
      While Timer < StartTime + 1
        DoEvents
      Wend
    Wend
  Wend
  Range("B1").Value = 50 / Range("A1").Value
  Range("C1").Value = "計算終了"
End Sub

Sub ボタン2_Click()
'  Range("h1").Value = 1
  WaitFlg = 1
End Sub


セルA1に適当な数値を入れてボタン1を押すとC1に計算開始と入れてからB1に50をA1で割った数値が入り、C1に計算終了と書き込んでいます。

もしA1にゼロが入っていると(ご質問のエラーの抽出と同じ状況)『$A$1に0以外の数を入れてボタン2を押してください』とC1セルに入力されると同時に同じメッセージを表示するメッセージボックスが表示されます。メッセージボックスでOKを押すまでExcelは待機し、OKを押すと編集が可能になります。

A1に何もせずにボタン2を押すとC1セルとメッセージボックスの表示が繰り返されマクロは先には進みません。A1セルにゼロ以外の数値を入れてボタン2を押すとC1セルに計算終了と入力されて、B1セルには計算結果が入りマクロは終了します。

また、WaitFlgと言う変数の代わりにRange("H1").Valueと書き換えると変数の代わりにセルを利用して視覚的に状況を見る事もできます。そのコードはWaitFlgの直上にコメントして有りますのでそのコメントを外し、代わりにWaitFlgの行をコメントアウトしてください。

尚、動作のテストはExcel2007で行っています。

では、頑張ってください。

この回答の満足度
  
とても参考になり、非常に満足しました。回答ありがとうございました。
お礼コメント

回答、ありがとうございます。
色々と勉強になりました。

exit sub で処理を抜けます。(中断)

if 変数B = 1 then
 exit sub
end if

浅い知識でスミマセン。

  • 回答者:匿名希望 (質問から21分後)
  • 1
この回答の満足度
  
参考になり、満足しました。回答ありがとうございました。
お礼コメント

回答、ありがとうございます。

処理は抜けてしまうと、実行が終わってしまうので。。
ボタンを押すまで、そこのステップで待つことってできませんか?

関連する質問・相談

Sooda!からのお知らせ

一覧を見る