2015-02-06 5 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 

Но я не могу заставить его работать. Играя с byref и byval, похоже, не помогает.

+0

Что такое '' 'Me''' в этом случае? – dee

ответ

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, его решение более эффективно; это тот ответ, который вы искали. –

+1

P.s. ясно, не забывайте управлять дополнительной проверкой в ​​случае, когда ваша форма содержит другие ToggleButtons, которые не должны входить в цикл. –

2

Вы должны хранить свои объекты в глобальную коллекцию в инициализации время, например:

Глобальная коллекция декларации

Dim allToggles As Collection 

Initialize - хранение объектов в коллекции

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

1

В цикле, вы можете получить имена элементов управления, как "Toggle" & I. Таким образом, вы можете настроить соответствующий объект , указав этот элемент по имени в коллекции Controls формы.

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