我在使用ActiveX控件构建工作表时遇到了Excel崩溃问题。重建是痛苦的,即使经常保存频率也很频繁,所以我希望通过一个子控件构建控件,以便根据需要执行重建工作表。通过代码添加的Excel ActiveX标签具有奇怪的行为
下面的代码,删除所有现有的ActiveX控件,然后创建五个标签作品,排序。在一张空白纸上的第一次执行很好。只是为了测试它:
- 我再次执行,前四个标签在正确的位置,但第五个不在那里,并在我的工作表的右侧有一个'Label6'。
- 我执行第三次,前三个标签和第五个标签位于正确的位置,但第四个标签不存在,并且在我的工作表的右侧有一个“Label6”。
- 我执行第四次,前两个标签和最后两个在正确的位置,但第三个没有在我的工作表的右侧有一个'Label6'。
- 我执行第五次,第一个标签和最后三个在正确的位置,但第二个不在那里,在我的工作表的右侧有一个'Label6'。
- 我执行第六次,最后四个标签在正确的位置,但第一个不在那里,并且在我的工作表的右侧有一个'Label6'。
- 我执行第七时间和它的作品如预期
奇怪的是,如果我注释掉“呼叫CreateLabels”,并分别执行CreateSearchScreen和CreateLabels潜艇正常工作每次。
这似乎不是致命的,但我担心我有一些根本性的错误,当我需要它在现场环境中工作时,我的错误会咬我。
任何想法如何追查我做错了什么都表示赞赏。
Sub CreateSearchScreen()
Dim oOBJECT As SHAPE
'Delete all OLEObjects on the sheet
For Each oOBJECT In Sheets("Search").Shapes
If oOBJECT.Type = 12 Then oOBJECT.Delete
Next oOBJECT
Call CreateLabels
ActiveSheet.Select
End Sub
Sub CreateLabels()
Dim LABEL_CAPTIONS()
Dim LOWER_BOUND As Long
Dim UPPER_BOUND As Long
Dim COUNTER As Long
Dim oLABEL As OLEObject
'Create Labels
LABEL_CAPTIONS = Array("Posted", "Traded", "Offered", "Portfolio", "Transaction")
For COUNTER = LBound(LABEL_CAPTIONS) To UBound(LABEL_CAPTIONS)
Set oLABEL = Sheets("Search").OLEObjects.Add(classtype:="Forms.Label.1")
With oLABEL
.Object.BackColor = &H80000005
.Object.ForeColor = &H80000008
.Object.BorderStyle = 1
.Top = 195
.Height = 25
.Width = 85
.Object.Font.Size = 16
.Object.BorderStyle = 1
.Object.SpecialEffect = 0
.Object.TextAlign = 2
Select Case .Name
Case "Label1"
.Left = 20.25
.Object.Caption = LABEL_CAPTIONS(COUNTER)
Case "Label2"
.Left = 106.5
.Object.Caption = LABEL_CAPTIONS(COUNTER)
Case "Label3"
.Left = 192.75
.Object.Caption = LABEL_CAPTIONS(COUNTER)
Case "Label4"
.Left = 279
.Object.Caption = LABEL_CAPTIONS(COUNTER)
Case "Label5"
.Left = 365.25
.Object.Caption = LABEL_CAPTIONS(COUNTER)
End Select
End With
Next COUNTER
End Sub
UPDATE 为子CreateLabels此修改代码适用于2次迭代,然后我得到的错误“对象库无效或包含对反对说找不到定义的引用”。这发生在Sub CreateSearchScreen()的第一行。如果我手动删除标签并重新开始,它可以工作2次,然后出现同样的问题。
更新2 我修改了代码创建然后放置标签,但同样的问题出现后2次迭代。我没有使用函数,但我不认为这会影响事情。很奇怪,我可以单独但是没有执行的潜艇从子CreateSearchScreen(现在称之为CreateLabels2())
Sub CreateLabels2()
Dim LABEL_CAPTIONS()
Dim LOWER_BOUND As Long
Dim UPPER_BOUND As Long
Dim COUNTER As Long
Dim oLABEL As OLEObject
Set oLABEL = Nothing
'Create Labels
LABEL_CAPTIONS = Array("Posted", "Traded", "Offered", "Portfolio", "Transaction")
For COUNTER = LBound(LABEL_CAPTIONS) To UBound(LABEL_CAPTIONS)
Set oLABEL = Sheets("Search").OLEObjects.Add(classtype:="Forms.Label.1")
With oLABEL
.Name = "Label" & COUNTER
.Object.BackColor = &H80000005
.Object.ForeColor = &H80000008
.Object.BorderStyle = 1
.Top = 195
.Height = 25
.Width = 85
.Object.Font.Size = 16
.Object.BorderStyle = 1
.Object.SpecialEffect = 0
.Object.TextAlign = 2
.Object.Caption = LABEL_CAPTIONS(COUNTER)
End With
Next COUNTER
Dim oOLEOBJ As OLEObject
For Each oOLEOBJ In Sheets("Search").OLEObjects
With oOLEOBJ
Select Case .Name
Case "Label1"
.Left = 20.25
Case "Label2"
.Left = 106.5
Case "Label3"
.Left = 192.75
Case "Label4"
.Left = 279
Case "Label5"
.Left = 365.25
End Select
End With
Next
末次
这是有效的,除了.Left属性将不会按照我上面提到的定期间隔。不过,我可以用你的想法来命名和设置其他参数,然后使用Select Case修改每个参数的.Left。我刚刚尝试过,第一次和第二次都运行,然后出现错误“对象库无效或包含对无法找到的对象定义的引用”。我会在一秒内更新我的代码。 – mchac 2015-02-10 00:54:37
控件似乎有两个名称可以混淆事件,所以它搜索的名称和它的实际名称可能会不同 - 我猜这就是为什么你会收到错误消息。我会创建控件,然后循环遍历它们并将它们放在你想要的地方。我已经更新了上面的代码来做到这一点... – Tragamor 2015-02-10 01:58:35
这是在控件的有趣功能。如上所述,在我的更新中,我创建了控件,然后放置它们,但如果我尝试删除现有对象,然后插入标签,2次迭代后,我得到同样的错误'对象库无效'。 – mchac 2015-02-10 02:45:36