'======= 標準 EXE プロジェクト ======== ' ' Form1 と Form2 を用意 ' ' '======= Form1 ======== ' ボタンをひとつ貼っておく ' Option Explicit Private WithEvents Shori As Form2 Private Sub Command1_Click() Set Shori = New Form2 Shori.RunAsync End Sub Private Sub Form_Load() Command1.Caption = "処理" End Sub Private Sub Shori_Completed(ByVal Canceled As Boolean, ByVal Result As Variant) Set Shori = Nothing If Canceled Then MsgBox "処理はキャンセルされました。" Else MsgBox "処理完了:" & CStr(Result) End If End Sub ' '======= Form2 ======== ' ボタンとタイマーを貼っておく ' Option Explicit Public Event Completed(ByVal Canceled As Boolean, ByVal Result As Variant) Private IsRunning As Boolean Private IsCanceled As Boolean Private Result As Variant Public Sub RunAsync() Load Me Me.Show vbModal End Sub Private Sub Form_Load() IsRunning = True IsCanceled = False Command1.Caption = "キャンセル" Timer1.Interval = 100 Timer1.Enabled = True End Sub Private Sub Command1_Click() Command1.Enabled = False IsCanceled = True DoEvents End Sub Private Sub Timer1_Timer() Timer1.Enabled = False IsRunning = True Dim dummyData As Long '長い処理 Dim limit As Date limit = DateAdd("s", 30, Now) '30秒後 Do Until Now > limit '適当な DoEvents If (Second(Now) Mod 2) = 0 Then DoEvents '2秒に1回、DoEvents End If 'なんかの処理 dummyData = dummyData + 1 Me.Caption = CStr(dummyData) If (Second(Now) Mod 5) = 0 Then '5秒に1回、キャンセル判定 If IsCanceled Then 'キャンセルされたので中断 Me.Caption = "終了処理中..." Exit Do End If End If Loop IsRunning = False Result = dummyData Unload Me End Sub Private Sub Form_Unload(Cancel As Integer) If IsRunning Then MsgBox "まだ処理中です!" Cancel = True Else RaiseEvent Completed(IsCanceled, Result) End If End Sub