2017-06-07 96 views
0

当用户从下拉菜单中选择特定值时,我试图隐藏/取消隐藏我窗体上的30个对象。我尝试了下面的循环,但是我收到以下错误:'对象不支持此属性或方法。'我有这个代码在下拉菜单对象的'AfterUpdate'上运行。访问For循环隐藏对象

Dim VisibleVisitFields() As String 
Dim VisibleVisitFieldlist As String 
Dim varVisibleVisit As Variant 
VisibleVisitFieldlist = "VisitDate_Event,VisitTime_Event,VisitSite_Event,VisitStaff_Event,VisitMeet_Event" 
VisibleVisitFields = Split(VisibleVisitFieldlist, ",") 

If (EventType = 3) Then 
    For Each varVisibleVisit In VisibleVisitFields 
    [Forms]![subFRM_TBL_Event-All in One].Controls(varVisibleVisit).visible = True 
    Exit For 
Next 
Else 
If (EventType <> 3) Then 
    For Each varVisibleVisit In VisibleVisitFields 
    [Forms]![subFRM_TBL_Event-All in One].Controls(varVisibleVisit).visible = False 
    Exit For 
Next 
End If 
End If 

回答

1

哪条线触发错误?怀疑它是对有缺陷的子表单的引用。从来没有见过类似的代码循环访问数组。建议与容纳的对象不同的命名子容器容器,如ctrEvent。什么是EventType - 表单上的文本框/字段?考虑代码:

Dim aryFields As Variant 
Dim x As Integer 
aryFields = Split("VisitDate_Event,VisitTime_Event,VisitSite_Event,VisitStaff_Event,VisitMeet_Event", ",") 
For x = 0 To UBound(aryFields) 
    Me.ctrEvent.Form.Controls(aryFields(x)).Visible = Me.EventType = 3 
Next 

替代方法不使用数组:

设置控制标记属性然后代码遍历窗体上的所有控件,并为那些在标签具有特殊价值的知名度。

Dim ctrl As Control 
For Each ctrl in Me.ctrEvent.Form.Controls 
    If ctrl.Tag = "something" Then ctrl.Visibility = Me.EventType = 3 
Next 

另一个是给控件相似的名称,如:Visit1,Visit2等,然后代码:

Dim x As Integer 
For x = 1 to 30 
    Me.ctrEvent.Form.Controls("Visit" & x).Visible = Me.EventType = 3 
Next 

奉劝命名约定没有空格或标点符号/特殊字符(下划线唯一的例外)。

+0

是啊,它的参考。在我有Me.Controls(varVisibleList).visible之前。但同样的错误发生。 EventType是窗体中的下拉菜单。我会试一试你的代码。谢谢 – xpandamonium

+0

你想为30个控件设置可视性?请参阅编辑以回答。 – June7

0

您正在尝试遍历字符串数组。

Dim VisibleVisitFields() As String 

您需要声明数组包含变种(其中也可能包含字符串)

Dim VisibleVisitFields() As Variant