2

有一个用户窗体,其中包含多个第 3 方 ActiveX 网格控件(iGrid by 10Tec)的实例。我们有一个 sub 使用相同的语句初始化每个网格:

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 将 Long 指针传递给我们使用 ObjPtr 获得的 iGrid,然后使用 API CopyMemory 将其转换回 iGrid 类型,MS Excel VBA 也无法访问 iGrid 成员。

此任务的关键是在 SetupIgrid 子中拥有真正的 iGrid 对象以使用 IntelliSense 功能。现在我们可以将它作为对象(变体)或其他东西,但是当我们按下点时,确定这不会给我们智能感知列表。

4

2 回答 2

2

这是因为控件不打算以这种方式传递到其主机之外。“幕后”传递的是包装器的早期绑定“扩展器”控件,它反过来会导致您看到的类型不匹配。

Microsoft对这个问题进行了更全面的处理。

于 2012-10-05T15:16:31.460 回答
2

除了我上面的评论,我刚刚测试了它并且它有效(即没有错误消息)

你必须声明ig As Control

我从这里下载了网格

Option Explicit

Private Sub CommandButton1_Click()
    SetupIgrid iGrid1
End Sub

Sub SetupIgrid(ig As Control)
   ig.RowMode = True
   ig.MultiSelect = True
   ig.Appearance = igAppearanceFlat
   ig.Editable = False
End Sub

截屏

在此处输入图像描述

单击命令按钮后

在此处输入图像描述

于 2012-10-05T16:49:29.397 回答