Mat*_*all 4 ms-access access-vba
我正在尝试使用VBA来格式化一些未绑定的文本框,我已将这些文本框添加到设置为连续视图的子窗体上的行中.
VBA查看与子窗体的基础RecordSource关联的绑定文本框,然后根据数据格式化我添加的未绑定文本框.
这是一些简化的代码:
Public Sub ApplyFormat()
If Forms!tblEnrolments!tblEnrolments_Jobs_sub!Start = 1 Then
Forms!tblEnrolments!tblEnrolments_Jobs_sub!txtStart.BackColor = RGB(65, 138, 179)
Forms!tblEnrolments!tblEnrolments_Jobs_sub!txtStart.ForeColor = RGB(255, 255, 255)
Forms!tblEnrolments!tblEnrolments_Jobs_sub!txtStart = "Start Forms"
ElseIf Forms!tblEnrolments!tblEnrolments_Jobs_sub!Start = 0 Then
Forms!tblEnrolments!tblEnrolments_Jobs_sub!txtStart.BackColor = RGB(216, 216, 216)
Forms!tblEnrolments!tblEnrolments_Jobs_sub!txtStart.ForeColor = RGB(166, 166, 166)
Forms!tblEnrolments!tblEnrolments_Jobs_sub!txtStart = "None"
End If
If Forms!tblEnrolments!tblEnrolments_Jobs_sub!End = 1 Then
Forms!tblEnrolments!tblEnrolments_Jobs_sub!txtEnd.BackColor = RGB(8, 164, 71)
Forms!tblEnrolments!tblEnrolments_Jobs_sub!txtEnd.ForeColor = RGB(255, 255, 255)
Forms!tblEnrolments!tblEnrolments_Jobs_sub!txtEnd = "End Forms"
ElseIf Forms!tblEnrolments!tblEnrolments_Jobs_sub!End = 0 Then
Forms!tblEnrolments!tblEnrolments_Jobs_sub!txtEnd.BackColor = RGB(216, 216, 216)
Forms!tblEnrolments!tblEnrolments_Jobs_sub!txtEnd.ForeColor = RGB(166, 166, 166)
Forms!tblEnrolments!tblEnrolments_Jobs_sub!txtEnd = "None"
End If
End Sub
Private Sub Form_Activate()
ApplyFormat
End Sub
Private Sub Form_Current()
ApplyFormat
End Sub
Run Code Online (Sandbox Code Playgroud)
所以我有一个名为ApplyFormat的公共子,它查看绑定文本框中的数据,然后应用格式(更改文本框背景颜色,字体颜色和文本数据).然后从Current事件调用(因此无论何时加载记录都会应用格式)和Activate事件(因为主窗体将在打开时打开其他窗体,并且当其他窗体关闭时可能再次获得焦点).
不幸的是,子表单中记录1下面的记录没有根据其记录中的数据进行格式化; 它们只是复制第一条记录中应用的格式.
例如:

这里EnrolID"1"在子表单中显示2个附加作业.第一条记录按照上面的代码格式化正确,即绑定的"开始"文本框为1,因此其旁边的未绑定文本框格式为蓝色,带有白色文本和字符串"Start Forms".
但是,在第二个记录中,"开始"文本框为0,应将其旁边的未绑定文本框格式化为灰色,字符串为"无".但正如你所看到的那样,只是复制第一条记录的格式.此外,绑定文本框"End"的值为1,这应该使其旁边的未绑定文本框为绿色,带有白色文本和字符串"End Forms".
是否有可能通过VBA实现我想要的效果?我不认为我可以使用条件格式,因为我希望未绑定的文本框显示数据,如"开始表单"和"结束表单",具体取决于它们的绑定文本框对应项.
您不能使用未绑定字段:连续表单中的Unbounds字段在所有行中始终具有相同的格式.这是一个不幸的限制.
幸运的是,还有另一种选择:你可以使用一个调用用户定义函数的绑定字段ControlSource.例如,在Form desginer中,创建一个文本框并将其"control source"属性设置为= Iif([Start] = 1, "Start Forms", "None")(包括=开头的符号).格式化必须通过条件格式化完成.
如果需要更复杂的逻辑来确定要显示的文本,可以将控制源设置为= myCustomFunction([any], [dbfields], [I], [need])并使VBA代码返回要显示的文本.