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?
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
Vous devez vous connecter pour publier un commentaire.
Ajouter un nouveau module de classe, et le renommer en perf plutôt que de Class1. Collez ce code:
Vous avez ensuite besoin de modifier le code en boucle pour créer de nouvelles instances de la classe pour chaque élément du tableau:
Qu'entendez-vous par "ne fonctionne pas"? J'ai oublié de mentionner, vous devez utiliser Jeu chaque fois que vous assigner la classe à partir d'un tableau à un autre comme
Set oneArr(i) = highvol(i)
quand je le lance, il affiche une "Macro" de la fenêtre et laissez-moi à choisir le nom de la macro(dont la classe n'était pas inclus)
Ce que vous essayez de l'exécuter? GetList?
Vous ne pouvez pas exécuter un module de classe. Le module de classe a uniquement le premier bout de code que j'ai posté. Le reste a remplacé la boucle que vous aviez dans votre GetList routine.
OriginalL'auteur Rory