excel - 如何释放形状对象变量或重置它?
问题描述
我有下面的代码触发自动为单元格范围内的形状提供数字。
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
还是同样的问题。
所以我的问题是:
- 形状对象如何管理文本?
- 我将文本设置为形状的原始方法是否会导致此问题?
干杯!
解决方案
您的问题不在于无法修改形状的文本-每次调用例程时都会对其进行修改。您只是一次又一次地为他们分配相同的文本。
原因是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
推荐阅读
- javascript - 为什么我无法从对象实例中删除 getter 函数?
- reactjs - 当父级注入具有不同值的道具时,子组件不会触发渲染
- sql-server - PowerShell 命令 Start-Process 未在远程执行
- mysql - 即使值为零,条形也会显示 - Google Charts
- gradle - 使用实现是否允许跳过排除消费者项目中的依赖项?
- python - Python中的多重继承问题
- snowflake-cloud-data-platform - 在 Account_usage 架构中的 storage_usage 视图显示所有仓库/项目的数据?
- python-3.x - Influxdb 表示未授权执行语句
- c++ - 是否可以重用 PoCo HTTPRequestHandler?
- react-native - 无法使用 PushNotificationIOS(react-native-ios)在任何应用程序状态下接收通知