2016-07-28 2 views
1

Надеюсь, у вас есть элегантное решение для того, что, вероятно, является простой проблемой!Цикл нумерации OptionButton

Я использую кнопки опций ActiveX, но в рабочем листе, а не в форме пользователя или в группе из-за того, как был разработан лист. Код содержится как вспомогательный элемент в форме кода кнопки опции.

Этот код довольно понятно, что я пытаюсь сделать:

Public Sub SectionD_Click() 

If OptionButton1.Value = True Then 
    ThisWorkbook.Sheets("Boolean").Range("B2").Value = 1 
ElseIf OptionButton2.Value = True Then 
    ThisWorkbook.Sheets("Boolean").Range("B2").Value = 0 
End If 

If OptionButton3.Value = True Then 
    ThisWorkbook.Sheets("Boolean").Range("B3").Value = 1 
ElseIf OptionButton4.Value = True Then 
    ThisWorkbook.Sheets("Boolean").Range("B3").Value = 0 
End If 

If OptionButton5.Value = True Then 
    ThisWorkbook.Sheets("Boolean").Range("B4").Value = 1 
ElseIf OptionButton6.Value = True Then 
    ThisWorkbook.Sheets("Boolean").Range("B4").Value = 0 
End If 

End Sub 

Я хотел бы сделать это таким образом, что число после «OptionButton» изменяет значения с помощью простого «я = я + 2 ', но кажется, что некоторые ограничения переменной VBA/выражение/объект не позволят мне (извините, что я здесь noob, не знаю, какая должна быть правильная терминология).

Было бы очень полезно, если бы кто-нибудь мог указать мне в правильном направлении здесь! Мне нужно просмотреть пару пар опций кнопок примерно так же, и мне очень хотелось бы, чтобы код состоял всего из 5 простых строк, а не из ста над линиями, делающих то же самое!

ответ

1

Я могу назвать эту мелодию с одной строки кода !!

Public Sub SectionD_Click(): Dim i As Integer: Dim rw As Long: rw = 2: With Worksheets("Sheet1"): For i = 1 To 10 Step 2:  If .OLEObjects("OptionButton" & i).Object.Value Then:   Worksheets("Boolean").Cells(rw, "B").Value = 0:  ElseIf .OLEObjects("OptionButton" & i).Object.Value Then:   Worksheets("Boolean").Cells(rw, "B").Value = 0:  End If:  rw = rw + 1: Next: End With:End Sub: 

Но я думаю, что 16 строк красивее.

Public Sub SectionD_Click() 
    Dim i As Integer 
    Dim rw As Long 
    rw = 2 

    With Worksheets("Sheet1") 
     For i = 1 To 10 Step 2 
      If .OLEObjects("OptionButton" & i).Object.Value Then 
       Worksheets("Boolean").Cells(rw, "B").Value = 0 
      ElseIf .OLEObjects("OptionButton" & i).Object.Value Then 
       Worksheets("Boolean").Cells(rw, "B").Value = 0 
      End If 
      rw = rw + 1 
     Next 
    End With 
End Sub 
+0

Это все! Даже не нужно было настраивать его слишком много, поистине элегантное решение, которое я искал. Пробовал OLEObjects ранее, но он не работал для меня, спасибо, что показал мне, как это должно быть сделано;) –

+0

Фактический элемент управления ActiveX завернут в OleObject. Вот почему вы используете OleObject.Object для ссылки на него. –

1

5 линий? В самом деле? :) Это лучшее, что я могу сделать:

Option Explicit 

Public Sub SectionD_Click() 

    With ThisWorkbook.Sheets("Boolean") 
     Call CheckValue(.OptionButton1, .OptionButton2, .Range("B2")) 
     Call CheckValue(.OptionButton3, .OptionButton4, .Range("B3")) 
    End With 
End Sub 

Sub CheckValue(btn1 As Object, btn2 As Object, my_cell As Range) 

    If btn1.Value Then 
     my_cell.Value = 1 
    ElseIf btn2.Value Then 
     my_cell = 0 
    End If 

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