Passage d'une structure par argument
Bonjour,
Je me heurte à un problème et ne trouve pas de solution sur internet.
Je défini dans mon code VBA une structure
Type Facture
Message As String
Mail As String
Destinataire As String
Date As String
PieceJointe As String
NomCompetition As String
End TypeDans ma fonction main, je créer une variable de type facture
Dim MaFacture As Factureet je remplis tous les champs
j'aimerais ensuite passer cette variable à une fonction qui s'occupera de récupérer les différents paramètres, de les coller dans un fichier Excel et de l'envoyer par mail.
j'ai défini la fonction d'envoie comme suit:
Function EnvoyerFacture(FactureAEnvoyer As Facture)
.
.
.
End Functiondans la fonction principale:
EnvoyerFacture(MaFacture)Lors de l'execution, j'optient l'erreur suivante:
Erreur de compilation:
Variable requise, impossible de l'affecter à cette expression.
Quelle est mon erreur?
Merci
Bonjour,
Rien à voir avec la structure.
Une function est différente d'une Sub dans le sens ou elle renvoie une valeur.
Du coup, pour utiliser une fonction, il te faut l'affecter à une variable.
Option Explicit
Type Facture
Message As String
Mail As String
Destinataire As String
Date As String
PieceJointe As String
NomCompetition As String
End Type
Sub Main()
Dim MaFacture As Facture, b As Boolean
MaFacture.Message = "ole"
MaFacture.Mail = "aaaa@bb.fr"
b = EnvoyerFacture(MaFacture) 'on attribue le retour de la fonction à la variable b
End Sub
Function EnvoyerFacture(FactureAEnvoyer As Facture) As Boolean
MsgBox FactureAEnvoyer.Message
End FunctionBonjour,
la solution fonctionne, merci beaucoup!
Serait il possible de définir la fonction d'envoie de la manière suivante:
Sub EnvoyerFacture(FactureAEnvoyer As Facture)
MsgBox FactureAEnvoyer.Message
End Subet de l'appeler comme suit:
Sub Main()
Dim MaFacture As Facture
EnvoyerFacture(MaFacture)
End SubOui.
2 manières :
Sub EnvoyerFacture(FactureAEnvoyer As Facture)
MsgBox FactureAEnvoyer.Message
End Sub
Sub Main_1() 'Call => parenthèses obligatoires
Call EnvoyerFacture(Facture)
End Sub
Sub Main_2() 'sans Call => pas de parenthèses
EnvoyerFacture Facture
End Sub
'Si plusieurs paramètres :
Sub Plusieursparam()
Call Machin(param1, param2, param3)
'ou :
Machin param1, param2, param3
End SubAprès, le choix est juste une question de goût...
J'aime bien utiliser Call, comme cela, on sait visuellement qu'on appelle une Sub et on peut retrouver, plus facilement, tous les appels de Sub, dans un grand projet, grâce au Ctrl+F...
Tout comme les appels à Function, j'aime bien les affecter par Let...
Dans mon exemple précédent, je préfères écrire :
Sub Main()
Dim MaFacture As Facture, b As Boolean
MaFacture.Message = "ole"
MaFacture.Mail = "aaaa@bb.fr"
Let b = EnvoyerFacture(MaFacture) 'l'utilisation de Let permet une recherche rapide de tous les appels à fonction...
End SubEDIT :
En complément :
Déjà qu'est-ce qu'une fonction ? Qu'est-ce qui la différencie d'une Sub ? Une fonction (Function) est une instruction qui dépend de paramètres et qui retourne une valeur. Une Sub est également une instruction dépendante de paramètres (éventuels) mais qui ne retourne rien.
A toi, le développeur, de savoir si ton instruction (ou série d'instructions) doit, ou non, retourner une valeur.
Dans un cas tu créeras une Sub, dans l'autre une Function...
On comprend d'ailleurs mieux avec l'utilisation de Call, pour une Sub (je l'appelle et elle ne me retourne rien) et Let, pour une Function (j'affecte un résultat qu'elle me restitue dans une variable).
Merci beaucoup pour ton explication claire et instructive.
J'appliquerais tes conseils dans mes codes.
Bonne journée