Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/09/2011, 15h40   #1
Membre du Club
 
Homme
Inscription : janvier 2004
Messages : 239
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France

Informations forums :
Inscription : janvier 2004
Messages : 239
Points : 63
Points : 63
Envoyer un message via MSN à Chicard
Par défaut macro et fonction

Bonjour,

Au vu de ce que je cherche à faire (un tableau dan lequel je dois envoyé des données de textbox en paramètres), je risque de devoirs faire une fonction.

D'après ce que j'ai lu, les fonctions sont écrites dans des modules et ensuite toujours dans le module appelés dans les instructions d'un sub qqchose().

Est-il possible d'appelés une fonction dans le code d'un usf et de passer des paramètres se situant dans des blocs de codes différents (4 textbox différentes)?

Bien entendu si oui, comment?
Chicard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 16h15   #2
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
Oui, il suffit de donner une portée 'Public' à ta fonction.

Quant aux arguments, aucun problème pour les passer tant qu'ils existent dans l'espace depuis lequel tu appelles ta fonction je pense.

Donc si tu appelles ta fonction située dans un module depuis un userform et que tu veux lui passer tes textbox en arguments, ça devrait marcher si tu appelles la fonction depuis le userform.
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 16h45   #3
Membre du Club
 
Homme
Inscription : janvier 2004
Messages : 239
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France

Informations forums :
Inscription : janvier 2004
Messages : 239
Points : 63
Points : 63
Envoyer un message via MSN à Chicard
En fait j'étais plutôt partis sur le passage de mes texbox dans une variable string
puis appeler le(s) string.

En fait mes string on été déclaré en public parce que je les utilisais ailleurs mais dans ma fonction j'ai mis un paramètre que j'utilise même pas (intérêt = 0)donc c'est sur ça va foirer.

Par contre, je vois pas comment appeler ma fonction (vu dans un tuto du forum ou la fonction est appelé dans un sub) mais surtout ou la mettre.
donc voilà une partie du code dans lequel je pense appelé ma (mes fonction(s)
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Private Sub TextBox_ht_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    
    'Si la valeur de textbox_ht est un nombre sans virgule alors on rajoute la virgule et deux 0
    Dim vResult_ht As Variant, montant As String

    
    If TextBox_ht.Value = "" Then
    Else
        'vResult_ht = Replace(TextBox_ht.Value, ".", ",")
        'vResult_ht = CDbl(vResult_ht)
        vResult_ht = CDbl(Val(TextBox_ht.Value)) 'passage d'une chaine string en une valeur de type double si un nombre est rentré dans la textbox
        TextBox_ht = IIf(IsNumeric(vResult_ht), Format(vResult_ht, "###0.00"), "")
        TextBox_ht = Replace(TextBox_ht, ",", ".")
    End If
   
    If (OptionButton_lot.Value = True) Then
      min_max (montant_ht) 'changer pour une fonction
    ElseIf (OptionButton_bon_commande.Value = True) Then
        min_max() = montant_ht 'changer pour une fonction
    Else
        montant_ht = TextBox_ht 'changer pour une fonction
    End If
    
End Sub
Chicard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 16h54   #4
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
Avec une portée 'Public' tu peux la mettre dans le module que tu veux, elle sera appelable de n'importe où.
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 17h13   #5
Membre du Club
 
Homme
Inscription : janvier 2004
Messages : 239
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France

Informations forums :
Inscription : janvier 2004
Messages : 239
Points : 63
Points : 63
Envoyer un message via MSN à Chicard
La question c'est comment l'appeler, une fois que tu sais comment l'appeler ta fonction tu peux la mettre "où tu veux".
Chicard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 17h19   #6
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
Euh oui...disons pour l'exemple que j'écrive ma fonction dans un module perso. Dans ce module j'aurais donc seulement ma fonction:

Code :
1
2
3
Public Function maFonction(    ) As Sth
 
End Function
Et dans n'importe quelle autre module, userform...:

Code :
1
2
3
4
5
6
7
8
9
Private Sub maProcedure(   )
 
[...]
 
maVariable = maFonction(   )
 
[...]
 
End Sub

...mais je ne suis pas sûr qu'on se comprenne bien.
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 17h23   #7
Membre du Club
 
Homme
Inscription : janvier 2004
Messages : 239
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France

Informations forums :
Inscription : janvier 2004
Messages : 239
Points : 63
Points : 63
Envoyer un message via MSN à Chicard
Si si c'était bien ce que je voulais savoir
Chicard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 17h25   #8
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 895
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 895
Points : 7 179
Points : 7 179
Bonjour,

En complément de Sclarckone

La fonction attend 4 paramètres et retourne un string
Code :
1
2
3
4
5
Public Function maFonction(str1 as string, str2 as string, str3 as string, str4 as string) As string
 
....
 
End Function
que j'utilise dans le code
Code :
1
2
3
4
5
6
7
8
9
Private Sub maProcedure(   )
 
[...]
 
maVariable = maFonction(Textbox1.Text,Textbox2.Text,Textbox3.Text,Textbox4.Text)
 
[...]
 
End Sub
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/09/2011, 17h34   #9
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
Et je me permets d'ajouter, puisque dans une autre discussion tu expliquais que tu as un nombre variable de textbox, que tu peux déclarer certains arguments comme optionnels (avec le mot clé 'Optional').

Si mes souvenirs sont bons tu pouvais avoir besoin d'en utiliser 2,3 ou 4 donc tu peux déclarer ta fonction comme suit:

Code :
Public Function maFonction (str1 As string, str2 As string, Optional str3 As string, Optional str4 As string) As string
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 17h47   #10
Membre Expert
 
Homme Hervé Silve
Inscription : août 2010
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme Hervé Silve
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 773
Points : 2 093
Points : 2 093
Bonjour,

Et si on ne connaît pas à l'avance le nombre d'arguments à passer à la fonction, il suffit alors de lui passer un tableau sur lequel elle travaillera en cherchant avec Ubound(Tbl) la borne supérieure :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
Public Function MaFonction(Tbl() As String) As String
 
    Dim Mot As String
    Dim I As Integer
 
    For I = 1 To UBound(Tbl)
        Mot = Mot & " " & Tbl(I)
    Next I
 
    MaFonction = Mot
 
End Function
 
Sub test()
 
    Dim Tbl(1 To 5) As String
 
    Tbl(1) = "1er mot"
    Tbl(2) = "2ème mot"
    Tbl(3) = "3ème mot"
    Tbl(4) = "4ème mot"
    Tbl(5) = "5ème mot"
 
    MsgBox MaFonction(Tbl)
 
End Sub
Hervé.
Theze est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 09/09/2011, 11h04   #11
Membre du Club
 
Homme
Inscription : janvier 2004
Messages : 239
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France

Informations forums :
Inscription : janvier 2004
Messages : 239
Points : 63
Points : 63
Envoyer un message via MSN à Chicard
Merci pour tout ça que je vais essayer.

Dans mon cas une msgbox ne sert pas.
Chicard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 11h17   #12
Membre Expert
 
Homme Hervé Silve
Inscription : août 2010
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme Hervé Silve
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 773
Points : 2 093
Points : 2 093
Bonjour,

Le MsgBox est un exemple pour voir le retour de fonction ! A toi d'adapter la récup.

Hervé.
Theze est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/09/2011, 11h01   #13
Membre du Club
 
Homme
Inscription : janvier 2004
Messages : 239
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France

Informations forums :
Inscription : janvier 2004
Messages : 239
Points : 63
Points : 63
Envoyer un message via MSN à Chicard
une fonction est-elle obligé de renvoyé un résulat qu'il apparaisse dans une variable une msgbox ou autre?

En fait je vaux faire une remise à zéro de mes textbox et des chaînes qui ont été remplit durant l'exécution de ma macro.

A moins qu'une fonction existe déjà.
Chicard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2011, 11h12   #14
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 895
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 895
Points : 7 179
Points : 7 179
On utilise une fonction quand attend un résultat ou une information en retour de son exécution.
Si le but est uniquement de faire des actions sans attente de retour d'information, une procédure est plus adaptée (Sub)
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/09/2011, 11h14   #15
Membre du Club
 
Homme
Inscription : janvier 2004
Messages : 239
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France

Informations forums :
Inscription : janvier 2004
Messages : 239
Points : 63
Points : 63
Envoyer un message via MSN à Chicard
Je suppose que l'appel et la définition du sub sont semblables?

Finalement j'ai fait le bourrin.

Merci pour le coup de main
Chicard est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h01.


 
 
 
 
Partenaires

Hébergement Web