質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

4回答

12460閲覧

EXCEL VBAでfor文のループ中にセットしたラベルのCaptionをfor文ループ中に表示させたい。

GiveAHand

総合スコア286

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2016/06/26 13:22

Excel VBAで、アプリケーションを作成しています。

処理時間がが長いので、For文中に進捗状況を表示させるために、ActiveXのラベルを設置して、そのCaptionに進捗を表示させるようにしたのですが、DoEventsを使っても、Sleepで少し待っても、ScreenUpdatingをTrueにしても、処理が完了するまで、ラベルのCaptionにセットした文字が表示されません。

つまり、処理中にはラベルのCaptionがずっと何も表示されず、処理終了後に、最後にセットしたCaptionが表示されるという状態です。

ちなみに、デバッグモードでステップ実行をすると、ループ中でもCaptionにセットした文字が表示されます。

また、ソースはこのように書いてます。

VBA

1 2For i = 0 To 100000 3 4 Application.ScreenUpdating = True 5 6 DoEvents 7 8 Sleep 1000 9 10 Worksheets(1).lblMassage.Caption = i & "番目を処理中" 11 12 DoEvents 13 14 Application.ScreenUpdating = False 15 16 (VBAの処理) 17 18Next 19

DoEvebts、ScreenUpdating 、Sleepなどを、このようにつけたり、無くしたり、いろいろな組み合わせでやってみましたが、結果は何も変わりませんでした。

もちろん、ScreenUpdatingの記述を完全に無くしてもみました。

ActiveXのラベルのCaprionは、処理中にセットしたものは、処理が終わるまで表示されないものなのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

Excel2010で試したところ問題なく更新されました。
ちなみにこれだけ。

VBA

1For i = 0 To 100000 2 Worksheets(1).lblMassage.Caption = i & "番目を処理中" 3 DoEvents 4Next

提示されているコードでも問題ありませんでした。
別の原因があるような気がします。

投稿2016/06/27 00:29

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GiveAHand

2016/06/28 09:20 編集

ttyp03様 ご回答ありがとうございます。 おっしゃるとおり、このプログラムで、私のほうでもきちんと表示されました。 そして、原因わかりました。 原因は、プログラム自体を関数にして、標準モジュールに入れていたのですが、それが問題だったようです。 プログラム自体を、シートに書いたら問題なく更新されました! 動作検証して、動くという報告を頂いて私も方でもピンときました。 ありがとうございました!
guest

0

私もttyp03さん同様、Excel2010環境で検証しましたが、問題なく1件づつ再描画されました。

メインのVBA処理ではScreenUpdating = Falseにしたいと考えると、最低限以下のコードがあればラベル再描画が行われると思います。

Sub Test() For i = 0 To 100000 Application.ScreenUpdating = True DoEvents Worksheets(1).lblMassage.Caption = i & "番目を処理中" DoEvents Application.ScreenUpdating = False '(VBAの処理) Next End Sub

これで再描画されないのであれば、前後の処理や環境の違いなどが原因かもしれません。

100000回というループ数に対して毎回DoEventsするのはいたずらに処理を重くしているような気がしますが、それはまた別の話。
lblMassageがMessage(メッセージ)ではなくMassage(マッサージ)なのも気になりましたが、それもまた別の話。

投稿2016/06/27 07:30

編集2016/06/27 07:31
jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GiveAHand

2016/06/28 09:19

jawa様 ttyp03さんの回答にも書きましたが、原因は、プログラム自体を関数にして、標準モジュールに入れていたのですが、それが問題だったようです。 プログラム自体を、シートに書いたら問題なく更新されました! 非常にご丁寧な検証をありがとうございました! これが無ければ気が付かなかったです。 ありがとうございました!
guest

0

ActiveXって、懐かしい響きがしますね。
直接的な回答ではないですが、ステータスバーを使うという代替案ではダメですか?

VBA

1Application.StatusBar = i & "番目を処理中"

こちらのほうがよほど簡単ですし、無駄に時間とられるより
現実的な対応をするというのもひとつだと思いますがいかがでしょう。

投稿2016/06/26 23:26

Mr_Roboto

総合スコア2208

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GiveAHand

2016/06/28 09:07

BJCRobot様 ご回答ありがとうございます。 そうですね。。。 フォームではなく、シートに直接オブジェクトを貼り付けていますので。。。
guest

0

少し扱いがメンドクサイ AND 1秒ずつ更新しかできませんが
Application.OnTime
とかー

投稿2016/06/27 00:10

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/06/27 00:45

あれ?lblMassageってなんだろう labelじゃないのか・・・
GiveAHand

2016/06/28 09:08

dot-asterisque様 ご回答ありがとうございます。 こんなのもあるんですね。 ただ、確かに扱いめんどくさそう。。。^^;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問