2017-04-03 7 views
1

は私がそれを更新してSQLクエリの結果を追跡するためにリーダーボードとして使用しています単語VBAユーザーフォームを持ってリフレッシュ。 10分ごとにフォームを自動更新する方法はありますか?私はこれを試しました:VBAユーザーフォームが

Private Sub UserForm_Initialize() 
Dim cnn As New ADODB.Connection 
Dim rst As New ADODB.Recordset 
Dim AgingSQL As String 

cnn.ConnectionString = "DATABASE INFO" 
cnn.Open 

AgingSQL = "SQL QUERY" 
rst.Open AgingSQL, cnn 
rst.MoveFirst 
With UserForm1.AgingLeaderboard -- List Box I am using to display info 
    .Clear 
    Do 
     .AddItem 
     .List(i, 0) = rst![StatusBy] 
     .List(i, 1) = rst![Count] 
     i = i + 1 
     rst.MoveNext 
    Loop Until rst.EOF 
End With 
rst.Close 
**Call Refresh** 
End Sub 

Sub Refresh() 
    Application.OnTime Now + TimeValue("00:00:10"), "UserForm_Initialize" 
End Sub 

しかし、それは何もしていないようです。どんな助けもありがとう!標準、手続き型モジュールによって公開され、公開、パラメータなしの方法 -

+0

私は機能であなたのsqlを入れて、10分間待機してから、その関数を呼び出すループを持っているでしょう。後でループカウンタの長さを設定してください。または、あなたのタスクマネージャーで10分ごとにサブコールするタスクを設定することができます –

答えて

3

あなたはマクロ以外のものを実行するためにApplication.OnTimeを使用することはできません。

UserForm_Initializeマクロではありません - それは、オブジェクトが、まあ、を初期化するだけで、これまで一度インスタンスごとに呼び出されUserFormオブジェクト...のInitializeイベントを処理するイベントハンドラ、です。あなたは決してべきではない、これまで明示的にイベントハンドラを呼び出す必要があります。あなた自身がそれをやって見つけた場合、警報ベルが消灯し、大きな巨大な赤い旗が飛ぶ必要があり、何かががひどく間違っ行われています。

UserForm_Initializeにあなたが持っているすべてのものを取り、公共RefreshLeaderboard方法に移動 - あなたはInitializeを処理する必要はありません。

Option Explicit 

Public Sub RefreshLeaderboard() 
    Dim cnn As New ADODB.Connection 
    Dim rst As New ADODB.Recordset 
    Dim AgingSQL As String 

    cnn.ConnectionString = "DATABASE INFO" 
    cnn.Open 

    AgingSQL = "SQL QUERY" 
    rst.Open AgingSQL, cnn 
    rst.MoveFirst 
    With AgingLeaderboard '-- note: was With UserForm1.AgingLeaderBoard 

     .Clear 
     Do 
      .AddItem 
      .List(i, 0) = rst![StatusBy] 
      .List(i, 1) = rst![Count] 
      i = i + 1 
      rst.MoveNext 
     Loop Until rst.EOF 
    End With 
    rst.Close  
End Sub 

今あなたがフォームにアクセスすることができますが、スケジュールすることができますマクロを、必要としますインスタンス。

Option Explicit 
Private leaderboardForm As MyAwesomeForm ' whatever the UserForm class name is 

Public Sub ShowLeaderboard() 
    Set leaderboardForm = New MyAwesomeForm 
    ScheduleNextRefresh 
    leaderboardForm.Show 'vbModal? 
    'Set leaderBoardForm = Nothing '' only if the form was modal and not X'd-out 
End Sub 

Public Sub ScheduleNextRefresh() 
    If Not leaderboardForm Is Nothing Then 
     leaderboardForm.RefreshLeaderboard 
     Application.OnTime Now + TimeValue("00:00:10"), "ScheduleNextRefresh" 
    End If 
End Sub 

あなたは、おそらくそれは、[X]ボタンをクリックしたユーザーによって閉じられ、および/または破壊される処理するために、フォームのコードビハインドでQueryCloseイベントを処理することをお勧めします。

+0

私は先に進み、あなたの推奨事項を実装しましたが、今では私が持っているさまざまなラベルとリストボックスで自分のデータを取得しません。 Userformはまだポップアップしますが、私が持っているものはすべてデフォルトの0です。同じ値をメッセージボックスに割り当てようとすると、適切な数値が表示されます。情報がフォームに投稿されない理由を知っていますか? –

+0

あなたのリフレッシュと同じインスタンスで '.Show'を呼び出すことを確認してください。フォームにはデフォルトのインスタンスがあります。あなたが 'UserForm1.Show'を実行するときに、そのデフォルトのインスタンスを使用していて、そのインスタンスは必要ありません。 –

+0

私が呼び出している唯一の時間.ShowはleaderboardForm.Showで指定した場所です –

関連する問題