Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(その他)
ユーザーフォームのラベルのキャプションを可変にするには?
投稿日時: 21/12/21 16:44:36
投稿者: Alice

Microsoft Excel for Microsoft 365 MSOを使用しています。
 
UserForm1のLabel1のキャプションが処理が進むに応じて変わるようにしたいと考えています。
(長い処理の時、どこを処理中か分かるようにしたいのが目的。
本来のコードは、Callでとばす前に「UserForm1.Label1.Caption」を入れようと思っています。)
 
簡素なコードで試しているのですが(下記)、通しで行うとキャプション名が変わらないままで終わってしまいます。
Sleepのところにブレークポイントをおいてみると、下記コードの意図しているとおりに表記されます。
(※Sleepを入れたのは、単に動作確認をするのに”待機時間”を設けたかった為)
 
根本的に誤っているのかもしれないのですが、いろいろとネットで調べてみたものの、またもや手詰まりになった為投稿した次第です。
 
アドバイスを下さる方がいらっしゃいますと助かります。
何卒宜しくお願い致します。
 
【標準モジュール】

Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)

Sub test()

'下記サイト参照
'http://officetanaka.net/excel/vba/tips/tips23.htm

 UserForm1.Show vbModeless
 UserForm1.repaint

   UserForm1.Label1.Caption = "テスト1"
      Sleep 3000

   UserForm1.Label1.Caption = "テスト2"
      Sleep 3000

 Unload UserForm1

End Sub

 
--------------------------------
【フォーム】
UserForm1のコード内は、下記のように自分ではいじっていない状態
 
Private Sub UserForm_Click()

End Sub

回答
投稿日時: 21/12/21 17:14:39
投稿者: hatena
投稿者のウェブサイトに移動

コード実行中は、変更したら、Repaint か DoEvents を入れないと、変更が反映されません。
 
Sub test()
 
'下記サイト参照
'http://officetanaka.net/excel/vba/tips/tips23.htm
 
    UserForm.Show vbModeless
     
 
    UserForm1.Label1.Caption = "テスト1"
    UserForm1.Repaint
' DoEvents
    Sleep 3000
 
    UserForm1.Label1.Caption = "テスト2"
' UserForm1.Repaint
    DoEvents
    Sleep 3000
 
    Unload UserForm2
End Sub
 
モードレスで開いているということは、ユーザーにシートなどの操作をさせたいということだと思いますが、そうなら、DoEvents を適切な箇所に入れる必要があります。
 
実際のコードが分からないので、一般論としてはこんなところです。

回答
投稿日時: 21/12/21 17:49:37
投稿者: mattuwan44

標準モジュール Module2>>
 

Option Explicit
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)

Sub test()
    UserForm1.Show
End Sub

Sub 疑似処理()
    Sleep 3000
End Sub

 
ユーザーフォームモジュール UserForm1>>
 
Option Explicit

Private Sub UserForm_Activate()
    Dim i As Long
        
    i = 1
    Do
        Me.Label1.Caption = "テスト" & i
        Me.Repaint
        
        Call Module2.疑似処理   'ここで本来やりたい処理を呼ぶ
        
        i = i + 1
    Loop Until i > 3
    
    Unload Me
End Sub

 
※Module2にしたのはModule1で他の質問の回答のコードを書いていたからです。
 
例示のサンプルはループの管理をユーザーフォーム側で行う手法かと思います。
ループではなく、順次行うように書くとしてもユーザーフォーム側から呼び出すとよいと思います。

投稿日時: 21/12/22 12:09:24
投稿者: Alice

hatena様
mattuwan44様
 
早速の回答、ありがとうございました。
 
既に作成している取り込みたいコードの作りから、hatena様の方法が取り入れやすかった為、hatena様のアドバイスで解決できました‼
 

引用:
モードレスで開いているということは、ユーザーにシートなどの操作をさせたいということだと思いますが

 
Excelに処理を任せっぱなしで良くユーザーの操作は不必要だったので、「vbModeless」を外してみたところ下記の箇所で止まってしまい、先に進めなかった為「vbModeless」を入れました。
UserForm1.Show
 
hatenas様のアドバイスから、「Repaint」をググったところ今回の解決につながるサイトが既にありました。。

https://www.feedsoft.net/access/tips/tips205.html
 
「Repaint」というものを知らなかったので、知るきっかけになり助かりました。
 
mattuwan44様のやり方も、今後のコードの作り方に応じて取り入れさせていただきたいと思います。
 
hatena様、mattuwan44様、改めてありがとうございました。大感謝です。