【问题标题】:Check box general selector and macro to show next three rows when one checkbox is selected复选框常规选择器和宏以在选中一个复选框时显示接下来的三行
【发布时间】:2014-06-01 17:48:50
【问题描述】:

我是宏的新手,所以我不确定这在 VBA 中是否可行。

我正在尝试创建一个由许多由 4 行组成的迷你表组成的文档。 一行是标题,它有一个复选框,将始终显示,下面三行包含我只有在选择相关复选框时才能看到的数据。

这个文档会有很多小表格,因此会有很多复选框,我想知道是否有一个通用的复选框选择器,我可以在其中应用相同的宏。

我看过以下宏,但这仅适用于一个复选框,我想知道是否有一种方法可以为所有复选框应用一个,说如果选中第 4 行中的复选框,则显示第 5,6 行和7. 如果选中第 8 行的复选框,则显示第 9、10 和 11 行,依此类推......

Private Sub CheckBoxRow4_Click()
 Rows("5:6:7").Hidden = CheckBoxRow4.Value
End Sub

查看屏幕截图以获得更好的想法。

如果您能指出如何在打开文档时默认隐藏下面的三行,我们将不胜感激。

如果这有什么不同的话,我正在使用 Excel 2011 for Mac。

提前谢谢你。

【问题讨论】:

    标签: excel vba checkbox excel-2011


    【解决方案1】:

    我相信会有几种方法来解决这个问题。我的第一个想法是添加复选框,将它们全部链接到一个宏。激活后,您必须做几件事:

    1. 找出谁在调用子(哪个复选框);

    2. 找出特定复选框的位置(哪一行);

    3. 隐藏/取消隐藏它下面的行。


    1:

    复选框的名称很简单。 Application Caller 会给你。

    2:

    位置是这里的真正问题。我在这里看不到一个简单的解决方案,除了给复选框提供这样的特定名称之外,它在哪一行很清楚。如果添加一个复选框,您可以在“命名范围”输入字段中给出名称。如果你给它命名来指定它必须隐藏的行,那就更好了。所以像: HIDE_4_7 表示复选框必须隐藏/取消隐藏第 4 到 7 行。

    3:

    隐藏行现在很容易。


    整体解决方案:

    Sub HideRows()
    Dim cbName As String
    Dim cbValue As Boolean
    Dim s() As String
    Dim firstRow As Long
    Dim lastRow As Long
    
    On Error Resume Next
    cbName = Application.Caller
    If Err.Number <> 0 Then Exit Sub 'sub is not called from an application object
    cbValue = (ActiveSheet.CheckBoxes(cbName) = xlOn)
    If Err.Number <> 0 Then Exit Sub 'sub is not called from a checkbox
    On Error GoTo 0
    
    
    s = Split(cbName, "_")
    If s(LBound(s)) <> "HIDE" Then Exit Sub 'name of the shape is not valid
    firstRow = Val(s(LBound(s) + 1))
    lastRow = Val(s(LBound(s) + 2))
    
    Sheets(1).Rows(firstRow & ":" & lastRow).Hidden = Not cbValue
    
    End Sub
    

    您必须调用复选框HIDE_*firstrow*_*lastrow*,并将它们链接到此子。这对我有用。


    编辑

    要在打开时隐藏所有行,您可以使用 Workbook_Open 子(在工作簿代码存储中)。像这样的:

    Private Sub Workbook_Open()
    Dim shp As Shape
    Dim s() As String
    Dim firstRow As Long
    Dim lastRow As Long
    
    Dim cbValue As Boolean
    For Each shp In Sheets(1).Shapes
        Debug.Print shp.Name
        s = Split(shp.Name, "_")
        If s(LBound(s)) <> "HIDE" Then GoTo nextShp
        'set checkbox off:
        Sheets(1).CheckBoxes(shp.Name) = xlOff
        firstRow = Val(s(LBound(s) + 1))
        lastRow = Val(s(LBound(s) + 2))
    
        Sheets(1).Rows(firstRow & ":" & lastRow).Hidden = True
    
    
    nextShp:
    Next shp
    
    End Sub
    

    【讨论】:

    • 我在想一些更压缩的东西,但这可以给我一个开始。谢谢。
    猜你喜欢
    • 2015-05-08
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    相关资源
    最近更新 更多