调用sub后,Excel Workbook编译错误

时间:2016-04-14 18:59:57

标签: arrays excel vba excel-vba compiler-errors

我正在尝试制作一个动态生成复选框的工作表,所以我创建了下面的sub来重新命名它们以便我以后能够引用它们(因为我得到了复选框从另一个sub和不能硬编码那里的名字)。它工作正常,但它似乎是我得到一个奇怪的错误的原因。在我的宏中运行main sub后,每当我尝试运行任何宏时,都会出现编译错误。确切的错误是:

  

编译错误:
      对象库无效或包含对无法找到的对象定义的引用

这是一个错误,一群其他人已经得到但似乎没有一个在相同的情况下,没有任何建议的修复程序对我有用。

在实际的宏中,reNameCheckBox1(似乎导致问题的类)运行了很多次,但只运行一次没有问题。

问题类:

Sub reNameCheckBox1(newName As String, mainWB As Workbook)

Dim obj As OLEObject
Dim i As Integer



    i = 1

With mainWB.Worksheets("Sheet1")

For Each obj In .OLEObjects
Debug.Print obj.name

If TypeName(obj.Object) = "CheckBox" And Left(obj.name, 8) = "CheckBox" Then
Debug.Print "Found it"

obj.name = newName

mainWB.Worksheets("Sheet1").OLEObjects(newName).Object.Caption = newName
Exit For
End If
Next obj
i = i + 1

End With

End Sub

当它引起问题时如何使用它:

For n = 1 To numberOfNames

mainWB.Worksheets("Sheet1").OLEObjects.Add(ClassType:="Forms.CheckBox.1",       Link:=False, _
    DisplayAsIcon:=False, Left:=48, Top:=checkBoxTop, Width:=96, Height:=30). _
    Select

Call reNameCheckBox1("Name=" & arrayOfNames(n), mainWB)

checkBoxTop = checkBoxTop + 45



Next n

如果有人知道为什么这会导致问题或更好的方法来做我想做的事情,那将非常感激。

修改

根据共产国际的建议,如下所示,arrayOfNames是如何被初始化的。只需注意几点。 1)searchForParameters返回两个列表,我将调用arrayOfNames和otherNames,并试图返回它们,我将它们存储在一个令人兴奋的组织数组中。 2)当我做这个时,我不知道LBound或UBound是否存在(我是vba的新手)3)结果是如此组织的, - 零存储整个结果数组的长度 - 一个arrayOfNames的长度 - 在OtherNames的开头,存储其长度

所以,把这个令人困惑的混乱变成arrayOfNames和otherNames看起来像这样。

Dim results As Variant
Dim arrayOfNames As String
Dim otherNames As String
Dim length as Integer
Dim arrayOfNamesLength as Integer
Dim otherNamesLength As Integer
Dim n, i As Integer
results = searchForParameters(currentWB) 'Current wb is the name of the wb   its searching, which isnt the one the code's being ran out of

length = results(0)
arrayOfNamesLength = results(1)
otherNamesLength = results (arrayOfNamesLength + 2)
ReDim arrayOfNames(arrayOfNamesLength + 1)
ReDim otherNames(otherNamesLength)

For i = 0 To arrayOfNamesLength
arrayOfNames(i) = results(i + 1)
Next i

For n = 0 To otherNamesLength
OtherNames(n) = results(i + n + 1)
Next n

EDIT 事实证明,创建此问题的编译错误不是由此处的任何代码引起的,而是由单独的类引起的。因此,如果您遇到同样的错误,解决方案就不会在这里。因为它在修复我所拥有的代码方面有一些非常好的答案,我想我会把它留在这里并希望有人发现它有用。 干杯 -Ben J. Man

2 个答案:

答案 0 :(得分:3)

目前还不清楚 arrayOfNames 是否具有从零开始或从零开始的索引。我怀疑前者。使用Jade documentation LBound用于定义数组元素的范围。

我也怀疑所引用的'命名参数'。您可以使用命名参数,但不能以这种方式使用。

For n = LBound(arrayOfNames) To UBound(arrayOfNames)

    mainWB.Worksheets("Sheet1").OLEObjects.Add(ClassType:="Forms.CheckBox.1",       Link:=False, _
        DisplayAsIcon:=False, Left:=48, Top:=checkBoxTop, Width:=96, Height:=30). _
        Select

    reNameCheckBox1 newName:=CStr(arrayOfNames(n)), mainWB:=mainWB

    checkBoxTop = checkBoxTop + 45

Next n

我不确定UBound Workbook Object属性是否需要像这样使用。我建议简单地将Workbook对象作为参数引用。

将变量数组的variant元素作为字符串类型参数传递可能会出现问题,因此我将其转换为字符串。

Call并非必要,而且有些人认为它过时了。如果你愿意,可以使用它;它没有坏处。

答案 1 :(得分:2)

目前还不清楚为什么选择从OLEObjects.Add返回的CheckBox,然后立即在reNameCheckBox1中搜索它。只需抓住一个引用并在循环中重命名它:

Dim cb As OLEObject
For n = LBound(arrayOfNames) To UBound(arrayOfNames)
    Set cb = mainWB.Worksheets("Sheet1").OLEObjects.Add( _
                    ClassType:="Forms.CheckBox.1", _
                    Link:=False, _
                    DisplayAsIcon:=False, _
                    Left:=48, _
                    Top:=checkBoxTop, _
                    Width:=96, _
                    Height:=30)
    cb.Name = arrayOfNames(n)
    cb.Object.Caption = arrayOfNames(n)
    checkBoxTop = checkBoxTop + 45
Next n