我有一个Access连续表格。我想更改特定记录字段的前景色。
我从FieldModified字段中突出显示该字段。因此,例如FieldModified =“ Converted”。转换为我表单上的字段。
我想更改“已转换”字段的颜色,并对表单中的每个记录进行更改。
我以为这段代码可以用,但是我遇到了一个错误。[FieldModified] .ForeColor。我需要对表单中的每个记录执行此操作。
代码:
Private Sub Form_Load()
Dim fldName As String
fldName = Me.FieldModified.value
If (Not IsNull(fldName)) Then
Me.[fldName].ForeColor = vbRed '<--doesn't recognize fldName value
End If
End Sub
更新了代码,但它给我一个错误438,提示对象不支持此属性或方法。但是该表单确实突出显示了表单中的字段,但是突出显示了一个字段“ fldName”
Private Sub Form_Load()
Dim rstForm As String
Dim fldName As String
Set rstForm = Me.ChangedData.Form.Recordset
Do While Not rstForm.EOF
fldName = Me.FieldModified.value
If (Not IsNull(fldName)) Then
Me.Controls(fldName).ForeColor = vbRed '<--doesn't recognize fldName value
End If
rstForm.MoveNext
Loop
End Sub
答案 0 :(得分:3)
您设置控件的默认格式。连续形式的控件的每个副本都使用此格式。要根据条件(fldName = Me.FieldModified.value
)进行格式化,您需要按照安德烈(Andre)的说明进行常规格式化,或使用详细部分绘画事件(请参阅底部更新)
在条件格式向导中,可以使用Expression Is
和[Converted].Name = [FieldModified]
为条件(如果其名称与FiledModified
相匹配)的每个控件创建一个条件。在Ms Access表达式中,您无法使用Me
,只需将其忽略即可。
您可以使用VBA通过代码用FormatConditions格式化所有控件。如果要修改现有条件,请使用.Modify
代替.Add
Private Sub Form_Load()
Dim ctl As Access.Control
For Each ctl In Me.Controls ' loop through all controls of form
On Error Resume Next ' Not all controls can have conditional format (e.g. labels). To save the check of control type, we ignore errors here
ctl.FormatConditions.Add(acExpression, , ctl.Name & ".Name=[FieldModified]").BackColor = vbRed 'add o format condition to control if possible, else an error is raised but ignored
If Err.Number Then 'show errors
Debug.Print "Error: " & Err.Number & " - " & Err.description & " in Control: " & ctl.Name & " Type is " & TypeName(ctl)
Err.Clear 'reset error to catch next
Else
Debug.Print "FormatCondition added to Control: " & ctl.Name & " Type is " & TypeName(ctl)
End If
Next ctl
On Error GoTo 0 ' turn on errors again, maybe add an error handler (On Error Goto MyErrHandler)
End Sub
更新:
您可以使用表单的Details_Paint
事件来格式化每个记录不同的相同控件。这样可以为没有FormatConditions
属性(如标签,按钮)的控件启用条件格式。
Private Sub Detail_Paint()
Dim c As Access.Control
For Each c In Me.Detail.Controls
If c.Name = Me.FieldModified.Value Then
c.ForeColor = vbRed
Else
c.ForeColor = vbBlack
End If
Next
End Sub
答案 1 :(得分:1)
您不能像这样使用String
变量,fldName
是持有String
值的标识符。.不是 identifier -在{{ 1}},Me.ControlName
和Me
都是标识符。
但并非所有希望都消失了!您可以使用ControlName
从表单中提取String
对象!
所有表单控件都应存在于表单的Control
集合中,并以名称为键:
Controls