用户定义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