访问2010 VBA ControlSource循环

时间:2011-04-01 01:57:50

标签: ms-access

我在表单上有多个字段,这些字段没有与之关联的值,直到将数据输入到该字段中。此时,这些控件具有 #Name?值。我要做的就是使用循环隐藏字段而不是编写If语句。下面是使用单个If语句隐藏所述字段/字段的代码。

If Not Me.txtField.ControlSource = "#Name?" Then
   Me.txtField.ColumnHidden = True
End If

我似乎无法弄清楚如何隐藏具有#Name的多个控件?旗。任何帮助将不胜感激。

Dim ctl As Control
Dim ctlError As String

ctlError = "#Name?"

 For Each ctl In Me.Controls
     If Not ctl.ItemsSelected(txtField) = ctlError Then
          ctl.ColumnHidden = True
     End If
 Next ctl

编辑: 在主窗体上有一个带有交叉表查询的子表单。但问题是查询的结果是从组合框填充的。所以我在查询中添加了尚未提供的字段到子表单,最后是#Name?附件是一个截图,以更好地说明问题。

我有90%的机会错误地处理这个过程,所以这是一个学习过程。

ScreenShot

4 个答案:

答案 0 :(得分:1)

如果您描述了代码引发的特定错误,那么解决此问题会更容易。这个答案假设有问题的控件是TextBox。

“#名称?”表示控件的ControlSource引用的表单不​​在表单的RecordSource中。例如,如果您的查询有两个字段(例如ID和BirthDate),并且您的表单有三个控件,ControlSource为“ID”,“BirthDate”和“BirthCountry”,那么RecordSource为“BirthCountry”的控件将显示“#Name?”。但是,它的值不是“#Name?”。相反,调用Value属性会引发错误2424(带有相当无用的消息“您输入的表达式具有Microsoft Office Access无法找到的字段,控件或属性名称”)。

我知道检查字符串“#Name?”的唯一方法。是通过控件的Text属性,仅当控件具有焦点时才可用,因此没有多大帮助。如果检索ControlSource属性的值,您将获得“BirthCountry”(当然)。因此,您可以根据表单的RecordsetClone字段检查表单上的所有ControlSources(请添加错误处理):

For Each ctl In Controls
    If Not RecordSourceContains(ctl.ControlSource) Then
        ctl.Visible = False
    End If
Next

Function RecordSourceContains(strFieldName as String) As Boolean
    Dim fld As Field
    For Each fld In RecordsetClone.Fields
        If fld.Name = strFieldName Then
            RecordSourceContains = True
            Exit For
        End If
    Next
End Function

你可能想做一些其他的簿记。例如,您需要检查表达式控件源(以“=”开头),因为它们不在RecordSource中。您还需要处理错误438(对象不支持此属性或方法)或检查每个控件的类型以确保它具有ControlSource属性。

答案 1 :(得分:0)

在表单的设计视图中,该字段对Control Source说了什么?它应该是空白的,这意味着表单是未绑定的。如果不是,则说明#Name。

更多信息:http://www.databasedev.co.uk/unbound-forms-add-data.html

答案 2 :(得分:0)

以下是我用来处理的代码:

Sub setControl
    ''  You can use this in your loop
    Call FieldEnable(subFrm, "boxQty", booSellSet)
End Sub

''----------------

Private Sub FieldEnable(subFrm As Access.Form, strCtlName As String, _
                                booEnableMe As Boolean)
On Error GoTo errHandler
    subFrm(strCtlName).Enabled = booEnableMe
    subFrm(strCtlName).Visible = booEnableMe

errExit:
    Exit Sub
errHandler:
    If Err.Number = 2164 Or Err.Number = 2165 Then ''control has the focus
        Resume Next
    Else
        DoCmd.Hourglass False
        Screen.Application.Echo True
        MsgBox "Problem with control named " & strCtlName
        Resume errExit

    End If

End Sub

我必须调整表单上的许多字段,因此这是非常可重用的。我可能会把它们“打开”或“关闭”;这照顾到了。如果您有疑问,请告诉我。

这一切归结为隐藏字段的方法:

    Control.Enabled = False
    Control.Visible = False

答案 3 :(得分:0)

从表格中删除字段黑色。 然后再次制作你桌子上的黑色字段。