今のコードを載せます
Sub test_StopwatchCell()
If did Then
kStopwatch
Else
kStopwatch Range("a1")
End If
End Sub
上のコードはエクセルワークシートにフォームのボタンを配置して、test_StopwatchCell 関数を登録し、クリックで測定開始し、もう一度クリックで測定停止するマクロですが、一時停止のボタンを新たに作りたいのですが、どうしたらいいのか教えて下さい。お願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

No.2です。


そうですね・・・
「開始/停止(トグル)」と書いてあったので、てっきりその時間から始めると思ってしまいました。
勝手にプログラムに手を加えるのは良くないかもしれませんが・・・
たとえば標準モジュールの
Sub kStopwatch(Optional obj As Object)
の中の8行目位の
>dstart = timeGetTime
が、
dstart = timeGetTime - obj.Value * 86400000 '86400000=60*60*24*1000
だったら、現在の時間から始めるかもしれません。
    • good
    • 0
この回答へのお礼

教えて下さったとうり変更してみたらできました!
まさに知りたかったのはこのことです。親切に教えて下さって本当に助かりました。VBを勉強している最中で分からないことだらけですが、これから少しずつ上達していきたいと思ってます。
とても役に立ちました。有難うございました。

お礼日時:2009/05/22 07:19

kStopwatch が


>http://homepage2.nifty.com/kmado/ke_m8.htm
のストップウォッチの事なら、2つのコマンドボタンを用意して、以下ではどうでしょうか?
本物のストップウォッチもこんな風なボタン配置ではなかったでしょうか?

'スタート・一時停止ボタン
Private Sub CommandButton1_Click()
kStopwatch Range("A1")
End Sub
'クリアボタン
Private Sub CommandButton2_Click()
kStopwatch 'カウント中の場合でも停止
Range("A1").Value = 0
End Sub

p.s.
プログラムの先頭に
'kStopwatch関数 ストップウォッチの開始/停止(トグル)
とありました。
実行中に呼ばれる事で一時停止になるようです。

この回答への補足

>kStopwatch が
http://homepage2.nifty.com/kmado/ke_m8.htm
のストップウォッチの事なら・・・・

まさにそのことです。
ご回答ありがとうございます。
これで一時停止できるようにはなったのですが、再スタート(スタート・一時停止ボタンを押す)しようとすると、カウントがまた0からになってしまうので困っています。一時停止し、もう一度押すことでその続きからカウントするようにするにはどうしたらいいのでしょうか。ぶしつけですみませんが、ご指導お願いします。

補足日時:2009/05/21 18:00
    • good
    • 0

kStopwatch1の中の時間を数えている部分に


フラグを判定する部分または
セルまたはさらに別のボタンの値を読み取るかする
部分を追加して、
その値が一時停止させたい値なら時刻カウントを
しないようにすればいいと思います。
 引数としてRange("a1")のように値を利用できる
みたいですから、A2などのセルの値を利用するのが
手っ取り早そうですが・・・。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QExcelにストップウオッチ?をつけたいのですが

Excelで子供に試験問題を作っているのですが、シート内にボタンをつけて、スタートボタンをクリックすると時間を測りはじめて、終了ボタンを押すと、かかった時間を指定したセルに表示するようにしたいのですが、どのようにすれば良いでしょう?・・・ボタンの作り方はわかりますが、関数もしくはVBAの式がわかりません。 よろしく御願いします。Excelは2000です。

Aベストアンサー

セルに書き込むのではなく、画面で表示できれば良いと言うことなら、以下のサンプルでどうでしょう。
標準モジュールに、以下のコードを貼り付けてください。

Public myTime As Date
Public myFlg As Boolean

Sub StopWatch()

If myFlg = False Then
'スタート
myTime = Now '現在の日時を変数に記憶します。
myFlg = True
Else
'ストップ
MsgBox "かかった時間 " & Format(Now - myTime, "h:mm:ss") 'かかった時間を表示。
myFlg = False
End If

End Sub

ボタンは1つ(スタート/ストップ兼用)でいいです。
そのボタンに、このマクロを貼ってください。

QExcelのストップウォッチについて

ExcelのVBAを利用して、ストップウォッチ機能をつけたいと思っております。
現在別の方で作っていただいたのが以下になります。
①ストップウォッチのボタンを押したら、ストップウォッチ画面が表示される。
②表示された画面のスタートをクリックしたら画面に表示されるカウントがスタートされ、
スタートボタンもストップに変更される
③カウント中にストップを押したらスタートボタンに変更され、ストップウォッチの時間がコピーされ、I列の一番下が選択される
④再度スタートをクリックすると②~③が繰り返し行われる
⑤閉じるのマークをクリックするとストップウォッチ画面が消えるというところまではできています。

これを以下の2つの機能を追加したいと思っています。
②スタートをクリックしたときに、C6セルに”〇”を記入、D6セルにもともと入っている数字+1をし、
カウントアップがスタートし、スタートボタンもストップに変わる
③ストップを押したときに、カウントした時間をR1へ記載する。もしR1がすでに入力されているならR2へ、R1もR2も記載されていたらR3へ記載・・・をR5まで行う

今作っているのが以下のVBAになります。
Sub stopWatch(Form)
On Error GoTo ending
Dim dblTimer As Double, CB As New DataObject
If blnStart = True Then
With Form
.StartStopB.Caption = "START"
.StartStopB.BackColor = &H8000000D
End With
blnStop = True
Exit Sub
End If
blnStart = True
blnStop = False
dblTimer = Timer
With Form
.StartStopB.Caption = "STOP"
.StartStopB.BackColor = &HC0&
End With

Do Until blnStop = True
Form.TimeText.Value = TimeValue(CStr(CDate(Int((Timer - dblTimer)) / 86400#)))
DoEvents
If blnStop = True Then Exit Do
Loop
blnStart = False
blnStop = False

'クリップボードに値を格納

CB.SetText Form.TimeText.Value '変数の値をDataObjectに格納する
CB.PutInClipboard 'DataObjectのデータをクリップボードに格納する
AppActivate Application.Caption
Call 時間最終行をセレクトする
ending:
End Sub

お分かりになる方どうぞよろしくお願いします。

ExcelのVBAを利用して、ストップウォッチ機能をつけたいと思っております。
現在別の方で作っていただいたのが以下になります。
①ストップウォッチのボタンを押したら、ストップウォッチ画面が表示される。
②表示された画面のスタートをクリックしたら画面に表示されるカウントがスタートされ、
スタートボタンもストップに変更される
③カウント中にストップを押したらスタートボタンに変更され、ストップウォッチの時間がコピーされ、I列の一番下が選択される
④再度スタートをクリックすると②~③が繰り返し...続きを読む

Aベストアンサー

こんにちは。

>お分かりになる方どうぞよろしくお願いします。
うーん、何度読んでも、分かりませんね。Form というのはExcel VBAでは直接使わないし、どういう人が書いたかは知りませんが、本当に動くことさえ、そのコードからは読み取れません。それで、私が、VBAのプログラムの力量がないと判断するのは自由だけれども、一度、私の書いたコードを御覧ください。構造的には同じ内容だと思います。内容的には、かなりオーソドックスです。

ご質問者さんのご要望には、特にお応えしていくつもりはありませんが、前からご質問はアップしていたのは見ていましたので、少し考えてみました。なお、以下は正確なストップウォッチとは言えません。浮動小数点誤差も考慮されていません。正確さでは、Win32 APIを使ったほうがよいのですが、ブルースクリーンのリスクが高く、UserFormに取り付けるには、Excel に対する子のWindow になるらしく、手間が増えるようになるようです。

それと、オプションを付けた分だけ、コードは読みにくいようです。

'UserForm モジュール以外のモジュール
Sub UserFormUP()
'起動用のボタン1
 UserForm1.Show 0
End Sub

'UserForm モジュール(添付画像)
Private stpFlg As Boolean
Private FormerTime As Single
Private DiffTime As Single
Private Sub UserForm_Activate()
  CommandButton1.BackColor = &HC0&
  DiffTime = 0
  FormerTime = 0
  Range("C6:D6").ClearContents
  Range("R1:R5").ClearContents
End Sub

Private Sub CommandButton1_Click()
 'スタートボタン
 Dim myStartTime As Single
 Dim myTimer As Single
 Dim myTime As Double
 Dim myInterval As Long
 Dim i As Long
 Dim fScnd As Long
 myInterval = 100
 myStartTime = Timer()
 DiffTime = 0
 stpFlg = False
 CommandButton1.BackColor = &H8000000F
 CommandButton2.BackColor = &H8000000D
 If FormerTime = 0 Then
  Range("C6").Value = "◯"
 End If
 Do While stpFlg = False
  myTimer = Timer()
  Do While Timer() - myTimer < myInterval / 1000
   DoEvents
   If Not stpFlg Then Exit Do
  Loop
  DiffTime = (Timer() - myStartTime)
  myTime = (DiffTime + FormerTime) / (60& * 60 * 24)
  TextBox1.Text = Format$(myTime, "h:mm:ss")
  'カウント
  If Second(myTime) - (fScnd + 1) = 0 Then
    Range("D6").Value = Range("D6").Value + 1
  End If
  fScnd = Second(myTime)
 Loop
 'R列の書き込み
 i = Cells(Rows.Count, "R").End(xlUp).Row
 If i > 5 Then MsgBox "これ以上は機能しません。", vbExclamation: Exit Sub
 If Cells(i, "R").Value = "" Then
  Cells(i, "R").Value = Format$(myTime, "h:mm:ss")
  Else
  Cells(i + 1, "R").Value = Format$(myTime, "h:mm:ss")
 End If
 Label1.Caption = FormerTime
 Label2.Caption = DiffTime
 FormerTime = FormerTime + DiffTime '繰越
 DiffTime = 0
End Sub

Private Sub CommandButton2_Click()
CommandButton1.BackColor = &HC0&
CommandButton2.BackColor = &H8000000F
'ストップボタン
  stpFlg = True
End Sub
Private Sub UserForm_Terminate()
Unload Me
End 'すべての進行中のマクロは止める
End Sub

こんにちは。

>お分かりになる方どうぞよろしくお願いします。
うーん、何度読んでも、分かりませんね。Form というのはExcel VBAでは直接使わないし、どういう人が書いたかは知りませんが、本当に動くことさえ、そのコードからは読み取れません。それで、私が、VBAのプログラムの力量がないと判断するのは自由だけれども、一度、私の書いたコードを御覧ください。構造的には同じ内容だと思います。内容的には、かなりオーソドックスです。

ご質問者さんのご要望には、特にお応えしていくつもりはありませんが、...続きを読む

QExcelでタイマーの一時停止するボタンのコードは

Excelでタイマーを作ったけど、一時停止できないとやっぱ面白くないと気づき、一時停止機能を付け加えたいが、まだ勉強し始めたばかりなので自分でコードが書けません。

なので、一時停止させるコードがわかる方教えてください。

<タイマーのコード>
Sub タイマー()

Dim EndTime
Dim PassTime

EndTime = Timer + Range("D5").Value * 60 + Range("F5").Value


Do

PassTime = Timer
Range("D5").Value = (EndTime - PassTime) \ 60 '分
Range("F5").Value = (EndTime - PassTime) Mod 60 '秒
DoEvents
Loop Until EndTime - PassTime <= 0

Beep

MsgBox "時間です"

End Sub

Aベストアンサー

#1さんのように突っぱねることが、本来は親切なのだと思います。ただ、掲示板というのは、締め切りはあっても、書かれたものは、時間というものが存在しない世界(一期一会)ですから、回答をせざるを得ないのは、ご容赦願います。

以下は、ある程度マクロが書ける人なら、考えつくはずです。
本来は、マクロの実行中に、割り込みが利かないのですが、なぜ可能なのか分かりますか?
それが分かりさえすれば、割り込み方法も思いつきます。

'//
Dim blnSw As Boolean 'スイッチ
Private Sub CommandButton1_Click()
 Dim EndTime As Double
 Dim PassTime As Double
 EndTime = Timer + Range("D5").Value * 60 + Range("F5").Value
 Do
  PassTime = Timer
  Range("D5").Value = (EndTime - PassTime) \ 60 '分
  Range("F5").Value = (EndTime - PassTime) Mod 60 '秒
  DoEvents
  If blnSw Then blnSw = False: Exit Sub
 Loop Until EndTime - PassTime <= 0
 Beep
 MsgBox "時間です"
End Sub

Private Sub CommandButton2_Click()
'途中で止める
 blnSw = True
End Sub

#1さんのように突っぱねることが、本来は親切なのだと思います。ただ、掲示板というのは、締め切りはあっても、書かれたものは、時間というものが存在しない世界(一期一会)ですから、回答をせざるを得ないのは、ご容赦願います。

以下は、ある程度マクロが書ける人なら、考えつくはずです。
本来は、マクロの実行中に、割り込みが利かないのですが、なぜ可能なのか分かりますか?
それが分かりさえすれば、割り込み方法も思いつきます。

'//
Dim blnSw As Boolean 'スイッチ
Private Sub CommandButton1_Click(...続きを読む

QACCESSでストップウォッチの作成

ACCEESS2013を利用しています。

VBAでストップウォッチを作成したいのです。

自作では、簡単なのはできたのですが、

スータト⇒ストップ⇒スタート ⇒このとき0秒の戻ってしまいます。

スタート ストップ 一時停止がほしいのですが、
一時停止の作成ができません。

ネットで調べても、見つけることができませんでした。
ほぼ、丸投げ状態ですが、ご教唆お願いします

Aベストアンサー

教唆はいけません。
『人にいろいろ暗示を与えて、悪事・犯罪などを犯すように仕向けること』ですから「教示」ですね。

さて、本題。
フォームにコマンドボタンを二個(名前をそれぞれ BtnStart と BtnReset にします)
テキストボックスを一個(名前を TxtTime にします)
フォームのモジュールに

Option Compare Database
Option Explicit
'下記二行は宣言部
Private FormTime As Single
Private PassedTime As Single

Private Sub BtnReset_Click()
  Me.TimerInterval = 0
  FormTime = 0
  PassedTime = 0
  Me!TxtTime = 0
  Me!BtnStart.Caption = "Start"
End Sub

Private Sub BtnStart_Click()
  If Me.TimerInterval = 0 Then
    FormTime = Timer - FormTime
    Me!BtnStart.Caption = "Stop"
    Me.TimerInterval = 100
  Else
    Me!BtnStart.Caption = "Start"
    Me.TimerInterval = 0
    FormTime = PassedTime
  End If
End Sub

Private Sub Form_Timer()
  Dim sMod As Long
  PassedTime = Timer - FormTime
  sMod = Int((PassedTime - Int(PassedTime)) * 100)
  Me!TxtTime = CDate(PassedTime / 60 / 60 / 24) & Format(sMod, "\.00")
  'Me.Repaint
End Sub

※なお、Timer関数を使用している都合上、日付をまたがって使用していると誤表記されます。
投稿用にタブインデントの代わりに全角スペースを使用しています。
Access2010での動作確認です。

教唆はいけません。
『人にいろいろ暗示を与えて、悪事・犯罪などを犯すように仕向けること』ですから「教示」ですね。

さて、本題。
フォームにコマンドボタンを二個(名前をそれぞれ BtnStart と BtnReset にします)
テキストボックスを一個(名前を TxtTime にします)
フォームのモジュールに

Option Compare Database
Option Explicit
'下記二行は宣言部
Private FormTime As Single
Private PassedTime As Single

Private Sub BtnReset_Click()
  Me.TimerInterval = 0
  FormTime = 0
  PassedTi...続きを読む

QVBAでのタイマー使用例

お世話になります。

Office2003のエクセルVBAでの質問です。
シートにボタンがあり、ボタンをクリックしたらタイマーが動き出してセル内の数字のカウントアップが始まるってような事を行いたいと考えております。

ボタンを押したらタイマーが動きだし、そのタイマーイベントの中でセル内の数字をカウントアップすると考えたのですが、タイマーの使い方がわかりません。

タイマーを使った簡単なサンプルを教えていただけないでしょうか?

Aベストアンサー

こんにちは。

>VBAではJavaでいうスレッドのようにバックで動くクラスは無いのでしょうか?

Excel VBAの場合は、そういう機能に対するものは、おそらくはクラスとは言わないですが、厳密にはありませんね。

>これだと毎5秒ごとにマクロを実行ができないですよね。なのでスレッドを考えました。

それは出来ますが、ワークシートの作業に対して、完全にバックで動かし、影響をなくすのは難しいです。実際は、以下でいう、'指定時刻に実行するマクロ名' マクロの内容にも依存してきます。このマクロ側が、どういう性格なものか分からないと、ちょっと難しいですね。ここのカテゴリで一番良くある例としては、楽天のRSSがあります。

お礼側に出ていコードに手を加えてみました。

'おそらく、標準モジュールのほうがよいでしょう。

Private MacroStop As Boolean
Sub 指定時刻にマクロを実行する()
Dim myWait As Integer
Dim 指定時刻 As Date
  myWait = 5 '秒
  指定時刻 = Now + TimeSerial(0, 0, myWait)
  If MacroStop = False Then
    Application.OnTime 指定時刻, "指定時刻にマクロを実行する"
    Call 指定時刻に実行するマクロ名
  Else
    MacroStop = False
    End
  End If
End Sub

Sub 指定時刻に実行するマクロ名()
  Cells(1, 1).Value = Cells(1, 1).Value + 1
  
End Sub
Sub タイマー停止()
   MacroStop = True
End Sub

こんにちは。

>VBAではJavaでいうスレッドのようにバックで動くクラスは無いのでしょうか?

Excel VBAの場合は、そういう機能に対するものは、おそらくはクラスとは言わないですが、厳密にはありませんね。

>これだと毎5秒ごとにマクロを実行ができないですよね。なのでスレッドを考えました。

それは出来ますが、ワークシートの作業に対して、完全にバックで動かし、影響をなくすのは難しいです。実際は、以下でいう、'指定時刻に実行するマクロ名' マクロの内容にも依存してきます。このマクロ側が...続きを読む

QEXCELのセルへ、デジタル時計を表示できますか?

excelのセルへリアルタイムの時計を表示することは
できるのでしょうか?
=now()では入力時の時刻が落ちるだけですよね・・・

HPではjavascriptなどで比較的簡単のようですが
エクセルでは難しいのでしょうか??

Aベストアンサー

以下の手順でやってみてください。
ワークシートを開き、

1.AltキーとF11キーをいっしょに押してVisualBasicEditorを呼び出します。
2.メニューから挿入、標準モジュールで出てきたコードウィンド(右側の白い広い部分)に以下のコードをコピペします。

Sub test01()
With Sheets("Sheet1").Range("A1")
.Value = Time
.NumberFormatLocal = "h:mm:ss"
End With
Application.OnTime Now + TimeValue("0:00:01"), "test01"
End Sub

3.Alt+F11キーでワークシートへもどります.
4.メニューから、ツール、マクロ、マクロで出てきたマクロ名(test01)を選択して実行します。

これでSheets("Sheet1")のA1に毎秒ごとに時刻が表示されます。

Qエクセルでの現在時刻入力

簡潔に。
エクセル(2002.SP3)で現在時刻を入力するのに
「Ctrl」+「*」で入力できるかと思いますが
「分」までしかデータがありません。
「秒」の単位まで簡単に入力したいのですが
いい方法ありますでしょうか?
え~残念ながら今手元に解説本も何もない状態です。
くわしくご親切なかた オネガイシマス。

Aベストアンサー

TIME関数を使えばよいと思います。

     ↓

参考URL:http://t_shun.at.infoseek.co.jp/My_Page/KansuuManual/kansuu_page_5.htm#Ⅴ-5

Q経過時間を表示したい

現在の時刻と開始時刻から、経過時間を表示したいです。
現在の時刻は16時30分だったら、16:30
開始時刻は12時15分だったら、12:15という変数があります。
答えで4:30という数字が欲しいです。
経過時間は24時間以下を考えれば良いです。

Aベストアンサー

No1の者ですが
A=CDate(Time)-CDate(Time_Start)
の結果、Aが小数になってしまうという問題についてです。

変数Aの型が何になっているのか謎ですが「答えで4:30という数字が欲しい」ということなのでNo2さんの回答のようにformat関数を使うと簡単です。

A=Format(CDate(Time)-CDate(Time_Start),"hh:mm")

format関数が邪魔であれば変数AをDate型で定義してやればよいかと思います。


ちなみに変数Aに小数が入っていることについてですが、VBの日付型というのは整数+小数で管理しており、整数部で日数を、小数部で時間を管理しています(Excelなどで日付を入力したセルを数値表示すると分かると思います)。今回は日数はゼロですので0.xxxという小数が変数Aに入ってきます。

Qユーザーフォームに今の時間を表示

連続投稿で申し訳ありません。

ユーザーフォームに今の時間を表示したいんですが、どうもうまくいきません。
何か、良い方法がありましたら教えていただければと思います。

どうか、よろしくお願いします。

Aベストアンサー

こんにちは。

私は、「今の時間」という意味を、私は、PCの内部の時間と考えていますから、もし、意味を取り違えていたら、無視してください。

まず、Lalbel ひとつをユーザーフォーム上においてください。

'-----------------------------------------------
Private Sub UserForm_Activate()
Dim CurrentTime As String '今の時間
 While UserForms.Count > 0
  CurrentTime = Format$(Time(), "h:nn:ss")
 If CurrentTime <> Label1.Caption Then
  Label1.Caption = CurrentTime
 End If
  DoEvents
 Wend
End Sub

ただし、UserForm がアクティブになっているときに限ります。

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

よろしくお願いいたします。

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報