有一个用户窗体,其中包含第 3 方 ActiveX 网格控件(iGrid by 10Tec)的多个实例。我们有一个使用相同语句初始化每个网格的子程序:
Sub SetupIgrid(ig as iGrid)
ig.RowMode = True
ig.MultiSelect = True
ig.Appearance = igAppearanceFlat
ig.Editable = False
End Sub
我们无法将 iGrid 实例传递给此子 - Excel VBA 在调用中始终显示“类型不匹配”错误,如下所示:
SetupIgrid igAuds
没有其他帮助。例如,我们可以像 Variant 或 Object 参数一样传递 iGrid,但是当我们尝试从中提取真正的 iGrid 类型时,我们会得到相同的类型不匹配:
Sub SetupIgrid(igObj as Object)
Dim ig as iGrid
Set ig = igObj
即使我们使用 hack 将 ObjPtr 获得的 Long 指针传递给 iGrid,然后使用 API CopyMemory 将其转换回 iGrid 类型,MS Excel VBA 也无法访问 iGrid 成员。
此任务的关键点是在SetupIgrid 子中拥有真正的iGrid 对象以使用IntelliSense 功能。现在我们可以将它作为对象(变体)或其他东西,但是当我们按点时,这不会给我们智能感知列表。
最佳答案
这是因为控件不打算以这种方式传递到其主机之外。 “在幕后”传递的是包装器的早期绑定(bind)“Extender”控件,这反过来又导致您看到的类型不匹配。
对此问题有更全面的处理here from Microsoft.
关于vba - 将 ActiveX 控件作为参数传递给 VBA 函数会导致 'type mismatch' 错误 : Need this for IntelliSense,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12748897/