首页 > 解决方案 > 如何释放形状对象变量或重置它?

问题描述

我有下面的代码触发自动为单元格范围内的形状提供数字。

Sub numShape()

Dim masqueA As Range
Dim cpt As Integer
Dim shapeTemp As shape
Set masqueA = Range("b33:l42")
cpt = 1

For Each shapeTemp In ActiveSheet.Shapes
    If Not Intersect(masqueA, shapeTemp.TopLeftCell) Is Nothing Then
        shapeTemp.TextFrame.Characters.Text = cpt
        cpt = cpt + 1
    End If

Next shapeTemp
End Sub

我遍历我的工作表的所有形状,如果它们在masqueA范围内,我给它们增加的数字(1,2,3....)。它做我想要的。
但是,如果我移动其位置的一种形状,例如,我将编号为 1 的形状与编号为 2 的另一种形状交换,并重新触发上述代码,这些形状将保持其初始编号。这使得编号为 1 的形状放置在编号为 2 的形状之后。
我尝试了不同的方法来重置形状,通过与上面相同的循环:

shapeTemp.TextFrame.Characters.Text = ""

或者

shapeTemp.TextFrame.Characters.Text = vbNullString

它将形状文本设置为空,但是当我重新执行时,Sub numShape()我仍然遇到同样的问题。所以我尝试使用以下方法释放变量对象内存:

Set shapeTemp = Nothing

还是同样的问题。

所以我的问题是:
- 形状对象如何管理文本?
- 我将文本设置为形状的原始方法是否会导致此问题?

干杯!

标签: excelvba

解决方案


您的问题不在于无法修改形状的文本-每次调用例程时都会对其进行修改。您只是一次又一次地为他们分配相同的文本。

原因是Shapes-collection 按创建顺序而不是位置返回工作表的形状。

以下代码循环遍历范围内的所有单元格(从上到下和从左到右),检查形状是否在单元格内开始并为其提供下一个数字。

Sub numShape()

    Dim masqueA As Range
    Dim cpt As Integer
    Set masqueA = Range("B33:L42")
    cpt = 1

    Dim row As Long, col As Long
    For row = 1 To masqueA.Rows.Count
        For col = 1 To masqueA.Columns.Count

            Dim shapeTemp As Shape
            For Each shapeTemp In ActiveSheet.Shapes
                If Not Intersect(masqueA.Cells(row, col), shapeTemp.TopLeftCell) Is Nothing Then
                    shapeTemp.TextFrame.Characters.Text = cpt
                    cpt = cpt + 1
                End If
            Next shapeTemp
        Next col
    Next row

End Sub

如果要从左到右排序,请col交换for 循环。row


推荐阅读