用户定义types并将数组传递给函数

我有麻烦传递从用户定义的types的数组函数:

定义types(在标准模块中):

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

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

 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定义。

它只是给我编译错误:types不匹配 。 我试了很多,但不知道为什么它不会接受Prt.Available数组。 有任何想法吗?

(对于关于代码的其他build议,我也会很高兴。)

谢谢,

Ĵ

我相信问题是Source_1D_2D_Array参数的声明。 它被声明为string,它需要是一个string数组。 types不匹配是因为您正在将string数组传递给string参数。

另外,对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 

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

types:

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

function:

 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以数组内容填充combobox:

 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