忍者ブログ

まりも的日常

新装開店!まりものつぶやきお引っ越し先です。

小説の目次はこちら
小説の更新情報はこちら
裏サイトはこちら

エクセルマクロで処理中画面・キャンセルボタン付き

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

コメント

ただいまコメントを受けつけておりません。

エクセルマクロで処理中画面・キャンセルボタン付き

結構試行錯誤したので覚書。
一番シンプルな方法

前提:
プログレスバーコントロールは使わない。ラベルで代用
(つーかまりもの環境では使えなかったぉ・3・)
キャンセル、[×]ボタンで処理を中断できる

つかみはOK?
んじゃやってみよ!

新規フォーム(frmProgressBar)にフレーム(frameBar)、ラベル(lblBar)、ボタン(btnCancel)を作成する
(↑ラベルはフレーム内に張り付ける)
こんな感じ
20150430.png

キャンセル判定フラグを標準モジュールに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
PR

コメント

プロフィール

HN:
まりも
性別:
女性

P R