2017-04-03 974 views
1

我有一個單詞VBA UserForm,我用它作爲排行榜來跟蹤SQL查詢更新結果。每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分鐘調用一次子程序 –

回答

3

您不能使用Application.OnTime執行除宏之外的任何其他操作 - 由標準過程模塊公開的公共無參數方法。

UserForm_Initialize不是宏觀 - 這是一個事件處理程序,處理該事件Initialize一個UserForm對象..這是每個實例一次只會被調用的,當對象,那麼,初始化。你應該從來沒有,永遠需要顯式調用一個事件處理程序。如果你發現自己這樣做,警鐘應該熄滅,大的巨大紅旗應該飛,東西正在做非常錯誤

帶你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 

你可能會想在窗體的處理QueryClose事件代碼隱藏,來處理它被關閉和/或破壞通過點擊[X]按鈕的用戶。

+0

因此,我繼續前進並實施了您的建議,但現在我沒有在我擁有的各種標籤和列表框中獲取我的任何數據。用戶窗體仍然彈出,但我擁有的是默認值0。當我嘗試將相同的值分配給一個消息框時,它會顯示相應的數字。你有什麼想法爲什麼這些信息不會發布到表單上? –

+0

確保你在刷新的同一個實例上調用'.Show'。表單有一個默認實例,當你使用'UserForm1.Show'時你正在使用這個默認實例,而你不想這樣做。 –

+0

唯一一次我打電話.Show是你在leaderboardForm.Show –