
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
また他におすすめなやり方があれば教えて頂ければ…
初心者な質問で申し訳御座いません。
No.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 には、プログレスバーの機能(コマンド)が、ないので、プログレスバー風に考えられたものです。
またお答え頂き本当にありがとう御座います。
教えて頂いたプログラムまだ試していませんが(他の仕事で手があかず…)、実際に使わせて頂きます。
初心者な私に丁寧に教えていただきありがとう御座いました。もっと勉強したいと言う気持ちになっていますので、
今後また質問させて頂くことがあれば教えて頂ければ幸いです。
No.4
- 回答日時:
# もしかするとプログレスバーは開発者ライセンスが必要かも ...
フォームにプログレスバーを貼り付けることは出来ているのでしょうか?
出来ているのであればそのプログレスバーを選択して
プロパティウィンドウの『オブジェクト名』を確認しましょう
プログレスバーが貼り付け出来ないのであれば
ツール > その他のコントロールで表示されるダイアログで
『Microsoft ProgressBar Control Version x.x』を探してチェックをつけます
これで ツールボックスにプログレスバーのアイコンが表示されますので フォームに貼り付けてみてください
回答頂きありがとう御座います。
おっしゃるとうりツールボックスになかったので、『Microsoft ProgressBar Control Version x.x』を探してチェックをつけ、
ツールボックスにプログレスバーが追加されたのですが…使い方がよく分からず、プログレスバー風の処理を見つけ
そちらを使おうとしています…もっと勉強してから質問するようにします。
No.3
- 回答日時:
モーダルフォームだと方法は無いのですが
モードレスフォームなら別のフォームを表示して内容を交信することも可能です
ただ、呼び出し元のフォームもモードレスフォームでないといけません
ユーザーフォームのプロパティウィンドウの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がだめなんでしょうか・・・
せっかく教えていただいて私が理解出来ず申し訳ないです。
No.2
- 回答日時:
方法は、
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の代わりに時間のかかる処理などを行ってください。
なお、ステータスバーに表示する文字列の色や大きさを変更することはできません。
参考URL:http://officetanaka.net/excel/vba/tips/tips13.htm
この回答への補足
追加質問です。(初歩的なこともままならないのですみません・・・)
' ----------------------------------------------------
For j = 1 To 10000
'デバッグ用タイミング(実際はここに実行マクロを入れる)
↑↑
ここの部分に私で言うグラフ作成マクロを組み込めばいいのでしょうか?
Next
'-----------------------------------------------------
何度もすみませんが宜しくお願いします。
お返事頂きありがとう御座います。
すごいですね・・・実際に教えて頂いたコードを入力し試してみました。
私が見つけてきたサンプルではバーが延びるだけでしたが、教えて頂いた方は%表示も表示されていて驚きました。
まだテストで使ってみただけですので実際に組み込んでみたいと思います。
ありがとう御座いました。
(追加質問に答えていただければ幸いです)

No.1
- 回答日時:
説明するのがめんどくさいので
参考になるサイトを紹介します。
(プログレスバーを使用しているわけではありませんがルーチン処理は参考になるかと)
「お待ちください」メッセージの表示 」
http://officetanaka.net/excel/vba/tips/tips23.htm
お答え頂きありがとう御座います。
私のような初心者にはこちらの処理の方があっているかもしれませんね。
今回VBAを使ってみて勉強と言う意味でもプログレスバーに挑戦してみようと思います。
挫折したそのときはこの方法を使わせて頂きます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) 複数シートの複数列に入力されているデータを重複なしで抽出するVBAを作りたいです。 9 2022/06/17 10:33
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Excel(エクセル) エクセルのイベントVBAを複数のシートで動かしたい 1 2022/12/07 16:55
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Visual Basic(VBA) vba Sleep関数について教えてください 1 2023/01/18 10:18
- Visual Basic(VBA) エクセルのマクロで対象ごとにシート分けしてその内容をセルに書き込みたい 9 2022/08/24 13:23
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) QRコード作成マクロについて 3 2022/11/26 16:55
- Visual Basic(VBA) Vba UserFormを前面に出す方法を教えてください 1 2023/08/17 11:08
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
switch の範囲指定
-
【Excel】特定の文字を含むセル...
-
VBAでループ内で使う変数名を可...
-
UMLでの例外処理
-
DoEventsがやはり分からない
-
フォーム上のすべてのTextBoxを...
-
月度は何て読みますか?
-
EXCEL VBA マクロ 実行する度に...
-
VBの質問#if 0 then ってどう...
-
VB.NET Excelを読み込んでDataT...
-
取り消し線が入った文字を削除...
-
VBAでCOPYを繰り返すと、処理が...
-
リョウ・・・量?料?
-
findは動くがfindnextがマクロ...
-
RPGプログラムの*HIVALについて
-
COBOLのEVALUATE文について
-
EXCEL2003 VBAで2つのDBに接続...
-
VBAでセルに値が入力されるまで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
【Excel】特定の文字を含むセル...
-
VBAでループ内で使う変数名を可...
-
メルカリのメルカードで買い物...
-
月度は何て読みますか?
-
UMLでの例外処理
-
EXCEL VBA マクロ 実行する度に...
-
セックスレスの既婚女性は自慰...
-
switch の範囲指定
-
インタラクティブの反対語は?
-
Loadイベント中にほかのイベン...
-
Do~Loopした回数をカウントしたい
-
VBの質問#if 0 then ってどう...
-
DoEventsがやはり分からない
-
お家デートをしててハグを長い...
-
findは動くがfindnextがマクロ...
-
リョウ・・・量?料?
-
生活保護受給者は性欲をどんな...
-
iD
おすすめ情報