Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA根据形状的位置选择形状_Excel_Vba_Shapes - Fatal编程技术网

Excel VBA根据形状的位置选择形状

Excel VBA根据形状的位置选择形状,excel,vba,shapes,Excel,Vba,Shapes,如果单元格中的值“A:Shape.TopLeftCell.Row”=0,如何选择所有形状(数组?范围?)? 如上图所示,阵列应仅包含形状2和3。构建符合条件的形状栏,然后选择该形状栏 Sub ShapePicker() Dim s As Shape, sr As ShapeRange Dim Arr() As Variant Set mycell = Range("A:A").Find(What:=0, After:=Range("A1")) rrow = my

如果单元格中的值
“A:Shape.TopLeftCell.Row”=0,如何选择所有形状(数组?范围?)?


如上图所示,阵列应仅包含形状2和3。

构建符合条件的形状栏,然后选择该形状栏

Sub ShapePicker()
    Dim s As Shape, sr As ShapeRange
    Dim Arr() As Variant
    Set mycell = Range("A:A").Find(What:=0, After:=Range("A1"))
    rrow = mycell.Row

    i = 1
    For Each s In ActiveSheet.Shapes
        If s.TopLeftCell.Row = rrow Then
            ReDim Preserve Arr(1 To i)
            Arr(i) = s.Name
            i = i + 1
        End If
    Next s

    Set sr = ActiveSheet.Shapes.Range(Arr)
    sr.Select

End Sub

另一种选择是,您可以反转逻辑,边走边选择,然后根据需要将选择指定给形状标注:

Sub ShapePicker()
    Dim s As Shape
    Dim sr As ShapeRange
    Dim i As Long

    i = 1
    For Each s In ActiveSheet.Shapes
        If Cells(s.TopLeftCell.Row, "A").Value = 0 Then
            s.Select (i = 1)
            i = i + 1
        End If
    Next s
    Set sr = Selection.ShapeRange
End Sub

可以在图纸上的形状之间循环,直到找到范围内的形状。正如其他人提到的,选择通常是不必要的

Dim shp As shape
For Each shp In ActiveSheet.shapes
    If Not Intersect(yourselectedrange, shp.TopLeftCell) Is Nothing Then
         shp.Select
         Exit For
    End If
Next shp

还有另一种方法。我在寻找解决方案时偶然发现了这篇文章

因此,这是一个为任何人寻找出路

方法如下:

像这样运行一次
循环
,将
矩形的名称
更改为它们的
TopLeftCell的地址

 Dim sh As Shape

 For Each sh In ActiveSheet.Shapes

    sh.Name = sh.TopLeftCell.Address

 Next sh

现在,在任何其他代码中,您可以使用以下命令直接访问形状:

ActiveSheet.Shapes(ActiveCell.Address).Select
这是实现它的一种方法。虽然目前还没有一种方法,你正在寻找

您可以更改
ActiveCell.Address
任何范围对象,也可以仅更改文本本身。它将采用
$D$4


经过尝试和测试,它工作顺利。

您实际想要完成什么?我这样问是因为很少需要
在Excel中选择
激活
任何内容。而且,这没有任何意义:
“A:Shape.TopLeftCell.Row”=0
。当然没有。这是为了显示我需要的形状,它们的左上角在一行中,列中的值为0。选择我的意思是放入数组,然后我将对所有形状执行一些更改。那么到目前为止你试过什么?您可以创建一个函数,返回一个形状名称数组。这正是我所需要的。塔克斯