Excel VBA尝试编辑组内形状的可见性

时间:2016-03-13 23:50:33

标签: excel vba excel-vba excel-2013

我在excel 2013中创建了一个项目,该项目根据工作表顶部单元格中的数据显示和隐藏大量形状(网络图标和文本框)。我的目标是为我创建一个GUI来输入网络信息,当我将值输入到它填充到下面的网络图中的单元格中时。我把这一切都搞定了,但我把绘图的每个形状(可见和隐藏)组合成一个大组,这样我就可以将它复制/粘贴到功率点进行演示。但是,一旦我对形状进行分组,我就会收到运行时错误''对象不支持此属性方法。

我正试图找到一种方法来继续管理这些字段,但只是在一个巨大的群体中。任何帮助都会很棒!哦,主组形状的名称是' Group10'。

这是我在输入信息时更新网络设计的代码的快速示例。我也是从离线系统手动输入这个,所以请注意类型-os。

Private Sub WorkSheet_Change (ByVal Target As Range)
    If Range("s26").Value <> "" And Range("g26").Value <> "" Then
        ActiveSheet.Shapes("cloud1-group-p1").Visible = True
        ActiveSheet.Shapes("router1-group-p1").Visible = True
        ActiveSheet.Shapes("line1-group-p1").Visible = True
    Else
        ActiveSheet.Shapes("cloud2-group-p3").Visible = False
    End If
End Sub

我还试图了解如何创建一个我称为x的所有已知形状的数组。然后制作一个过滤器,只在形状可见的情况下,将x中的形状复制到一个新数组y中。然后复制y。但我对阵列很恐怖。所以我对LOL有所了解

2 个答案:

答案 0 :(得分:3)

隐藏/取消隐藏一组形状有一种巧妙的方法。假设我们在一张纸上有三个矩形,如:

enter image description here

以下循环技术将起作用:

Sub dural2()
    ary = Array("Rectangle 1", "Rectangle 2", "Rectangle 3")
    For Each a In ary
        ActiveSheet.Shapes(a).Visible = True
    Next a
End Sub

工作得很好。然而,试图将它们视为一个群体:

Sub dural()
    ary = Array("Rectangle 1", "Rectangle 2", "Rectangle 3")
    ActiveSheet.Shapes(ary).Visible = True
End Sub

会失败。避免循环的正确方法是使用ShapeRange

Sub dural3()
    Dim shr As ShapeRange, s As Shape
    Dim ary()
    i = 1
    For Each s In ActiveSheet.Shapes
            ReDim Preserve ary(1 To i)
            ary(i) = s.Name
            i = i + 1
    Next s
    Set shr = ActiveSheet.Shapes.Range(ary)
    shr.Visible = True
End Sub

答案 1 :(得分:0)

要访问组内的形状,请使用GroupItems这样的

Sub Demo()
    Dim ws As Worksheet
    Dim ShapeGroup As Shape
    Dim AShape As Shape

    Set ws = ActiveSheet
    Set ShapeGroup = ws.Shapes("Group10")
    Set AShape = ShapeGroup.GroupItems("ShapeToHide")
    AShape.Visible = False
End Sub