Seuls les types définis par l'utilisateur définis dans l'objet de modules peuvent être utilisés en tant que paramètres dans VBA

J'ai un public UDT, et je voulais l'utiliser comme paramètre dans un lieu Public Sous normale dans un Module. Je puis obtenir une erreur de compilation:

Seuls les types définis par l'utilisateur définis dans l'objet de modules peuvent être utilisés en tant que paramètres ou le type de retour pour les procédures publiques de modules de classe ou en tant que champs de public types définis par l'utilisateur.

Je ne sais pas vraiment la comprendre, l'UDT et sous sont publiques.

Ici est l'UDT j'ai défini.

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

En gros, je voulais stocker un tableau(avec le détaillant,la description de la catégorie, code de produit etc.) dans un tableau et ensuite triées selon le détaillant, pour le même détaillant, triés par catégorie.
J'ai copié à partir d'une autre feuille et ensuite collé dans le classeur en cours "données" de la feuille.
Ensuite, j'ai défini un public défini par l'utilisateur et stockées dans un tableau.

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

Après, j'ai eu deux fonctions de filtre et de comparer, transmis les données dans un tableau.

    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

C'est là que je reçois le message d'erreur filtre oneArr. Quelqu'un peut-il expliquer ce qui ne va pas et comment le résoudre?

L'utilisation d'une classe à la place d'un type défini par l'utilisateur pour cette. (vous n'aurez qu'à ajouter votre UDT membres en tant que membres publics de la classe pour l'implémentation la plus simple)
merci pour ça, mais je suis nouveau et jamais utilisé une classe avant. Puis-je ajouter un nouveau module de classe et puis collez le code dans la classe?
Voir cpearson.com/Excel/Classes.aspx pour des informations de base sur l'utilisation de Classes
merci, c'est très utile

OriginalL'auteur user3804820 | 2014-07-29