在每个循环上更新MS Access Marquee文本

时间:2016-06-20 08:43:19

标签: vba ms-access

我承认自己是一个新手,但我自己设计了一个非常方便的个人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

如果有任何帮助,我将不胜感激:)

1 个答案:

答案 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'将返回TblTasksDone列等于No的所有项目的计数。

在格式加载中我设置了计时器间隔,因为这只需要设置一次,我也确保选框在运行之前是空的。

计时器保留其记住的状态的本地副本。使用单词Static声明意味着变量的内容在执行之间不会以Dim声明的变量的方式丢失。

如果本地副本为空(即我们已全部使用它),则更新状态(GetStatus)并获取新副本。

我希望这有所帮助!