我在将数组从用户定义的类型传递给函数时遇到了麻烦:
定义类型(在标准模块中):
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
数组。有什么想法吗?
(我也很高兴有关该代码的任何其他建议。)
谢谢,
Ĵ
答案 0 :(得分:1)
已解决(感谢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通过数组内容填充组合框:
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
答案 1 :(得分:0)
我认为问题是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