ステータスバーを一定時間後に更新する

このQ&Aのポイント
  • 一定時間後(10[S]毎)にステータスバーの進捗状態を更新させたい。
  • 上記マクロに、10[s]毎にステータスバーの進捗状態を更新するマクロとしたい。
  • 10[S]たったら1%、20[S]たったら2%、...、1000[s]たったら100% のステータスバーを表示する構成にしたい。
回答を見る
  • ベストアンサー

ステータスバーを一定時間後に更新する

office365 一定時間後(10[S]毎)にステータスバーの進捗状態を更新させたい 下記は、iを1ずつカウントしたらステータスバーを1%~100%まで表示するマクロです。 Sub sample() ' Dim i As Long Dim num As Long UserForm5.Show vbModeless UserForm5.StartUpPosition = 0 UserForm5.Top = 0 UserForm5.Left = 0 i = 1 num = 100 For  i = 1 To  num With UserForm5 .ProgressBar1.Value = i .パーセント.Caption = Int(i / num * 100) & "%" .Repaint End With Next End Sub 上記マクロに、10[s]毎にステータスバーの進捗状態を更新するマクロとしたいのですが、その方法がわからずべたのマクロで教えていただきたく。 10[S]たったら1% 20[S]たったら2% … 1000[s]たったら100% のステータスバーを表示する構成にしたいのです。

質問者が選んだベストアンサー

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1621/2461)
回答No.1

以下は1秒ごとに1%増えるコードです。 TimeValue("00:00:01") を変更して試してみてください。 Sub Test() Dim i As Long UserForm5.Show vbModeless With UserForm5 .ProgressBar1.Max = 100 .ProgressBar1.Min = 0 For i = .ProgressBar1.Min To .ProgressBar1.Max .ProgressBar1.Value = i .パーセント.Caption = i & "%" .Repaint Application.Wait Now() + TimeValue("00:00:01") Next End With End Sub

3620313
質問者

お礼

回答ありがとうございます。 助かりました。 TimeValue("00:00:01")を変える所も、セルの値を参照して時間を変えられる様にしました。

その他の回答 (1)

  • HohoPapa
  • ベストアンサー率65% (454/692)
回答No.2

ProgressBarに表示するとともに StatusBarにも x%を表示するんですね? そのStatusBarとは、 formの最下行の場所ではなく シートを表示した画面の最下行のStatusBarのことですね? 以下が、ステータスバーに表示するサンプルです。 (32ビット版限定です) Option Explicit Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Sub aaa()  Dim i As Long    For i = 0 To 10000   If i Mod 100 = 0 Then    Application.StatusBar = Format(Int(i / 100), "00") & "%"    DoEvents   End If   Sleep 100  Next i    Sleep 5000  Application.StatusBar = False End Sub

3620313
質問者

お礼

回答ありがとうございます。 office365は64bitなので動作しませんでしたが、office2016で動作確認できました。 なお そのStatusBarとは、 formの最下行の場所ではなく シートを表示した画面の最下行のStatusBarのことですね? とありますが、最下行のStatusBarではなく、ユーザフォームを使用したStatusBarにしてます。

関連するQ&A

  • VBAでUserFormでProgressBarとLabelを同時表示できない理由は?

    VBAでUserFormをつかってProgressBarとLabelを同時に表示させる。つもりでしたが、ProgressBarが満たされた後Labelが表示されます。その理由と対策を教えて下さい。そのコードを以下に示します。 Sub a() With UserForm1 .Show vbModeless .Label1 = "始めのテキスト" End With s = 1 e = 20000 For i = s To e UserForm1.Label1 = "始めのテキスト" UserForm1.ProgressBar1.Value = i / e * 1000 Next i End Sub お願いします。

  • プログラスバー表示の更新について

    office365 ,office2016でも同じ serial1のシートが50件,serial2のシートが10件の状態で macro1,macro2を連続して実行すると macro1の内容のプログレスバーは正しく表示するが、 macro2のプログレスバーは100%の時点で最大までいかない。 excelファイルを閉じて、 macro2,macro1の順に連続して実行すると macro2の内容のプログレスバーは正しく表示するが、 macro1のプログレスバーは20%の時点で実行時エラー'380' Invalid property value のエラー表示が出る。 excelファイルを開いて macro1実行し excelファイルを閉じて macro2実行すると 両方のプログレスバー共、正しく表示される また macro1実行しユーザフォームのinfo2をダブルクリックして macro2実行すると 両方のプログレスバー共、正しく表示される という状況です。 serialの値が更新されていないのが原因みたいです。 いろいろやってみたのですが、対処内容が分かりません。 どうやったらmacro1,macro2連続実行してプログラスバーの表示が正しく表示されるか教えていただきたく。 ユーザフォームinfo2のマクロ Private Sub UserForm_Initialize() Dim serial As Long serial = Worksheets("MENU").Cells(1, 8).Value With ProgressBar2 .Min = 0 .Max = serial .Value = 0 End With パーセント.Caption = "" End Sub マクロ1 sub macro1() serial = Worksheets("serial1").Cells(Rows.Count, 1).End(xlUp).row Worksheets("MENU").Cells(1, 8).Value = serial 'いろんな処理 info2.Show vbModeless info2.StartUpPosition = 0 info2.Top = 0 info2.Left = 465 ' With info2 .ProgressBar2.Value = I .パーセント.Caption = Int(I / serial * 100) & "%" .kisyu.Caption = Worksheets("serial1").Cells(I, 1).Value .Repaint End With マクロ2 sub macro2() serial = Worksheets("serial2").Cells(Rows.Count, 1).End(xlUp).row Worksheets("MENU").Cells(1, 8).Value = serial 'いろんな処理 info2.Show vbModeless info2.StartUpPosition = 0 info2.Top = 0 info2.Left = 465 ' With info2 .ProgressBar2.Value = I .パーセント.Caption = Int(I / serial * 100) & "%" .kisyu.Caption = Worksheets("serial2").Cells(I, 1).Value .Repaint End With

  • ExcelVBA TextBoxの値を取得できない

    Excel2010です。 2つのUserFormがあり(UserForm1・UserForm2とします)、UserForm1にはTextBox1~100を配置し、UserForm2にもTextBox1~150を配置しています。 それぞれのUserFormにおいて、そのUserForm名を変数に格納しておき、TextBoxの値を取得するコードを別のプロシージャ(「TextBoxチェック」)に書き、それを呼び出してTextBoxの値を格納しようとしましたができませんでした。 該当箇所のコードは以下のとおりです。 Public UFName As String 'UserFormの名前 Sub UserForm1処理() Const Num = 100 UFName = "UserForm1" Call TextBoxチェック(Num) End Sub Sub UserForm2処理() Const Num = 150 UFName = "UserForm2" Call TextBoxチェック(Num) End Sub Sub TextBoxチェック(Num As Integer) Dim i As Integer Dim Con As Control With UserForms.Add(UFName) For i = 1 To Num Set Con = .Controls("TextBox" & i) Debug.Print Con.Name Debug.Print .Controls("TextBox" & i).Value   (その他の処理のコードは省略) Next i End With End Sub 上のコードでは1つ目のDebug.Printの結果(TextBox名)は取得できていますが、2つ目のDebug.Printの結果(TextBoxの値)は空欄になってしまいます。 つまり、 With UserForms.Add(UFName)が、 Set Con = .Controls("TextBox" & i) では反映されているのに、 .Controls("TextBox" & i).Value では反映されていないということだと思います。 また、 Debug.Print .Controls("TextBox" & i).Value を Debug.Print UserForm1.Controls("TextBox" & i).Value とすると、UserForm1の値を取得できます。 また、 With UFName_UF を With UserForm1 にすると、 Debug.Print .Controls("TextBox" & i).Value の値は取得できます。 UserForm1とUserForm2において、TextBoxの値を取得する部分は共通しているため、その部分を別プロシージャにして呼び出して処理したいのですが、うまくいきません。 TextBoxの値を取得できない理由や、対処法が分かれば教えていただきたいです。

  • ExcelVBAでUserFormのカウント

    ユーザーフォームはどれも開いていない状態です。 カウントしようと Sub test01() Dim i As Long Dim uf As UserForm For Each uf In UserForms i = i + 1 Next MsgBox i End Sub としてみましたが0になってしまいます。 どう書けばいいのでしょうか?

  • 2つのユーザフォームを同時進行表示させる

    office365 やりたい内容は、下記2つの内容を同時進行で表示させたい 1.タイムカウント表示(オブジェクト名TextBox1) 2.プログレスバー表示(オブジェクト名ProgressBar1) 1は最初に設定された数値から1[s]ずつ00:00までカウントダウンする 分と秒の表示だけでOK 70[S]だったら起動した時に01:10と表示し1[S]ごとに減算表示し00:00で終了 2は上記数値に到達するまでの時間を100%として経過をプログレスバーで表示させる 70[S]だったら1秒ごとにプログレスバーを棒グラフっぽく表示 35[S]で50%(棒グラフが真ん中の状態) 70[S]で100%(棒グラフMAX状態) 上記を表現するマクロが下記の通り 1 Sub countdown_time() Dim h As Integer Dim m As Integer Dim s As Integer '// 引数:Date型 'B2セルにカウントタイム秒を時刻表示 例 70[s]の場合 0:01:10 h = Hour(Range("B2")) m = Minute(Range("B2")) s = Second(Range("B2")) Debug.Print "現在の時:" & h Debug.Print "現在の分:" & m Debug.Print "現在の秒:" & s Range("B4") = m 'B2に入力された時刻の分表示 例 70[s]の場合 1 Range("C4") = s 'B2に入力された時刻の秒表示 例 70[s]の場合 10 UserForm1.lblFinishTime.Caption = Range("B1").Text '予定終了時刻 Dim limit As Date, cnt_d As Double limit = DateAdd("s", Range("C4"), Time) '現在時刻に指定秒を足す limit = DateAdd("n", Range("B4"), limit) '現在時刻に指定分を足す rng = 0 '一時停止の時間リセット UserForm1.Show vbModeless 'タイマーをモードレス表示 UserForm1.Repaint '強制表示 Do cnt_d = (DateDiff("s", Time, limit) + rng) / 60 '指定時刻 - 現在時刻 (+ 一時停止) を秒で表して60で割ったもの UserForm1.TextBox1 = Int(cnt_d) & ":" & Format(Round((cnt_d - Int(cnt_d)) * 60, 0), "00") '分:秒 で表示 If UserForm1.TextBox1 = "0:00" Then Exit Do 'ゼロになったらDoを抜ける DoEvents 'イベントを実行 Loop End Sub 2 Sub status_bar() Dim i As Long UserForm5.Show vbModeless With UserForm5 .ProgressBar1.Max = Worksheets("MENU").Range("C2") 'C2セルにカウントする数値を設定 (例 70) .ProgressBar1.Min = 0 For i = .ProgressBar1.Min To .ProgressBar1.Max .ProgressBar1.Value = i .パーセント.Caption = Int(i / .ProgressBar1.Max * 100) & "%" .Repaint Application.Wait Now() + TimeValue(Worksheets("MENU").Range("E2").Value) 'E2セルはカウントインターバルタイム 1[s]の場合、文字列で0:00:01を設定 Next End With End Sub 1にuserform1 2にuserform5 をしていますが、ユーザフォームは1つでもよいです。 2つのユーザフォームを表示させるのに vbModelessを使用すればよいとのことですが、 上記2つのマクロを同時進行表示できない状態です。 2つのユーザフォーム共にShowModalはfalseにしてます。 可能であるなら、上記1,2を1つのユーザフォームで同時実行したい。 無理ならばuserform1,userform5の2つ別々のユーザフォームのままで同時実行で可です。

  • 指定範囲をアクティブセルに変更(エクセル)

    以下のマクロで、A1:E20にある全ての図形を削除できます。 Sub test()  Dim wLeft As Long  Dim wTop As Long  Dim wRight As Long  Dim wBottom As Long  Dim s As Object  With Range("A1:E20")   wTop = .Top   wLeft = .Left   wBottom = .Top + .Height   wRight = .Left + .Width  End With  For Each s In ActiveSheet.DrawingObjects   With s    If wTop <= .Top And _      wLeft <= .Left And _      wBottom >= .Top + .Height And _      wRight >= .Left + .Width Then     .Delete    End If   End With  Next End Sub "With Range("A1:E20")"を、任意のアクティブセルに変更するにはどうすればいいでしょうか? ちなみに、"With ActiveCell"や"With Range(ActiveCell.Address)"では、うまくいきませんでした。

  • 休暇願をVBA作成し両面印刷する方法を教えてほしい

    VBAで休暇願を作成し印刷時は差し込み印刷方法でA4用紙に両面印刷したいのですが書き方が判りません。 マクロの内容を添付しますので両面印刷できるようにするにはどのように書けばよいのか教えてください。 下記のマクロで片面印刷は可能です。 Sub 印刷() Dim LastRow As Long Dim i As Long Dim myNo As Long If vbNo = MsgBox("印刷を開始していいですか?", vbYesNo) Then Exit Sub With Worksheets("名簿マスター") LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row For i = 1 To LastRow myNo = .Range("A" & i).Value With Worksheets("印刷シート") .Range("f7").Value = myNo .PrintOut Copies:=1, Collate:=True End With Next i End With MsgBox "印刷が終わりました" End Sub

  • プログレスバーでの経過状況表示

    vb.netでのtimerのようなものをやりたくてvbaでプログレスバーを使用して経過状況を表示するプログラムを作りました。プログレスバー自体での視覚的な経過状況表示はできたのですが、現在のパーセンテージをlabelに表示することができません。 Private Sub CommandButton4_Click() Dim i As Long Application.Visible = False i = 1 For i = i To 1000000 UserForm1.ProgressBar1.Value = i / 1000000*100 UserForm1.Label1.Caption =UserForm1.ProgressBar1.Value i = i + 1E-44 Next Application.Visible = True End Sub 上記のようにするとプログラム終了時にlabel1に現在のプログレスバーの値が表示されますが、進行中には表示されないのです。これを進行中も表示させるにはどうしたら良いのでしょうか?

  • エクセルのウインドウをど真ん中に表示したい

    Sub Macro2() Dim i As Long Dim j As Long i = Application.UsableHeight / 20 j = Application.UsableWidth / 40 With ActiveWindow .Top = i .Left = j End With With ActiveWindow .Height = i * 18 .Width = j * 38 End With End Sub これで、エクセルのアプリケーション内にウインドウを表示させたくて、 上下左右同じ長さの空白を入れたいのですが 左側の空白が多いです。 何故均等にならないのでしょうか?

  • 値渡しについて

    UserForm1で以下のように求めた値「R」を UserForm2に渡すにはどのようにすればよいのでしょうか。 **************************************** <UserForm1(コード)> Public R As Integer ----------------------------------- Private Sub CommandButton1_Click()    Dim N As Integer        :    N = TextBox1.Text    R= N * 2 + 3        : End Sub **************************************** <UserForm2(コード)> Private Sub CommandButton1_Click()   Dim i As Integer       :   For i = 4 To R       :   Next i       : End Sub **************************************** どなたか教えて下さい。

専門家に質問してみよう