1

对于 Excel-2007:

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

到目前为止,我发现的最好方法是计算 usingEntireColumn.Left等。

是否可以AddShape在范围内使用该方法自动创建范围内的形状?还是必须AddShape始终定位相对于文档左上角的新形状?

4

2 回答 2

4

这是一个在工作表上放置 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
于 2013-09-13T20:15:08.977 回答
2

我将@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

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

于 2013-09-16T15:40:29.803 回答