以连续形式突出显示字段背景

时间:2019-07-10 14:06:58

标签: vba ms-access

我有一个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

2 个答案:

答案 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.ControlNameMe都是标识符

但并非所有希望都消失了!您可以使用ControlName从表单中提取String对象!

所有表单控件都应存在于表单的Control集合中,并以名称为键:

Controls