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 Type

Dans ma fonction main, je créer une variable de type facture

Dim MaFacture As Facture

et 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 Function

dans 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 Function

Bonjour,

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 Sub

et de l'appeler comme suit:

Sub Main()
    Dim MaFacture As Facture
    EnvoyerFacture(MaFacture)
End Sub

Oui.

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 Sub

Aprè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 Sub

EDIT :

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

Rechercher des sujets similaires à "passage structure argument"