对于 Excel-2007:
不使用选择,将形状添加到特定范围或单元格的最佳方法是什么?
到目前为止,我发现的最好方法是计算 usingEntireColumn.Left
等。
是否可以AddShape
在范围内使用该方法自动创建范围内的形状?还是必须AddShape
始终定位相对于文档左上角的新形状?
这是一个在工作表上放置 Shape (在本例中为 TextBox)的示例,没有任何Selection或对文档左上角的任何引用,只有相关范围的参数:
Sub CoverRange()
Dim r As Range
Dim L As Long, T As Long, W As Long, H As Long
Set r = Range("A2:H8")
L = r.Left
T = r.Top
W = r.Width
H = r.Height
With ActiveSheet.Shapes
.AddTextbox(msoTextOrientationHorizontal, L, T, W, H).TextFrame.Characters.Text = "Test Box"
End With
End Sub
我将@Gary's Student 的答案标记为最好的......但由于我很难找到与我正在做的事情相关的很多信息,我认为在这里粘贴一些代码可能会在未来对某人有所帮助。
@Gary 建议的程序可以适应一系列单元格。我想在某个范围内的某些单元格的右侧放置一个小形状,在这些单元格上执行一些功能。因此,应用该.AddShape
方法:
Dim cl As Range, rg As Range
Set rg = Range("J2", Range("J2").End(xlDown))
For Each cl In rg
With ActiveSheet.Shapes.AddShape(92, cl.Width - 10 + cl.Left, cl.Top + 5, 10, 10)
.OnAction = "click_pm_update"
.Name = cl.Row
.Shadow.Visible = False
End With
Next
这会在每个单元格的右侧创建一个小星星。星星的名称反映了该星星所在的行,当点击它时,它会调用“click_pm_update”过程。
进一步说明,click_pm_update 使用该Application.Caller
方法,结合形状的名称(反映形状所在的行)来确定要对哪些单元格进行操作:
Private Sub click_pm_update()
Dim pmRow As String: pmRow = ActiveSheet.Shapes(Application.Caller).Name
'etc, etc
有关该方法的一些有用信息,请参见此处。Application.Caller
这样做的好处是电子表格可以继续正常使用,直到用户单击形状。这为电子表格增加了很多自定义。