アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

また他におすすめなやり方があれば教えて頂ければ…
初心者な質問で申し訳御座いません。

A 回答 (5件)

説明するのがめんどくさいので


参考になるサイトを紹介します。
(プログレスバーを使用しているわけではありませんがルーチン処理は参考になるかと)

「お待ちください」メッセージの表示 」
http://officetanaka.net/excel/vba/tips/tips23.htm
    • good
    • 0
この回答へのお礼

お答え頂きありがとう御座います。
私のような初心者にはこちらの処理の方があっているかもしれませんね。
今回VBAを使ってみて勉強と言う意味でもプログレスバーに挑戦してみようと思います。
挫折したそのときはこの方法を使わせて頂きます。

お礼日時:2007/09/03 22:54

方法は、


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
'-----------------------------------------------------
何度もすみませんが宜しくお願いします。

補足日時:2007/09/03 23:02
    • good
    • 1
この回答へのお礼

お返事頂きありがとう御座います。
すごいですね・・・実際に教えて頂いたコードを入力し試してみました。
私が見つけてきたサンプルではバーが延びるだけでしたが、教えて頂いた方は%表示も表示されていて驚きました。
まだテストで使ってみただけですので実際に組み込んでみたいと思います。
ありがとう御座いました。
(追加質問に答えていただければ幸いです)

お礼日時:2007/09/03 23:02

モーダルフォームだと方法は無いのですが


モードレスフォームなら別のフォームを表示して内容を交信することも可能です
ただ、呼び出し元のフォームもモードレスフォームでないといけません

ユーザーフォームのプロパティウィンドウの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

といった具合ですよ
    • good
    • 0
この回答へのお礼

お返事いただきありがとう御座います。
教えて頂いたとうりモードレスフォームにすると、処理するようになりました。
しかし私の組み込み方が悪くプログレスバーは何も動作しませんでした。
教えて頂いているコードを組み込んでみましたが”Progress1”と言う命令が存在しません・・・
私の使っているexcel97がだめなんでしょうか・・・
せっかく教えていただいて私が理解出来ず申し訳ないです。

お礼日時:2007/09/03 23:15

# もしかするとプログレスバーは開発者ライセンスが必要かも ...



フォームにプログレスバーを貼り付けることは出来ているのでしょうか?

出来ているのであればそのプログレスバーを選択して
プロパティウィンドウの『オブジェクト名』を確認しましょう

プログレスバーが貼り付け出来ないのであれば
ツール > その他のコントロールで表示されるダイアログで
『Microsoft ProgressBar Control Version x.x』を探してチェックをつけます
これで ツールボックスにプログレスバーのアイコンが表示されますので フォームに貼り付けてみてください
    • good
    • 0
この回答へのお礼

回答頂きありがとう御座います。
おっしゃるとうりツールボックスになかったので、『Microsoft ProgressBar Control Version x.x』を探してチェックをつけ、
ツールボックスにプログレスバーが追加されたのですが…使い方がよく分からず、プログレスバー風の処理を見つけ
そちらを使おうとしています…もっと勉強してから質問するようにします。

お礼日時:2007/09/05 06:40

いいえ


☆下記のループに、入れては、だめです。
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 には、プログレスバーの機能(コマンド)が、ないので、プログレスバー風に考えられたものです。
    • good
    • 0
この回答へのお礼

またお答え頂き本当にありがとう御座います。
教えて頂いたプログラムまだ試していませんが(他の仕事で手があかず…)、実際に使わせて頂きます。
初心者な私に丁寧に教えていただきありがとう御座いました。もっと勉強したいと言う気持ちになっていますので、
今後また質問させて頂くことがあれば教えて頂ければ幸いです。

お礼日時:2007/09/05 06:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!