【问题标题】:Excel 2016 VBA - Creating Dashboard with greater efficiencyExcel 2016 VBA - 更高效地创建仪表板
【发布时间】:2018-07-03 21:48:25
【问题描述】:

我目前正在使用 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

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

【问题讨论】:

  • 代码审查/效率请求属于codereview.stackexchange.com
  • 我们中的许多人在防火墙后面看不到图片 - 请发布您的实际代码。对于您最初的问题 - 在代码中将对象保存在形状数组中,然后隐藏/取消隐藏数组中的每个元素。
  • 感谢您的建议。我在看数组。我也编辑了 OP 以直接显示代码。

标签: excel vba


【解决方案1】:

我简单的代码重构应该做到这一点

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

【讨论】:

  • 谢谢帕斯卡。您的代码看起来很容易应用。我确信重新配置它以添加更多项目不会有问题。
猜你喜欢
  • 2011-04-11
  • 2018-05-11
  • 1970-01-01
  • 2013-10-23
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多