我目前正在使用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
在这两个问题上的任何指导将不胜感激。谢谢!
答案 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