【问题标题】:Highlight field background in continuous form以连续形式突出显示字段背景
【发布时间】:2019-07-16 00:30:05
【问题描述】:

我有一个 Access 连续表格。我想更改特定记录字段的前景色。

我有要从 FieldModified 字段中突出显示的字段。因此,例如 FieldModified = "Converted"。转换为我的表单上的一个字段。

我想更改“已转换”字段的颜色,并为表单中的每条记录执行此操作。

我认为这段代码可以工作,但在 Me.[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

【问题讨论】:

  • 在您的代码中,fldName 被定义为一个字符串,它没有.ForeColor 属性。也许你只需要将Me.[fldName].ForeColor = vbRed 更改为Me.Control(fldName).ForeColor = vbRed
  • 谢谢。我将如何对连续形式的每条记录执行此操作?
  • 你不能 SetStringrstForm 应该声明为 As Recordset
  • 我将 Dim 语句更改为 Dim rstForm As Recordset 但我仍然找不到方法或数据成员
  • 实现这一点的唯一方法是使用 条件格式,参见例如stackoverflow.com/questions/39294487/…stackoverflow.com/questions/13937493/…

标签: vba ms-access


【解决方案1】:

您为控件设置了默认格式。连续形式的每个控件副本都使用这种格式。要按条件 (fldName = Me.FieldModified.value) 进行格式化,您需要像 Andre 告诉您的那样 条件格式化 或使用 detail-sections 绘制事件(请参阅底部的更新)

在条件格式向导中,您可以使用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_Paintevent 来格式化每个记录不同的相同控件。这将为没有FormatConditionsproperty 的控件启用条件格式,例如标签、按钮。

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

【讨论】:

  • 我尝试使用您的两个代码,但它对我不起作用。我认为这是因为我正在尝试比较字段名称
  • @MaxineHammett 对不起,我忘了更改Field1toFieldModified。代码已更新。
【解决方案2】:

您不能像这样使用String 变量,fldName 是一个标识符,它包含一个String 值.. 不是一个标识符 - 在Me.ControlName 中,两者都是MeControlName标识符

但并不是所有的希望都落空了!您可以使用String 从表单中提取Control 对象!

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

Me.Controls(fldName).ForeColor = vbRed

【讨论】:

  • 你太棒了!但是对于连续形式的每条记录,我该怎么做呢?
  • 哦,我不知道 - 我从不使用 Access,所以 Access 表单对我来说有点陌生。问题中没有代码给我任何暗示任何给定控件的实例不止一个实例的概念,所以...我会尝试找到 Access 专家。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-21
  • 2017-02-04
  • 2014-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多