VBA编程:如何以编程方式更改对象名称

3
我已经创建了一个日期选择器,允许您选择多个日期,并切换它们,以便在这些日期上没有人可以预订任何东西。
为了实现这一点,我有31个切换按钮和一个月份选择器。当您选择月份时,每个31个按钮都必须更新,并从获取值(切换开或关)。
目前,我在月份选择器的更新事件中编写了一个冗长的代码列表来完成此操作。
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 也没有帮助。


在这种情况下,“Me”是什么? - Daniel Dušek
4个回答

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

2
您可以使用表单的Controls集合并在循环中检查每个控件的类型。您要寻找的是acToggleButton
Dim cntrl As Control
For Each cntrl In Me.Controls
    If cntrl.ControlType = acToggleButton Then

        Update_toggle cntrl

    End If
Next

1
我个人认为让RubberDuck来接手吧,他的解决方案更加高效;这就是你一直在寻找的答案。 - Matteo NNZ
1
请注意,在您的表单中包含其他不应进入循环的ToggleButtons的情况下,务必进行额外的检查。 - Matteo NNZ

1
在循环中,您可以将控件名称推导为"Toggle" & I。因此,您可以通过在表单的Controls集合中按名称引用该项来定位相应的控件对象
'for 1 = 1 to 32
For I = 1 to 31
    Call Update_toggle(Me.Controls("Toggle" & I))
Next I

0
据我所知,不可能通过编程的方式编辑控件名称。要实现这一点,必须在VBA编辑器内部操作。只能通过代码编辑标题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接