调用子之后,Excel Workbook编译错误

我试图做一个dynamic生成的checkbox工作表,所以我做了下面的子重命名,所以我可以稍后引用它们(因为我得到了checkbox代表从另一个子,而不能硬编码有名字)。 它工作正常,但它似乎是我得到一个奇怪的错误的原因。 在我的macros中运行主要的子程序后,每当我尝试运行任何macros时,都会收到一个编译错误。 确切的错误是:

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

这是一堆其他人已经得到的错误,但没有一个似乎是在相同的情况下,没有build议的修复工作对我来说。

在实际的macrosreNameCheckBox1(似乎是导致问题的类)运行了很多次,但是只运行一次没有问题发生。

问题类:

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 

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

编辑

根据共同国际的build议,arrayOfNames如何被inilialized如下所示。 只需要注意一些事情。 1)searchForParameters返回两个列表,我会病态的调用arrayOfNames和otherNames,并试图返回它们,我把它们存储在一个有组织的数组中。 2)我不知道LBound或UBound存在时,我做了这个(我是新来的VBA)和3)结果组织如此, – 零整个结果数组的长度存储 – 一个长度arrayOfNames – 在OtherNames的开始,其长度被存储

所以,把这个混乱的混乱,变成arrayOfNames和其他名字看起来像这样。

 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 

编辑事实certificate,这个问题的编译错误创build解决不是由这里的任何代码引起的,而是由一个单独的类。 所以,如果你有同样的错误,解决scheme将不会在这里。 既然它在修复我有的代码方面有一些非常好的答案,我想我会把它留在这里,希望有人认为它有用。 干杯 – 本杰曼

目前还不清楚你的arrayOfNames是否有一个基于或基于零的索引。 我怀疑前者。 使用LBound UBound函数来定义数组元素的范围。

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

 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 

我不确定工作簿对象 Application.Selection属性需要如此使用。 我build议简单地引用Workbook对象作为参数。

你可能会遇到一个问题,将variables数组的variables元素作为stringtypesparameter passing,所以我把它转换为string。

Call是没有必要的,有些人认为这是陈旧的。 如果你喜欢使用它; 它没有坏处。

这是不完全清楚你为什么select从OLEObjects.Add返回的CheckBox,然后立即在reNameCheckBox1search它。 只需抓住一个引用,并在你的循环中重命名:

 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