結構試行錯誤したので覚書。
一番シンプルな方法
前提:
プログレスバーコントロールは使わない。ラベルで代用
(つーかまりもの環境では使えなかったぉ・3・)
キャンセル、[×]ボタンで処理を中断できる
つかみはOK?
んじゃやってみよ!
新規フォーム(frmProgressBar)にフレーム(frameBar)、ラベル(lblBar)、ボタン(btnCancel)を作成する
(↑ラベルはフレーム内に張り付ける)
こんな感じ

キャンセル判定フラグを標準モジュールにPublicで定義
'******************************************************************************
'* 変数定義
'******************************************************************************
Public g_bCancel As Boolean ' キャンセル判定
プログレスバー画面のソース
キャンセルボタン、×ボタンで中断確認メッセージ表示
「はい」なら判定フラグTRUEに設定して画面終了
「いいえ」なら処理続行
If CloseMode = 0 Thenは×ボタンでクローズする時のみ確認MSGを表示する判定
×ボタンで「いいえ」選択時は画面終了をキャンセルしています(Cancel = Trueで)
'******************************************************************************
'* プログレスバー画面
'* 履歴:
'* 2015/04/20 新規作成
'******************************************************************************
'*******************************************************************************
' キャンセルボタン押下
'*******************************************************************************
Private Sub btnCancel_Click()
If MsgBox("キャンセルボタンが押されました。" & vbNewLine & _
"ここで中断して終了しますか?", _
vbInformation + vbYesNo, "確認") = vbYes Then
g_bCancel = TRUE
Me.Hide
End If
End Sub
'*******************************************************************************
' 画面終了時
'*******************************************************************************
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = 0 Then
If MsgBox("処理中画面を閉じると、処理が中断されます。" & vbNewLine & _
"ここで中断して終了しますか?", _
vbInformation + vbYesNo, "確認") = vbYes Then
g_bCancel = TRUE
Me.Hide
Else
Cancel = True
End If
End If
End Sub
こっちが呼出し側ソース
vbModelessで処理中画面を表示するとこのモジュールに制御がすぐ戻ります。
なので処理中画面を表示しつつこっちの処理を継続できます。
DoEventsでOSに制御を戻すことで処理中画面を更新します。
iMaxには繰り返し回数の最大値を入れてください。(今は仮に100)
'===============================================================================
' 処理を繰り返す
' 引数 なし
' 戻り値 string エラーメッセージ(成功時:"")
'===============================================================================
Private Function strDoLoop() As String
Dim iCnt As Integer ' カウンタ
Dim iMax As Integer ' 最大数
Dim siBarWidth As Single ' プログレスバーの幅
On Error GoTo ErrorHandler
strDoLoop = ""
' プログレスバー画面の設定
Load frmProgressBar
With frmProgressBar
.Caption = "処理中画面"
With .lblBar
.Top = 1
.Left = 1
.Width = 0
.BackColor = &H800000 '青色
End With
siBarWidth = .frameBar.Width
End With
' キャンセル状態を初期化
g_bCancel = FALSE
' 処理中画面表示
frmProgressBar.Show vbModeless
iMax = 100
' *** Loop Start ***
For iCnt = 0 To iMax
' キャンセル判定
If g_bCancel = TRUE Then
Exit For
End If
' *** ここにやりたい処理を記述します。***
'プログレスバーの進捗表示を Update
frmProgressBar.lblBar.Width = siBarWidth * (iCnt) / iMax
DoEvents
Next iCnt
' *** Loop End ***
Unload frmProgressBar ' プログレスバー画面終了
Exit Function
ErrorHandler:
Unload frmProgressBar
If strDoLoop = "" Then
strDoLoop = "繰り返し処理に失敗しました" & _
vbNewLine & Err.Description
End If
End Function