我承认自己是一个新手,但我自己设计了一个非常方便的个人MS Access数据库。我试图在网上找到以下解决方案,但到目前为止都没有成功,因此我的帖子(我第一次这样做了)。
我在MS Access中的表单上有一个选取框,用于滚动“未完成任务”的计数。 “任务COUNT查询”提供从零开始的数字。表单加载后,下面的代码以“有X个任务需要操作”的形式在选取框上滚动消息(从右到左)。 X是“任务COUNT查询”提供的数字。我希望选取框上的文本字符串在每个循环上更新,这样当我将任务标记为完成时,选取框上的下一个传递会将数字(X)显示为更新的计数。
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim Number As String
Set db = CurrentDb
Set rst = db.OpenRecordset("Tasks COUNT Query")
If Not (rst.EOF And rst.BOF) Then
Do While Not rst.EOF
Number = rst![Tasks]
strTxt = strTxt & "There are " & Number & " tasks requiring action."
rst.MoveNext
Loop
End If
rst.Close
strTxt = Left(strTxt, Len(strTxt)) 'remove the coma at the end
strTxt = Space(30) & strTxt 'start position
Set rst = Nothing
Set db = Nothing
Me.TimerInterval = 180
End Sub
以下代码在表单计时器间隔上运行:
Private Sub Form_Timer()
Dim x
On Error GoTo Form_Timer_Err
x = Left(strTxt, 1)
strTxt = Right(strTxt, Len(strTxt) - 1)
strTxt = strTxt & x
lblMarqTask.Caption = Left(strTxt, 180)
Exit Sub
Form_Timer_Exit:
Exit Sub
Form_Timer_Err:
Me.TimerInterval = 0
Exit Sub
End Sub
如果有任何帮助,我将不胜感激:)
答案 0 :(得分:1)
回答你的问题: -
我希望在每个循环上更新选框上的文本字符串
要执行此操作,您需要将收集字符串的代码放入其自己的过程中,然后选择一个时间来调用它。即。
将Form_Load()
代码移动到自己的程序
Private Sub GetString()
Dim db As DAO.Database
... [The remaining code] ...
Me.TimerInterval = 180
End Sub
更改Form_Load()
以调用新程序
Private Sub Form_Load()
GetString
End Sub
让计时器经常调用新程序来更新选框(也称为自动收报机)。
Private Sub Form_Timer()
Dim x
Static LngTimes As Long
On Error GoTo Form_Timer_Err
LngTimes = LngTimes + 1
If LngTimes = 100 Then
GetString
LngTimes = 0
End If
x = Left(StrTxt, 1)
StrTxt = Right(StrTxt, Len(StrTxt) - 1)
StrTxt = StrTxt & x
lblMarqTask.Caption = Left(StrTxt, 180)
Exit Sub
Form_Timer_Exit:
Exit Sub
这将在计时器运行时每100次更新一次。我已经测试了它并且它可以工作,尽管在滚动字幕中引起了抖动。
我想花点时间在您的代码中为您提供一些额外的支持,这些支持可能有助于了解VBA,并使您在未来的任何开发中更清楚/更轻松。
我提供的更改很少,可以在您当前的代码中为您提供所需的结果。然而,这确实意味着我带来了一些问题。我将使用以下内容执行相同的功能: -
Option Compare Database
Option Explicit
Private StrStatus As String
Private Sub GetStatus()
Dim Rs As DAO.Recordset
Set Rs = CurrentDb.OpenRecordset("SELECT count([Task]) FROM [TblTasks] WHERE [Done] = 'No'")
StrStatus = "There are " & Rs(0) & " tasks requiring action."
Rs.Close
Set Rs = Nothing
End Sub
Private Sub Form_Load()
Me.TimerInterval = 180
Me.lblMarqTask.Caption = ""
End Sub
Private Sub Form_Timer()
Static StrStatus_Lcl As String
If StrStatus_Lcl = "" Then
GetStatus
StrStatus_Lcl = StrStatus & Space(30)
If Me.lblMarqTask.Caption = "" Then Me.lblMarqTask.Caption = Space(Len(StrStatus_Lcl))
End If
Me.lblMarqTask.Caption = Right(Me.lblMarqTask.Caption, Len(Me.lblMarqTask.Caption) - 1) & Left(StrStatus_Lcl, 1)
StrStatus_Lcl = Right(StrStatus_Lcl, Len(StrStatus_Lcl) - 1)
End Sub
结果是字符串滚动将保持平滑,每次迭代时值都会更新。
谈谈我在这里所做的事情。
' Option Explicit'在模块/代码的顶部总是很好的做法,它会强制你声明你的变量,这可以让你在将来头疼。这可以通过启用“要求变量声明”来自动添加新的代码对象。在'工具' > '选项' VBA开发人员环境(也称为VBE)。
它不清楚查询正在做什么,但是为了保存循环我改变它以返回我可以使用的单个值。 SELECT count([Task]) FROM [TblTasks] WHERE [Done] = 'No'
将返回TblTasks
中Done
列等于No
的所有项目的计数。
在格式加载中我设置了计时器间隔,因为这只需要设置一次,我也确保选框在运行之前是空的。
计时器保留其记住的状态的本地副本。使用单词Static
声明意味着变量的内容在执行之间不会以Dim
声明的变量的方式丢失。
如果本地副本为空(即我们已全部使用它),则更新状态(GetStatus
)并获取新副本。
我希望这有所帮助!