我正在尝试制作一个动态生成复选框的工作表,所以我创建了下面的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
答案 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