Excel 2016 VBA-以更高的效率创建仪表板

时间:2018-07-03 11:58:19

标签: excel excel-vba vba

我目前正在使用VBA和宏在excel 2016中构建仪表板。它基本上涉及选择单个工作表上的按钮以显示/隐藏其数据源将链接到另一工作表的不同图表元素。到目前为止进展顺利,但是我遇到了效率问题。第一个问题与对象的分组有关,第二个问题与vba代码的重复有关。

1)有什么方法可以交叉组合形状对象?现在看来,我必须为不可见的对象创建重复项,并且每个父对象组都将被隐藏。不幸的是,我找不到Excel进行交叉分组的方法。因此,如果我要一个A和B组以及一个A和C组,显然我只能有一个组(A&B或A&C,但不能两个都包含)。这迫使我复制对象,因此我有一对用于A&B,另一对用于A&C。问题在于,当我获得几个仪表板按钮和子部分时,这可能会变得很乏味,而且会成为正确组织对象的噩梦。

2)谁能建议我如何提高以下代码的效率,从而避免重复代码?它基本上突出显示了一组形状,这些形状必须针对按下的按钮进行显示和隐藏。但是现在,我必须编写所有必须保持可见和隐藏状态的组。下面是代码示例。请查看下面的True和False参数以了解问题所在:

   Sub Pic_1_SA_click()
   ActiveSheet.Shapes("Group 23").Visible = True
   ActiveSheet.Shapes("Group 71").Visible = False
   ActiveSheet.Shapes("Group 19").Visible = False
   ActiveSheet.Shapes("Group 20").Visible = False
   End Sub

   Sub Pic_1_SB_click()
   ActiveSheet.Shapes("Group 23").Visible = False
   ActiveSheet.Shapes("Group 71").Visible = True
   ActiveSheet.Shapes("Group 19").Visible = False
   ActiveSheet.Shapes("Group 20").Visible = False
   End Sub

   Sub Pic_2_SA_click()
   ActiveSheet.Shapes("Group 23").Visible = False
   ActiveSheet.Shapes("Group 71").Visible = False
   ActiveSheet.Shapes("Group 19").Visible = True
   ActiveSheet.Shapes("Group 20").Visible = False
   End Sub

   Sub Pic_2_SB_click()
   ActiveSheet.Shapes("Group 23").Visible = False
   ActiveSheet.Shapes("Group 71").Visible = False
   ActiveSheet.Shapes("Group 19").Visible = False
   ActiveSheet.Shapes("Group 20").Visible = True
   End Sub

在这两个问题上的任何指导将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

我应该通过简单的代码重构

Sub Pic_SA_click(ByVal sShapeName As String)
    If (sShapeName = vbNullString) Then Exit Sub

    Dim oShp As Shape, s As Shape
    Set oShp = ActiveSheet.Shapes(sShapeName)
    If (oShp Is Nothing) Then Exit Sub
    oShp.Visible = True
    With ActiveSheet
        For Each s In .Shapes
            If (s.Name <> oShp.Name) Then
                s.Visible = False
            End If
        Next s
    End With
End Sub

Sub Pic_1_SA_click()
    call Pic_SA_click("Group 23")
end sub 

Sub Pic_1_SB_click()
    call Pic_SA_click("Group 71")
End Sub

Sub Pic_2_SA_click()
    call Pic_SA_click("Group 19")
End Sub

Sub Pic_2_SB_click()
    call Pic_SA_click("Group 20")
End Sub