对于Excel-2007:
不使用select,将形状添加到特定范围或单元格的最佳方法是什么?
到目前为止,我发现的最佳方式是使用EntireColumn.Left
等进行计算。
可以在范围内使用AddShape
方法自动创建范围内的形状吗?或者AddShape
是否必须始终找到相对于文档左上角的新形状?
答案 0 :(得分:4)
以下是在工作表上放置Shape(在本例中为TextBox)而没有任何选择或对文档左上角的任何引用的示例,只有参数有问题的范围:
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
答案 1 :(得分:2)
我将@ Gary的学生答案标记为最佳答案......但由于我无法找到与我正在做的事情相关的大量信息,我认为这里粘贴的一些代码可能会对将来有所帮助。
@ 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
方法的一些有用信息,请参阅here。
这样做的好处是电子表格可以继续正常使用,直到用户点击形状。这为电子表格添加了大量自定义。