2017-08-15 15 views
0

私はExcelで動作するのに1分ほどかかるVBAコードを持っていますが、コードがまだ残っていることをユーザーに見せるためにプログレスバーまたはある種の待機画面を追加しようとしていました正しく動作しています。 ProgressBarは特定の種類のコードでのみ真の進歩を示すことができます。そのコードのうち、私は私が当てはまるとは考えていません。VBAでLooping ProgressBarローダー

しかし、ProgressBarのループを作成する方法があるのだろうかと疑問に思っていました。コードが完成するまで、最初からもう一度開始します。私のコードをアクティブにすると、UserForm1がポップアップし、ProgressBarが繰り返し表示され、コードが完了するとUserFormがアンロードされます。

提案が参考になります。

ありがとうございます!私は、ユーザーフォーム上のプログレスバーのために以下を使用

答えて

0

enter image description here

。これはフレーム内のラベルで構成されています。最初にラベルの幅がゼロになってから、フレームが100%完成するまで幅が広がります。ラベルにはテキストはありませんが、バーとして機能するBackColorプロパティが設定されています。フレームの右側に2番目のprogressTextラベルがあります。この関数を呼び出すには、i = i + 1のようなループをpctCompl = 100 * i/iTotalNumとし、ループ内に含める:progress pctCompl, "listing files"を入力します。完了すると、progress -1で進行状況バーが非表示になります。常にpctCompl = 0を使用して0にリセットすることができます。

Sub progress(pctCompl As Integer, Optional msg As String) 
Dim increment As Double, i As Integer 
If pctCompl < 0 Then 
    If progressBar.Width < 0.9 * progressFrame.Width Then 
    progressBar.Width = progressFrame.Width 
    Application.Wait (Now + TimeValue("0:00:01")) 
    End If 
    progressText.Visible = False 
    progressFrame.Visible = False 
    Exit Sub 
Else 
    progressText.Visible = True 
    progressFrame.Visible = True 
End If 
progressText.Caption = pctCompl & "% " & msg 
progressBar.Width = progressFrame.Width * pctCompl/100 
DoEvents 
End Sub 

Private Sub UserForm_Activate() 
    progressFrame.Visible = False 
    progressText.Visible = False 
end Sub 
+0

待つのではなく、label.zorder 0を実行するか、ラベルをフレームと同じサイズとframe.repaintに入れてください。また、整数の代わりにdoubleを使用してください。なぜなら、vbaは丸めの数値とmax'esについて混乱しないからです(もし1000 * 1000のように試してみると、即時のウィンドウでは、少数ですがオーバーフローエラーになります)。コードの速度が遅くなるのを避けるために、たとえばmod 3 = 0、affProgressのように使用することがよくありますが、値3を変更してそれに応じて調整することができます。 –