VBA 用户窗体刷新
VBA UserForm refresh
我有一个单词 VBA UserForm,我将其用作排行榜来跟踪 SQL 查询的更新结果。有没有办法在每 10 分钟启动一次后自动刷新表单?我试过这个:
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
但这似乎没有任何作用。感谢您的帮助!
您不能使用 Application.OnTime
执行除宏之外的任何东西 - public,由标准过程模块公开的无参数方法。
UserForm_Initialize
不是 宏 - 它是一个事件处理程序,处理 UserForm
对象的 Initialize
事件。每个实例只调用一次,当对象 初始化 时。您应该永远不会,永远不需要显式调用事件处理程序。如果你发现自己这样做了,警钟应该响起,巨大的红旗应该飘扬,有些事情正在做的非常错误。
获取 UserForm_Initialize
中的所有内容并将其移至 public 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
事件,以处理它被关闭 and/or 被用户单击 [X] 按钮销毁的事件。
我有一个单词 VBA UserForm,我将其用作排行榜来跟踪 SQL 查询的更新结果。有没有办法在每 10 分钟启动一次后自动刷新表单?我试过这个:
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
但这似乎没有任何作用。感谢您的帮助!
您不能使用 Application.OnTime
执行除宏之外的任何东西 - public,由标准过程模块公开的无参数方法。
UserForm_Initialize
不是 宏 - 它是一个事件处理程序,处理 UserForm
对象的 Initialize
事件。每个实例只调用一次,当对象 初始化 时。您应该永远不会,永远不需要显式调用事件处理程序。如果你发现自己这样做了,警钟应该响起,巨大的红旗应该飘扬,有些事情正在做的非常错误。
获取 UserForm_Initialize
中的所有内容并将其移至 public 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
事件,以处理它被关闭 and/or 被用户单击 [X] 按钮销毁的事件。