Excel VBA通​​过activeX选项按钮循环

时间:2017-07-24 13:18:55

标签: excel vba excel-vba

关于我的目标的一点背景。我有一个风险评估的电子表格需要自动化,我使用选项按钮为我已经过滤的选定数量的单元格提供标准是无选项,目前我遇到了两个主要问题。

首先是一组单选按钮并通过代码引用它们。使用表单控件,我可以将它们放在一个组框中,并给它们所有相同的名称,即。 radYes和radNo但是使用activeX我不能使用组合框来实现这一点。这会导致选择一个选项按钮以删除另一个选项按钮的预设选择。我能够通过给它们所有单独的组名来绕过它,但现在我不能在不同的组中使用名称radYes / radNo,因为它只引用了第一个。

这是我的审核代码:

Sub RadioController()

Dim total As Integer
Dim pass As Integer
Dim fail As Integer
Dim rng As Range, cell As Range
Set rng = Range("C4:C8")

Dim o As Object

For Each cell In rng
    If Worksheets(2).radYes = True Then
        pass = pass + 1
        total = total + pass
    Else
        fail = fail + 1
    End If    
Next cell

Range("K4") = total


End Sub

其次,因为这意味着循环过滤的一组细胞。宏继续选择不可见的单元格并为不存在的选项按钮分配一个真值。我知道这是漫长的啰嗦,但我已经研究过所有关于修复的问题,Stack Overflow似乎是我最好的选择,以获得更多关于VBA的知识。

3 个答案:

答案 0 :(得分:1)

  • 单选按钮(选项按钮)表示您一次只能选择其中一个。如果您有独立的是/否选项,请改用CheckBoxes。不要打破标准的GUI Look& Feel。
  • 给几个同名的对象是个坏主意。你可以像这样遍历所有对象。

    With ActiveSheet 
        For Each objX In .OLEObjects 
            Debug.Print "Name = " & objX.Name & "  Typ = " & TypeName(objX.Object)
        Next  
    End With
    
  • 要仅处理可见单元格,请使用

    For Each cell In rng.SpecialCells(xlCellTypeVisible)
    

    备注:每个问题仅提出一个问题。 Stackoverflow不仅可以帮助您,还可以帮助您解决相同或类似问题。

答案 1 :(得分:0)

由于您希望显示“通过”或“失败”(2个选项),因此每个评估只需要一个按钮,该按钮为TRUE或FALSE。但是,您也可以使用2个按钮,其中只有一个是真的。如果您有许多组 - 无论每个组是由1个按钮还是2个组成 - 您必须将GroupName属性设置为每个属性的另一个值,以便它们彼此独立运行。 您可以使用LinkedCell属性将每个按钮链接到一个单元格,也就是隐藏在按钮后面的单元格。此单元格将保持值TRUE或FALSE,具体取决于所选的选项。您可以让另一个可见单元格引用链接的单元格。使用像= IF(A1, "Passed", "Failed")这样的公式。假设A1是链接的单元格,具有公式的单元格将不会显示“通过”或“失败”,具体取决于选项按钮的状态。 为了计数,您可以参考链接的单元格并计算有多少是TRUE。但您也可以直接参考选项按钮。以下代码将计算通过次数和失败次数。

Private Sub CountButtons()

    Dim Btn As Shape
    Dim Pass As Long, Fail As Long

        For Each Btn In Worksheets("Sheet2").Shapes
            With Btn
                If .Type = 12 Then
                    If Worksheets("Sheet2").OLEObjects(Btn.Name).Object Then
                        Pass = Pass + 1
                    Else
                        Fail = Fail + 1
                    End If
                End If
            End With
        Next Btn
End Sub

答案 2 :(得分:0)

这是@funthomas中示例的优化代码。它仅基于 Excel Training VBA 2 Lesson 21 - Creating Controls at Runtime, On the Fly

打印activeX选项按钮的名称。
With ActiveSheet 
    For Each objX In .OLEObjects
        If objX.progID = "Forms.OptionButton.1" then
            Debug.Print "Name = " & objX.Name & "  Typ = " & TypeName(objX.Object)
        End If 
    Next  
End With