2015-02-06 44 views
3

我创建了一个日期选择器,它允许您选择多个日期并切换它们,因此没有人可以在那些日子里预定任何东西。VBA以编程方式更改对象名称

为了做到这一点,我有31个切换按钮和一个月份选择器。当您选择月份时,31个按钮中的每一个都必须更新,并从DLookup获取值(在或上切换)。

目前,我已经得到了这个代码在月选择的

Private Sub cmbMonth_AfterUpdate() 

    If IsNull(Me.cmbMonth) Then 
     GoTo Subexit 
    Else 
     Imonth = CInt(Me.cmbMonth) 
    End If 

    Call Update_toggle(Me.Toggle1) 
    Call Update_toggle(Me.Toggle2) 
    Call Update_toggle(Me.Toggle3) 
    Call Update_toggle(Me.Toggle4) 

等更新事件一个长长的清单 - 高达31切换

是否有办法做这个循环?

我试图沿着线的东西:

Dim toggle as Togglebutton 
Dim I as integer 
Dim strTogglename as String 
set toggle = new togglebutton 

I = 1 

for 1 = 1 to 32 

    strtogglename = "Me.Toggle" & I 

    set toggle.name = strtogglename 

    Call Update_toggle(Toggle) 

next I 

但我无法得到它的工作。玩byrefbyval似乎没有帮助。

+0

这种情况下'''Me''是什么? – dee 2015-02-06 16:36:32

回答

2

您可以使用窗体的Controls收集和检查每个控制你循环的类型。您正在寻找acToggleButton s。

Dim cntrl As Control 
For Each cntrl In Me.Controls 
    If cntrl.ControlType = acToggleButton Then 

     Update_toggle cntrl 

    End If 
Next 
+1

我个人离开舞台到RubberDuck,他的解决方案更有效率;这是你正在寻找的答案。 – 2015-02-06 17:21:53

+1

P.s.显然,在表单中包含其他不应该进入循环的切换按钮的情况下,请不要忘记管理附加检查。 – 2015-02-06 17:26:20

2

您需要存储一个全球性的内部集合你的对象在初始化的时间,例如:

全球征集申报

Dim allToggles As Collection 

初始化 - 存储在集合对象

Set allToggles = New Collection 
With allToggles 
    .Add Me.Toggle1 
    .Add Me.Toggle2 
    '... 
    .Add Me.Toggle31 
End With 

调用回路

for I = 1 to 32 

    Update_toggle allToggles(I) 

next I 
+0

不错的答案,但它可以做得更简单。 – RubberDuck 2015-02-06 17:19:51

1

在循环中,您可以将控件的名称派生为"Toggle" & I。因此,您可以通过在表单的Controls集合中通过名称引用该项目来针对相应的控件对象

'for 1 = 1 to 32 
For I = 1 to 31 
    Call Update_toggle(Me.Controls("Toggle" & I)) 
Next I 
相关问题