只有在公共对象模块中定义的公共用户定义types可以用作VBA中的参数

我有一个公共的UDT,并且想把它作为一个普通模块的Public Sub中的参数。 然后我得到一个编译错误:

只有在公共对象模块中定义的公共用户定义types可以用作类模块公共过程的参数或返回types,或者可以用作公共用户定义types的字段。

我不太清楚,UDT和SUB是公开的。

这是我定义的UDT。

Public Type perf retailer As String sale As Integer cateDiscrip As String prodCode As String forecast As Integer score As Double End Type 

基本上,我想存储一个表(与零售商,类别描述,产品代码等)到一个数组中,然后按零售商sorting,对同一个零售商,按类别sorting。 我从另一张纸复制他们,然后将其粘贴到当前工作簿“数据”表中。 然后,我定义了一个公共UDT并将它们存储在一个数组中。

 Public Sub getlist() Dim highvol() As perf Dim lowvol() As perf Dim oneArr() As perf Dim i As Integer Dim s As Integer Set ws = Application.Worksheets("data") 'find the number of retailers, redimension the array, and fill them with 'the data in the lists With ws.Range("A2") nRetailer = ws.Range(.Offset(1, 0), .End(xlDown)).Rows.Count ReDim highvol(nRetailer) End With For isale = 2 To nRetailer If ws.Range("M1").Cells(isale) >= 10 Then n = n + 1 Else m = m + 1 End If Next ReDim highvol(n) ReDim lowvol(m) ReDim oneArr(nRetailer) nsale = 0 msale = 0 ''isale is the current row, nsale is the size of highvol sales. For isale = 2 To nRetailer If ws.Range("M1").Cells(isale) >= 10 Then nsale = nsale + 1 highvol(nsale).sale = ws.Cells(isale, 13) highvol(nsale).forecast = Str(ws.Range("N1").Cells(isale)) highvol(nsale).retailer = ws.Range("A1").Cells(isale) highvol(nsale).cateDiscrip = ws.Range("B1").Cells(isale) highvol(nsale).prodCode = ws.Range("C1").Cells(isale) highvol(nsale).score = Str((1 - AbsPerErr(ws.Range("M1").Cells(isale), ws.Range("N1").Cells(isale))) * 100) Else msale = msale + 1 lowvol(msale).sale = Str(ws.Range("M1").Cells(isale)) lowvol(msale).forecast = Str(ws.Range("N1").Cells(isale)) lowvol(msale).retailer = ws.Range("A1").Cells(isale) lowvol(msale).cateDiscrip = ws.Range("B1").Cells(isale) lowvol(msale).prodCode = ws.Range("C1").Cells(isale) lowvol(msale).score = Str((1 - AbsPerErr(ws.Range("M1").Cells(isale), ws.Range("N1").Cells(isale))) * 100) End If Next 

之后,我有两个函数用于过滤和比较,将数据传递到一个数组中。

  For i = 1 To nsale oneArr(i) = highvol(i) Next For s = 1 To msale oneArr(nsale + s) = lowvol(s) Next Dim result1() As perf Dim result2() As perf filter oneArr, "AED", 1, result1 filter result1, "RhinoBulk1", 2, result2 End Sub 

这是我得到错误filteroneArr的地方 。 任何人都可以解释发生了什么问题,以及如何解决它?

添加一个新的类模块,并重命名它perf而不是Class1。 粘贴在这个代码中:

 Public retailer As String Public sale As Integer Public cateDiscrip As String Public prodCode As String Public forecast As Integer Public score As Double 

然后,您需要更改循环代码,以便为数组的每个元素创build类的新实例:

 For isale = 2 To nRetailer If ws.Range("M1").Cells(isale) >= 10 Then nsale = nsale + 1 Set highvol(nsale) = New perf highvol(nsale).sale = ws.Cells(isale, 13) highvol(nsale).forecast = Str(ws.Range("N1").Cells(isale)) highvol(nsale).retailer = ws.Range("A1").Cells(isale) highvol(nsale).cateDiscrip = ws.Range("B1").Cells(isale) highvol(nsale).prodCode = ws.Range("C1").Cells(isale) highvol(nsale).score = Str((1 - AbsPerErr(ws.Range("M1").Cells(isale), ws.Range("N1").Cells(isale))) * 100) Else msale = msale + 1 Set lowvol(msale) = new perf lowvol(msale).sale = Str(ws.Range("M1").Cells(isale)) lowvol(msale).forecast = Str(ws.Range("N1").Cells(isale)) lowvol(msale).retailer = ws.Range("A1").Cells(isale) lowvol(msale).cateDiscrip = ws.Range("B1").Cells(isale) lowvol(msale).prodCode = ws.Range("C1").Cells(isale) lowvol(msale).score = Str((1 - AbsPerErr(ws.Range("M1").Cells(isale), ws.Range("N1").Cells(isale))) * 100) End If Next