【问题标题】:OptionButton numbering loopOptionButton 编号循环
【发布时间】:2016-07-28 23:22:34
【问题描述】:

希望您对可能很简单的问题有一个优雅的解决方案!

由于工作表的设计方式,我使用的是 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”后面的数字使用简单的“i = i + 2”类型语句更改值,但似乎一些 VBA 变量/表达式/对象限制不会让我(对不起,我我是个菜鸟,不知道正确的术语应该是什么)。

如果有人能在这里指出我正确的方向,我将不胜感激!我必须浏览 25 个左右的选项按钮对,我非常希望代码只有 5 行简单的代码,而不是 100 行以上的代码来做同样的事情!

【问题讨论】:

    标签: vba excel radio-button activex


    【解决方案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
    

    【讨论】:

    • 就是这样!甚至不需要对其进行太多调整,这确实是我正在寻找的优雅解决方案。之前尝试过 OLEObjects,但它对我没有用,感谢您向我展示了它应该如何完成 ;)
    • 实际的 ActiveX 控件包装在 OleObject 中。这就是你使用 OleObject.Object 来引用它的原因。
    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-03
      • 2018-01-16
      • 2017-06-19
      • 1970-01-01
      相关资源
      最近更新 更多