2015-02-09 44 views
0

我在使用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 

末次

回答

0

这个问题是关于因为标签名称并不总是被分配以在创建时,名称显示为标签6,这在CASE选择中没有处理。

然而,你正在通过一个数组循环,所以为什么不使用它来分配你的标签和位置......

Sub CreateLabels() 

    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 + 1 
      .Object.Caption = LABEL_CAPTIONS(COUNTER) 
      .Object.BackColor = &H80000005 
      .Object.ForeColor = &H80000008 
      .Object.BorderStyle = 1 
      .Top = 195 
      .Height = 25 
      .Width = 85 
      .Left = 20.25 + 86.25 * COUNTER 
      .Object.Font.Size = 16 
      .Object.BorderStyle = 1 
      .Object.SpecialEffect = 0 
      .Object.TextAlign = 2 
     End With 

    Next COUNTER 

End Sub 

UPDATE: 尝试进一步的编辑之前,我将创建的所有对象。

Function CreateLabels() 

    Application.ScreenUpdating = False 

    Dim LABEL_CAPTIONS() 
    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 + 1 
      .Object.Caption = LABEL_CAPTIONS(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 
     End With 
    Next COUNTER 

    Dim OLEObj As OLEObject 
    For Each OLEObj In Sheets("Search").OLEObjects 
     Select Case OLEObj.Name 
      Case "Label1" 
       OLEObj.Left = 20.25 
      Case "Label2" 
       OLEObj.Left = 106.5 
      Case "Label3" 
       OLEObj.Left = 192.75 
      Case "Label4" 
       OLEObj.Left = 279 
      Case "Label5" 
       OLEObj.Left = 365.25 
      Case Default: 
     End Select 
    Next 

    Application.ScreenUpdating = True 

End Function 
+0

这是有效的,除了.Left属性将不会按照我上面提到的定期间隔。不过,我可以用你的想法来命名和设置其他参数,然后使用Select Case修改每个参数的.Left。我刚刚尝试过,第一次和第二次都运行,然后出现错误“对象库无效或包含对无法找到的对象定义的引用”。我会在一秒内更新我的代码。 – mchac 2015-02-10 00:54:37

+0

控件似乎有两个名称可以混淆事件,所以它搜索的名称和它的实际名称可能会不同 - 我猜这就是为什么你会收到错误消息。我会创建控件,然后循环遍历它们并将它们放在你想要的地方。我已经更新了上面的代码来做到这一点... – Tragamor 2015-02-10 01:58:35

+0

这是在控件的有趣功能。如上所述,在我的更新中,我创建了控件,然后放置它们,但如果我尝试删除现有对象,然后插入标签,2次迭代后,我得到同样的错误'对象库无效'。 – mchac 2015-02-10 02:45:36