2016-10-07 10 views
3

プログレスバーの使用方法については、 stackoverflowから読んでいます。進捗インジケータ、vbaで応答しなくなる

これはうまくいきますが、6%の短い時間が経過した後、23行目の14行目には応答がないと表示され、ループが終了するまで続きます。

だから私はそれがvbmodeless実行しています:

ProgressBar.Show vbModeless 

ProgressBar.Label_WhatsGoingOn.Caption = "Reading data from database.." 

projectNumber = "32966" 
docOutArray = Post.helpRequest("xdnjgjrdin.asp?Dok4=" & projectNumber) 

If CPearson.IsArrayEmpty(docOutArray) Then 
    MsgBox "No document registered in database!" 
End If 

ProgressBar.Label_WhatsGoingOn.Caption = "Creating Docout.." 

Set doc_ = NEwDocOut.createDocOutDocument(projectNumber) 

numOfRows = UBound(docOutArray, 1) 


For i = LBound(docOutArray, 1) To numOfRows 
    ProgressBar.Label_WhatsGoingOn.Caption = "Creating Row.." 

    sPercentage = (i/numOfRows) * 100 
    ProgressBar.progress (sPercentage) 

私のプログレスバーコード:

Private Sub UserForm_Initialize() 
Me.Text.Caption = "0% Completed" 
End Sub 

Public Sub progress(pctCompl As Single) 

Me.Text.Caption = Format(pctCompl, "##") & "% Completed" 
Me.Bar.Width = pctCompl * 2 
Me.Repaint 
DoEvents 

End Sub 

これがなぜ起こるか任意のアイデア?

enter image description here

答えて

2

これは、しばらくの間、私に迷惑されていると、あなたはあなたに感謝answer-を探すために私を促してきました。

それはちょうどあなたのケースでは、あなたのループ内DoEventsを落とし、実際には非常に簡単です:ここで

For i = LBound(docOutArray, 1) To numOfRows 
    'Add this line here: 
    DoEvents 

    ProgressBar.Label_WhatsGoingOn.Caption = "Creating Row.." 

    sPercentage = (i/numOfRows) * 100 
    ProgressBar.progress (sPercentage) 
+0

私は「DoEvents関数は、」すべてのイベントを考えて考えて、ではありませんプログレスバーを更新するイベントだけです。一般的にこれは問題ではありませんが、他のボタン/フォームが開いている可能性がある場合は、それらのクリックが既に実行中のコードに干渉しないように注意する必要があります。 – Shimeon

+0

@skatunこの回答がうまく機能していますか? – User632716

+0

はい、@tomprestonそれはちょっと問題です。問題は現在、プログレスバーがバックグラウンドで取得され、プログレスバーがすでに存在しているかsthであるためにプログレスバーが表示されないというエラーが発生することがあります。私はこれを今見ている。 – skatun

2

は私の更新されたコードの提案です:

Public Sub progress(pctCompl As Single) 
    Me.Text.Caption = Format(pctCompl, "##") & "% Completed" 
    Me.Bar.Width = pctCompl * 2 
    Me.Repaint 
End Sub 

Public Sub setMessage(message As String, Optional percentage As Single = 0#) 
    If Not ProgressBar.Visible Then ProgressBar.Show vbModeless 
    ProgressBar.Label_WhatsGoingOn.Caption = message 
    If percentage <> 0 Then Call ProgressBar.progress(percentage) 
End Sub 
関連する問題