2013-08-01 2 views
3

У меня есть пользовательская форма в Excel VBA с флажком для каждого месяца.Loop Through CheckBox Элементы управления в VBA UserForm

Выбрав один или несколько аргументов, необходимо указать месяц, который будет отображаться на листе. Я копировал код 12 раз, и он работает, но я уверен, что есть лучший способ сделать это с помощью цикла For.

Это часть моего кода (он идет в 12 раз):

If CheckBox1.Value = True Then 
     ActiveSheet.PivotTables("PivotTable1").PivotFields("month").PivotItems("1").Visible = True 
    Else 
     ActiveSheet.PivotTables("PivotTable1").PivotFields("month").PivotItems("1").Visible = False 
    End If 

    If CheckBox2.Value = True Then 
     ActiveSheet.PivotTables("PivotTable1").PivotFields("month").PivotItems("2").Visible = True 
    Else 
     ActiveSheet.PivotTables("PivotTable1").PivotFields("month").PivotItems("2").Visible = False 
    End If 

Я попытался записывания:

for i in range 1 to 12 

, а затем писать свой код, но там, кажется, быть проблемой, когда Вместо чисел я помещал «i».

ответ

2

Предполагая, что вы Арен 't используя флажки Tristate, то .Value может быть только True или False, поэтому мы должны уйти от чего-то вроде этого:

(Предполагается, что ваш код выполняется в Пользовательской форме, так что Controls непосредственно доступна)

Dim mthIdx as Long 
Dim nm as String 
Dim c As Control 

With ActiveSheet.PivotTables("PivotTable1").PivotFields("month") 
    For mthIdx = 1 To 12 
     nm = "CheckBox" & mthIdx 
     Set c = Controls(nm) 
     .PivotItems(mthIdx).Visible = c.Value 
    Next 
End With 

(Оговорка With не является строго необходимым, но это, как правило, хорошая идея, чтобы разрешить вложенные ссылки COM как можно реже)

1

Попробуйте это ..

Dim i As Integer 
Dim sN As String 
Dim chx As MSForms.CheckBox 
Dim obj As OLEObject 

For i = 1 to 12 
    sN = format(i) 
    Set obj = OLEObjects("CheckBox" & sN) 
    Set chx = obj.Object 

    If chx.Value = True Then 
     ActiveSheet.PivotTables("PivotTable" & sN).PivotFields("month").PivotItems(sN).Visible = True 
    Else 
     ActiveSheet.PivotTables("PivotTable" & sN).PivotFields("month").PivotItems(sN).Visible = False 
    End If 
Next 
+0

Там кажется, является проблемой с этой строкой ".OLEObjects" it raises en error "метод или элемент данных не найден" – user1040563

+0

@ user1040563 .. он изменен .. – matzone

+0

'OLEObjects' относится к элементам управления на листе, я думаю. В «UserForm» (по крайней мере, до Excel 2003) мы, вероятно, хотим «Controls» ... –

0

Я не проверил код, но это должно поставить вас по Чет правильный путь, если это не пятно на хотя ...

For i = 1 to 12 
    If CheckBox(i).Value = True Then 
     ActiveSheet.PivotTables("PivotTable1").PivotFields("month").PivotItems(i).Visible = True 
    Else 
     ActiveSheet.PivotTables("PivotTable1").PivotFields("month").PivotItems(i).Visible = False 
    End If 
Next i 
+0

AFAIK, VBA не поддерживает массивы элементов управления в формах, поэтому вы просто не можете создавать 'CheckBox (...)' , не получают доступа к ним таким образом впоследствии. –

+0

Я попытался сделать это, но он не работает как python ... – user1040563

Смежные вопросы