【问题标题】:User-defined Type & passing Array to Function用户定义类型 & 将数组传递给函数
【发布时间】:2016-07-16 20:20:30
【问题描述】:

我在将数组从用户定义的类型传递给函数时遇到问题:

定义类型(在标准模块中):

Public Type JPrinters
    Available() As String
    Default As String
End Type

列出所有可用打印机的功能(标准模块):

Function ListPrinters() As JPrinters

    Dim GetPrinters As Object: Set GetPrinters = CreateObject("WScript.Network").EnumPrinterConnections     
    Dim i As Integer
    Dim j() As String  'Array of Printer Names
    ReDim j(0 To GetPrinters.Count \ 2 - 1)

    For i = 0 To UBound(j)
        'Load this array element with the Name from the list
        j(i) = GetPrinters.Item(i * 2 + 1)
    Next i

    Dim k As JPrinters
    With k
        .Available = j
        .Default = Application.ActivePrinter
    End With

    ListPrinters = k
End Function

Sub 通过数组填充 ComboBox(正常工作 - std 模块):

Sub PopulateComboBoxBy2DArray(Ctrl As Control, ByVal Source_1D_2D_Array As String, Optional DefaultValue As String)
    Ctrl.List = Source_1D_2D_Array
    If DefaultValue Then
        Ctrl.Value = DefaultValue
    End If
End Sub

然后我尝试调用 Workbook_Open 上的所有内容:

Private Sub Workbook_Open()
    Dim Prt As JPrinters
    Prt = ListPrinters
    PopulateComboBoxBy2DArray List1.PrinterList, Prt.Available, Prt.Default
End Sub
  • 所有模块都定义了Option Explicit。

它只是给出了我的编译错误:类型不匹配。我尝试了很多,但无法弄清楚为什么它不接受 Prt.Available 数组。有什么想法吗?

(我也很乐意提供有关代码的任何其他建议。)

谢谢,

J

【问题讨论】:

  • 你试过“ByVal Source_1D_2D_Array As Variant”吗?
  • 是的,但它也不起作用 - 整行 PopulateComboBoxBy2DArray List1.PrinterList, Prt.Available, Prt.Default 被选中,Watch 显示 。

标签: arrays vba excel types


【解决方案1】:

我认为问题在于 Source_1D_2D_Array 参数的声明。它被声明为字符串,它需要是一个字符串数组。类型不匹配是因为您将字符串数组传递给字符串参数。

对 DefaultValue 的检查也需要进行比较。我想你想要:

Sub PopulateComboBoxBy2DArray(Ctrl As Control, ByRef Source_1D_2D_Array() As String, Optional DefaultValue As String = "")
    Ctrl.List = Source_1D_2D_Array
    If DefaultValue<>"" Then
        Ctrl.Value = DefaultValue
    End If
End Sub

【讨论】:

  • 意味着错误保持不变?类型不匹配?您还可以验证是哪一行给出了错误吗?
  • 这是错误 13:类型不匹配...事实上,这是可以得到的,因为至少 Prt.Available 包含所需的数据。但是调试器标记的行与我在上面的评论中提到的保持不变...
  • 可能与List1.PrinterList有关。从你的问题我们无法判断那是什么。你确定它是“控制”类型的吗?
  • 我试过 ComboBox、OLEObject,甚至是 Object 类型...,一点效果都没有。仍然是错误 13。组合框位于 Sheet1 上(“List1”是我的语言中的等效名称)。有趣的是,在我将它分离为我想要重用的功能之前,它已经起作用了。我认为 UDT 是问题所在。
  • 如果 List1 是 ComboBox,那么 List1.PrinterList 是什么?我不熟悉 ComboBox 的那个属性。您的意思是将 List1 传递给您的填充函数吗?
【解决方案2】:

已解决(感谢 Excel 先生论坛的 Dave)。它是这样的:

类型:

Type J_Type_Printers
    Available() As Variant
    Default As Variant
End Type

功能:

Function J_Fx_ListPrinters() As J_Type_Printers
    Dim GetPrinters As Object
    Dim i As Integer
    Dim j() As Variant 'Array of Printer Names
    Dim k As J_Type_Printers

    Set GetPrinters = CreateObject("WScript.Network").EnumPrinterConnections
    ReDim j(0 To GetPrinters.Count \ 2 - 1)

    For i = 0 To UBound(j)
        'Load this array element with the Name from the list
        j(i) = GetPrinters.Item(i * 2 + 1)
    Next i

    With k
        .Available = j
        .Default = Application.ActivePrinter
    End With
    J_Fx_ListPrinters = k
End Function

通过数组内容填充组合框:

Sub J_Sub_Controls_ComboBox_ListArray(ByVal Ctrl As ComboBox, ByVal SrcArray As Variant, Optional DefaultValue As Variant)
    Ctrl.List = SrcArray
    If Not IsMissing(DefaultValue) Then Ctrl.Value = DefaultValue
End Sub

调用 Workbook_Open:

Private Sub Workbook_Open()
    Dim Prt As J_Type_Printers: Prt = J_Fx_ListPrinters
    J_Sub_Controls_ComboBox_ListArray List1.PrinterList, Prt.Available, Prt.Default
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-13
    • 2012-08-14
    • 1970-01-01
    • 2011-12-24
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多