Excel 如果知道形状的topleftcell行,是否可以直接选择形状&;柱

Excel 如果知道形状的topleftcell行,是否可以直接选择形状&;柱,excel,vba,shapes,Excel,Vba,Shapes,我在一张纸上有大约100个矩形。我想更改我知道其TopLeftCell坐标的特定矩形的颜色 我想能够直接选择这个矩形来改变它的颜色,但我找不到任何VBA代码来做这件事。目前,我能找到的唯一代码是,选择工作表上的所有形状,然后查找工作表上每个形状与TopLeftCell的交点,然后选择该矩形以更改其颜色 由于可能要检查100个形状,这似乎是一种非常低效的方法,我认为一定有更好的方法 Dim sh as shape For Each sh In ActiveSheet.Shapes If

我在一张纸上有大约100个矩形。我想更改我知道其
TopLeftCell
坐标的特定矩形的颜色

我想能够直接选择这个矩形来改变它的颜色,但我找不到任何VBA代码来做这件事。目前,我能找到的唯一代码是,选择工作表上的所有形状,然后查找工作表上每个形状与
TopLeftCell
的交点,然后选择该矩形以更改其颜色

由于可能要检查100个形状,这似乎是一种非常低效的方法,我认为一定有更好的方法

Dim sh as shape

For Each sh In ActiveSheet.Shapes
    If Not Intersect(Cells(RowNumber, ColumnNumber), sh.TopLeftCell) Is Nothing Then
        sh.Select False
        Selection.Interior.ColorIndex = 3
        Selection.ShapeRange.Fill.Visible = msoTrue
        Selection.ShapeRange.Fill.Solid
    End If
Next sh
我想知道这样的代码

selection.shape.topleftcell(cells(RowNumber,ColumnNumber))
或在VBA中也可以使用类似功能。

我尝试了这个和其他类似的代码,但都出现了错误。

像这样运行一次
循环
,将
矩形的名称更改为其
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


经过尝试和测试,它运行平稳。

如果您所做的只是选择要更改颜色的形状,那么只需:

Sub changeColor()
    Selection.Interior.ColorIndex = 3
End Sub
如果您想以一种更有组织的方式访问形状的其他属性,我建议您使用TopLeftCell作为键在字典中收集形状名称。然后,您可以执行以下操作:

Option Explicit
'Set Reference to Microsoft Scripting Runtime
Public dShapes As Dictionary
Private Sub refShapes()
    Dim WS As Worksheet
    Dim SH As Shape

Set WS = ActiveSheet
Set dShapes = New Dictionary
    dShapes.CompareMode = TextCompare
For Each SH In WS.Shapes
    dShapes.Add Key:=SH.topLeftCell.Address, Item:=SH.Name
Next SH

End Sub

Sub changeColor()
    Dim SH As Shape
    Dim topLeftCell As String

topLeftCell = Selection.topLeftCell.Address

refShapes

If dShapes.Exists(topLeftCell) Then
    Set SH = ActiveSheet.Shapes(dShapes(topLeftCell))
    SH.Fill.ForeColor.RGB = RGB(255, 0, 255)
    SH.Fill.Visible = msoTrue
    SH.Fill.Solid
Else
    MsgBox ("No shape at that location")
End If
End Sub

但是,如果您有多个形状具有相同的
TopLeftCell
,则此技术将失败,但如果需要,可以调整以处理该情况。

还有一个解决问题的方法。运行一次循环,并根据
sh.Name=sh.TopLeftCell.Address
更改所有形状的名称。。。现在,在您的任何其他代码中,您可以使用
Cell.Address
访问形状,而无需在它们之间循环并记住任何Id或类似的内容。一般来说:由于许多元素(本例中的形状)只能通过其名称或索引直接寻址,循环通常是一种标准方法。检查100个范围也不那么耗时,所以没有什么可以反对的。在本例中:@Mikku找到了一个很好的解决方法。