2015-06-02 51 views
2

我有一个按钮,用于清除(搜索)窗体上的所有活动控件。但是,每个搜索的输出都显示在一个子窗体中,并且似乎以文本框的形式实现。 (虽然它显示为电子表格,子窗体的设计视图中显示的文本框)。VBA遍历主窗体上的控件而忽略子窗体

正因为如此,当我设置的形式""所有acTextBox控制的Value,它会清除子窗体上的东西,以及并且所有进一步的搜索都会在所有字段中返回#Name,直到表单重新打开。

此外,虽然这个错误正在发生,点击窗体的Form对象上产生一个信息,警告Object invalid or no longer set.尝试编辑关联的方法往往造成的形式在设计视图中打开和取得焦点,其可以是或可以不是显著。 (这只要一个键被按下的方法,如果设计视图尚未打开时)。

这个问题似乎是在以下块:

Dim ctl As Control 
For Each ctl In Me.Controls 
     If (ctl.ControlType = acTextBox) Then 
      If Len(ctl.Properties("ControlSource")) = 0 Then 
       ctl.Value = "" '*** 
      End If 
     ElseIf ctl.ControlType = acCheckBox Then 
      ctl.Value = False 
     ElseIf ctl.ControlType = acComboBox Then 
      ctl.Value = "" 
     End If 
Next ctl 

分配之后'***是在那里我已经缩小了问题的范围,因为注释该行可以防止问题的发生 - 但是由于将文本框的值设置为“”是我尝试执行的重要部分,所以我不能摆脱那。

ControlSource长度比较试图从下面的行中排除子表单项,因为它们都是绑定的,而主表单项不是。它是嵌套的(与If(...和...)相对),因为VBA没有懒惰Or。

需要做什么来遍历所有主窗体控件而不影响子窗体控件?

编辑:澄清子窗体/查询。

子窗体是从查询绘图数据用下面的语句:

SELECT DW_Query.Map_Number, DW_Query.Map_Name, DW_Query.Map_Type, DW_Query.Town, DW_Query.Address, DW_Query.Street, DW_Query.Block, DW_Query.Lot, DW_Query.group, DW_Query.Folder, DW_Query.Latitude, DW_Query.Longitude FROM DW_Query;

看起来好像镇场可以被莫名其妙地删除,因为有时是RTE 2465的一个实例,can't find the field 'Town' referred to in your expression.然而这发生在主窗体的Form_Open子,以下行:

Me.DW_Query_subform.Form.RecordSource = "SELECT DW_Query.Map_Number, DW_Query.Map_Name, DW_Query.Map_Type, DW_Query.Town," & _ 
    "DW_Query.Address, DW_Query.Street, DW_Query.Block, DW_Query.Lot, DW_Query.group, DW_Query.Folder, DW_Query.Latitude, DW_Query.Longitude " & _ 
    "FROM DW_Query;" 'Set subform to use address query. (Faster) 
+0

记住子窗体是主窗体上的控制。但是,它不应该受到影响,因为您正在测试控制类型。你调试了代码吗? – PaulFrancis

+0

是否为子表单设置了任何子/主字段? – Newd

+0

我真的不完全确定你的意思是“调试代码”;我还不熟悉Access中的调试工具。我已经编译了没有错误,但没有设置断点或任何与立即窗口做任何事情(因为我不知道该怎么把它放在那里会有帮助)。 –

回答

1

您需要设置为NULL作为文本框可能不接受空字符串:

Dim ctl As Control 
For Each ctl In Me.Controls 
     If (ctl.ControlType = acTextBox) Then 
      If Len(ctl.Properties("ControlSource")) = 0 Then 
       ctl.Value = Null 
      End If 
     ElseIf ctl.ControlType = acCheckBox Then 
      ctl.Value = False 
     ElseIf ctl.ControlType = acComboBox Then 
      ctl.Value = Null 
     End If 
Next ctl 
+0

这是一个2007年的问题,还是有一些文件来支持?我觉得像在看我的数据库,我有近100个地方我有'ctr.Value =“”'零那个说'ctr.Value = Null' – Newd

+0

虽然这确实处理了'#Name'结果的问题, (somehow--我这里有NEWD同意,我从来没有听说过这个问题和其他类似任务做工精细的。),而是使子窗体,以显示它是从拉而不考虑输入从数据库的同一子集主要形式。 –

+0

这似乎工作,实际上。我根据别处的建议做了其他修改,这似乎已经使古斯塔夫的建议失效了;在回复它们并应用此方法后,原始问题已解决,但没有再造成任何问题,因此我将其标记为答案。 –

0

你可以缩小你的迭代例如明确只有控制在细节部分

Dim ctl As Control 
For Each ctl In Me.Detail.Controls 
     If (ctl.ControlType = acTextBox) Then 
      If Len(ctl.Properties("ControlSource")) = 0 Then 
       ctl.Value = vbnullString 
      End If 
     ElseIf ctl.ControlType = acCheckBox Then 
      ctl.Value = False 
     ElseIf ctl.ControlType = acComboBox Then 
      ctl.Value = Null 
     End If 
Next ctl 
+0

不幸的是,这似乎并不奏效。我已经将子表单移动到了“页脚”部分,并遍历了“Me.Detail.Controls”,但我仍然遇到了在我对古斯塔夫答案的第一条评论中描述的问题。 –

相关问题