- ベストアンサー
excel VBA プログレスバーについて(初心者)
VBA初心者の質問です… excelで入力されている値を用いて、グラフ作成する簡単なデータを作りました。 特に問題なくグラフは出来たのですが、グラフ作成が1つではなく数個同時(順番)に作成しているため時間が掛かってしまいます。 この処理中にプログレスバーを表示出来ればと思い質問を致します。 私なりに調べ(goo内)下記サンプルを発見し、簡単なのでこれを使をうかと思うのですが、UserForm1の処理前にUserForm2.showだけでは UserForm2の処理が終わらないと処理をしません…当然ですよね… 本当に初心者で申し訳ないのですが、UserForm1の処理最中にUserform2のプログレスバーを表示するのにはどうすればいいのでしょうか… 【サンプル】 Private Sub UserForm_Activate() With Label1 .SpecialEffect = 2 .BackColor = vbBlue www = .Width .Width = 0 End With For i = 1 To 1000 Me.Caption = i Label1.Width = i / 1000 * www Me.Repaint Next End Sub また他におすすめなやり方があれば教えて頂ければ… 初心者な質問で申し訳御座いません。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
いいえ ☆下記のループに、入れては、だめです。 For j = 1 To 10000 Next は、削除するか コメント行にしてください。 ' ---------------------------------------------------- For j = 1 To 10000 'デバッグ用タイミング(実際はここに実行マクロを入れる) ↑↑ ここの部分に私で言うグラフ作成マクロを組み込めばいいのでしょうか? Next '----------------------------------------------------- ☆正確には、下記の中です。 ' ---------------------------------------------------- '(実際はここに実行マクロを入れる) ' 例えば、 Call グラフ作成処理プログラム ' とします。 '----------------------------------------------------- また、 For i = 1 To cend j = i / cend * 100 With UserForm1 .Label2.Caption = Int(j) & "%" .Label1.Width = tsiz * j / 100 End With の中の、cend = 1500 'デバッグ用数値を独自に設定する必要があるでしょう。 例えば、処理時間が、プログレスバーの最後にならない内に処理が終わってしまうとか、その反対にプログレスバーが、早く終わってしまうとかです。 私の場合は、処理する セルの数を算出して 設定しています。 参考として、変形させた コードを乗せます。 詳しいことは、省略します。[ ご自分で、考えてください。 ] ' 以下は 標準モジュールです。 Sub 123() Dim tsiz As Integer, K As Integer, N As Integer Dim Memorys As Long, Memorys_Cunt As Long, Memoryss As Long Do ' 実際はここに実行マクロを入れる) Call My_Progress_bar(Memorys_Cunt, RoW, Memoryss) Loop UserForm1.Hide End Sub Function My_Progress_bar(I As Long, tsiz As Integer, cend As Long) Dim J As Integer J = I / cend * 100 If J >= 100 Then J = 100 With UserForm2 .Label2.Caption = Int(J) & "%" .Label1.Width = tsiz * J / 100 End With DoEvents End Function UserForm1.Show vbModeless 注意:これは、VBA には、プログレスバーの機能(コマンド)が、ないので、プログレスバー風に考えられたものです。
その他の回答 (4)
- redfox63
- ベストアンサー率71% (1325/1856)
# もしかするとプログレスバーは開発者ライセンスが必要かも ... フォームにプログレスバーを貼り付けることは出来ているのでしょうか? 出来ているのであればそのプログレスバーを選択して プロパティウィンドウの『オブジェクト名』を確認しましょう プログレスバーが貼り付け出来ないのであれば ツール > その他のコントロールで表示されるダイアログで 『Microsoft ProgressBar Control Version x.x』を探してチェックをつけます これで ツールボックスにプログレスバーのアイコンが表示されますので フォームに貼り付けてみてください
お礼
回答頂きありがとう御座います。 おっしゃるとうりツールボックスになかったので、『Microsoft ProgressBar Control Version x.x』を探してチェックをつけ、 ツールボックスにプログレスバーが追加されたのですが…使い方がよく分からず、プログレスバー風の処理を見つけ そちらを使おうとしています…もっと勉強してから質問するようにします。
- redfox63
- ベストアンサー率71% (1325/1856)
モーダルフォームだと方法は無いのですが モードレスフォームなら別のフォームを表示して内容を交信することも可能です ただ、呼び出し元のフォームもモードレスフォームでないといけません ユーザーフォームのプロパティウィンドウのShowModalプロパティをFalseに設定して ' Showメソッド引数を FALSEにするとモードレスフォームになる UserForm2.Show False For i = 1 to 1000 if int( i/10 ) <> Userform2.Progress1.value then UserForm2.Progress1.Value = i/10 End if ' 何かの処理 Next といった具合ですよ
お礼
お返事いただきありがとう御座います。 教えて頂いたとうりモードレスフォームにすると、処理するようになりました。 しかし私の組み込み方が悪くプログレスバーは何も動作しませんでした。 教えて頂いているコードを組み込んでみましたが”Progress1”と言う命令が存在しません・・・ 私の使っているexcel97がだめなんでしょうか・・・ せっかく教えていただいて私が理解出来ず申し訳ないです。
- Nayuta_X
- ベストアンサー率46% (240/511)
方法は、 UserForm1を作成してください。 つぎに UserForm1の上に Label1を作成します。 つぎに Label2をLabel1に重て、同じサイズで作成します。 サイズは、適当で良いです。(後で修正してくださいね。) つぎに 下記コードを 標準モジュールを挿入して コピペします。 Sub プログレスバー() cend = 1500 'デバッグ用数値 '準備:ダイアログへ入力 With UserForm1 .Caption = "マクロ実行中:しばらくお待ち下さい" .Label1.BackColor = RGB(255, 255, 0) .Label2.TextAlign = fmTextAlignCenter .Label2.BackStyle = 0 .Label1.Width = 0 tsiz = .Label2.Width End With ' Application.ScreenUpdating = False UserForm1.Show vbModeless For i = 1 To cend j = i / cend * 100 With UserForm1 .Label2.Caption = Int(j) & "%" .Label1.Width = tsiz * j / 100 End With ' ---------------------------------------------------- For j = 1 To 10000 'デバッグ用タイミング(実際はここに実行マクロを入れる) Next '----------------------------------------------------- DoEvents Next Unload UserForm1 End Sub 参考までに別の方法として: 処理の完了までに長い時間がかかる場合は、何らかの方法でユーザーに「現在処理中です...」と伝えたいものです。Windowsの標準機能などでは、ファイルを削除したりコピーしたりするとき、バーが右に伸びることで処理の進捗状況を伝えます。このバーを「プログレスバー」と呼びますが、こうした仕組みをExcelで実現するときは、ステータスバーを使うのが簡単です。 ステータスバーはExcelの最下部に表示されるバーで、通常は「コマンド」とか「編集」「入力」などと表示されます。また、セルのコピー中には「コピー先を選択して~」などと操作の手順をナビゲートしてくれます。ステータスバーにメッセージを表示するには、ApplicationオブジェクトのStatusBarプロパティに表示したい文字列を設定します。次のコードは「○回目の処理をしています...」をステータスバーに表示します。 Sub Sample01() Dim i As Long For i = 1 To 100 Application.StatusBar = i & "回目の処理をしています..." Next i Application.StatusBar = False End Sub 表示が一瞬で変化して読みとれないときは、Forステートメントの繰り返し回数100を増やしてください。なお、ステータスバーを使い終わったら、Excelが自由に使えるように戻してやります。それには、StatusBarプロパティにFalseを設定します。 徐々に伸びるプログレスバーを真似るなら次のようにします。実際にバーが伸びるわけではありませんが、現在作業しているというメッセージをユーザーに伝えるという本来の目的は果たせます。 Sub Sanple02() Dim i As Long For i = 1 To 20000 If i Mod 1000 = 0 Then Range("A1") = i Application.StatusBar = "処理中..." & String(Int(i / 1000), "■") End If Next i Application.StatusBar = False End Sub 表示が速すぎるときは、Range("A1") = iの代わりに時間のかかる処理などを行ってください。 なお、ステータスバーに表示する文字列の色や大きさを変更することはできません。
お礼
お返事頂きありがとう御座います。 すごいですね・・・実際に教えて頂いたコードを入力し試してみました。 私が見つけてきたサンプルではバーが延びるだけでしたが、教えて頂いた方は%表示も表示されていて驚きました。 まだテストで使ってみただけですので実際に組み込んでみたいと思います。 ありがとう御座いました。 (追加質問に答えていただければ幸いです)
補足
追加質問です。(初歩的なこともままならないのですみません・・・) ' ---------------------------------------------------- For j = 1 To 10000 'デバッグ用タイミング(実際はここに実行マクロを入れる) ↑↑ ここの部分に私で言うグラフ作成マクロを組み込めばいいのでしょうか? Next '----------------------------------------------------- 何度もすみませんが宜しくお願いします。
説明するのがめんどくさいので 参考になるサイトを紹介します。 (プログレスバーを使用しているわけではありませんがルーチン処理は参考になるかと) 「お待ちください」メッセージの表示 」 http://officetanaka.net/excel/vba/tips/tips23.htm
お礼
お答え頂きありがとう御座います。 私のような初心者にはこちらの処理の方があっているかもしれませんね。 今回VBAを使ってみて勉強と言う意味でもプログレスバーに挑戦してみようと思います。 挫折したそのときはこの方法を使わせて頂きます。
お礼
またお答え頂き本当にありがとう御座います。 教えて頂いたプログラムまだ試していませんが(他の仕事で手があかず…)、実際に使わせて頂きます。 初心者な私に丁寧に教えていただきありがとう御座いました。もっと勉強したいと言う気持ちになっていますので、 今後また質問させて頂くことがあれば教えて頂ければ幸いです。