2009-12-01 184 views
0

每次打开表单时都会调用以下代码。它在第五次开场之前效果很好,然后错过了删除其中一个控件。任何人都知道这是为什么?VBA代码停止工作

For Each cb In Forms(frmName).Controls 
    If cb.ControlType = acCheckBox Then 
     If Left(cb.Name, 3) = "clr" Then 
      DeleteControl frmName, cb.Name 
     End If 
    ElseIf cb.ControlType = acLabel Then 
     If Left(cb.Name, 3) = "clr" Then 
      DeleteControl frmName, cb.Name 
     End If 
    End If 
Next 
+0

您的总体目标是什么?以编程方式在设计视图中操作控件是很不寻常的。 – 2009-12-08 20:09:07

回答

2

当您从Access中的某个集合中删除某个项目时,下一个项目将移动到该项目中。 因此,当涉及从集合中删除项目时,您必须从集合的末尾开始并后退。

所以更换

For counter = Forms(frmName).Controls.Count - 1 To 0 Step -1 
set cb = Forms(frmName).Controls.Item(counter) 

我的下一个问题,虽然是你有什么总体目标

For Each cb In Forms(frmName).Controls 

线?以编程方式在设计视图中操作控件是很不寻常的。

+0

这是VBA中的集合的常见问题,集合在删除名称或从1删除顺序时丢失了顺序,Tony Toews建议的方法是通常的解决方案。 – Fionnuala 2009-12-07 22:24:43

+0

罗伯特哈维,你的解决方案的工作原理,但你不明白Access中的集合的性质,以及它们在删除项目时如何工作。所以是的,我很讨厌。 – 2009-12-07 22:27:51

+0

在VB和VB.Net中也常见到使用步骤1 – Fionnuala 2009-12-07 22:33:41