2017-04-03 160 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 –