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