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

时间:2015-02-06 16:22:02

标签: vba ms-access access-vba controls

我创建了一个日期选择器,允许您选择多个日期,并切换它们,以便在那些日子里没有人可以预订任何东西。

为了做到这一点,我有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时,似乎没有帮助。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

据我所知,不可能以编程方式编辑控件的名称。为此,必须在VBA编辑器中。 在代码中只能编辑标题。