添加形状到范围(.AddShape方法)

时间:2013-09-13 19:57:43

标签: excel-vba vba excel

对于Excel-2007:

不使用select,将形状添加到特定范围或单元格的最佳方法是什么?

到目前为止,我发现的最佳方式是使用EntireColumn.Left等进行计算。

可以在范围内使用AddShape方法自动创建范围内的形状吗?或者AddShape是否必须始终找到相对于文档左上角的新形状?

2 个答案:

答案 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

这样做的好处是电子表格可以继续正常使用,直到用户点击形状。这为电子表格添加了大量自定义。