在Access表单上查找值的条件格式

时间:2016-01-28 17:17:52

标签: forms ms-access

我在Access中创建了一个表单,该表单使用交叉表查询作为其数据源 查询的列标题是1,2,3,4和5,表示周数。 值显示 3/3 = 100.00% 0/13 = 0.00% 3/14 = 21.00%等项目。

我已将条件格式添加到表单上的文本框中 当百分比为100时,Expression Is Right([2],7)="100.00%"可以工作并以粗体显示红色 Expression is Val(Right([2],7))=100也有效 - 将文本值转换为数值。

我遇到的问题是我并不总是在寻找100% - 这取决于表格中的值。我试图做的是

  • Val(Right([2],7))=(SELECT ParamValue*100 FROM tbl_System WHERE Param='SampleSize') - 这不起作用。

也不是:

  • Eval(Val(Right([2],7))=(SELECT ParamValue*100 FROM tbl_System WHERE Param='SampleSize'))
  • Val(Right([2],7))=EVAL(SELECT ParamValue*100 FROM tbl_System WHERE Param='SampleSize')
  • Val(Right([2],7))=DLookUp("ParamValue","tbl_System","Param= 'SampleSize'")*100
  • Val(Right([2],7))=Eval(DLookUp("ParamValue","tbl_System","Param= 'SampleSize'")*100)

交叉表查询的SQL是:

TRANSFORM   NZ(Sum(Abs([Include])),0) & "/" & NZ(Count(*),0) & " = " & 
                FormatPercent(NZ(Round(Sum(Abs(Include))/Count(*),2),0),2)
SELECT      tbl_TMP_PrimaryDataSelection.TeamMember
FROM        tbl_TMP_PrimaryDataSelection
GROUP BY    tbl_TMP_PrimaryDataSelection.TeamMember
PIVOT       tbl_TMP_PrimaryDataSelection.WeekNum In (1,2,3,4,5)

1 个答案:

答案 0 :(得分:0)

我认为你不能在那里使用某个功能,无论是系统还是用户定义的功能。

您可以在运行时动态定义FormatCondition,如下所示:

Dim txtFld As TextBox
Dim objFrc As FormatCondition
Dim strExpr As String

Set txtFld = Me!myTextBox
' Remove existing FormatConditions
txtFld.FormatConditions.Delete
' The dynamic expression
strExpr = "Val(Right([2],7))=" & DLookUp("ParamValue","tbl_System","Param='SampleSize'")*100
' Assign a new FormatCondition to text box
Set objFrc = txtFld.FormatConditions.Add(acExpression, , strExpr)
' Set the format
objFrc.ForeColor = &HFF0000

此示例只是删除并重新创建所有FormatConditions。如果您有一定数量的条件,您也可以使用FormatCondition.Modify方法(请参阅在线帮助)。

修改 我使用的最终代码在Form_Load事件上执行,并为每周五个文本框添加一个格式:

Private Sub Form_Load()

    Dim aTxtBox(1 To 5) As TextBox
    Dim x As Long
    Dim oFrc As FormatCondition
    Dim sExpr As String

    With Me
        Set aTxtBox(1) = .Wk1
        Set aTxtBox(2) = .Wk2
        Set aTxtBox(3) = .Wk3
        Set aTxtBox(4) = .Wk4
        Set aTxtBox(5) = .Wk5

        For x = 1 To 5
            aTxtBox(x).FormatConditions.Delete
            sExpr = "Val(Right([" & x & "],7))>=" & DLookup("ParamValue", "tbl_System", "Param='SampleSize'") * 100
            Set oFrc = aTxtBox(x).FormatConditions.Add(acExpression, , sExpr)
            oFrc.ForeColor = RGB(255, 0, 0)
        Next x
    End With

End Sub

修改2

是的,在处理循环中的多个控件时,通过VBA定义FormatConditions特别有用。您也可以在设计视图中执行此操作并永久保存FormatConditions,只是为了避免逐个浏览FormatConditions对话框。或者,如果客户后来决定他更喜欢不同的颜色。 :)

注意:您可以在循环中使用Set aTxtBox(x) = Me("Wk" & x)。但实际上你不需要多个TextBox变量,你可以简单地重复使用它。