Appel d'une procédure dans un Userform

Bonjour,

J'ai mis en place un userform me permettant de sélectionner une/ou la totalité d'une/entreprise et j'aimerais faire en sorte du coup que lorsque je sélectionne une entreprise dans le menu déroulant, j'aimerais filtrer mon tableau de donnée selon cette société puis envoyer la feuille actuelle, c'est-à-dire la feuille filtrée selon l'entreprise X en pièce joint.

J'ai creusé un peu de mon côté mais apparement j'ai un problème lorsque j'appelle ma procédure dans mon userform

Private propertyUser As String
Private propertyCancel As Boolean
'Private propertyMail As Boolean

Public Property Get User() As String
    User = propertyUser
End Property

Public Property Get Cancel() As Boolean
    Cancel = propertyCancel
End Property

Private Sub CommandButtonOk_Click()
'initialisation des propriétés du formulaire
    propertyCancel = False

    If CheckBoxAllPrestataire.Value = True Then
        propertyUser = ""
    Else
        propertyUser = ComboBoxPrestataireList.Value
    End If

'    If EnvoiMail.Value Then
'        propertyMail = True
'    Else
'        propertyMail = False
'    End If
    If EnvoiMail.Value = True Then
        'propertyUser = ComboBoxPrestataireList.Value
        export_stt (propertyUser)
    End If

    'Fermeture du formulaire
    Unload Me
End Sub
Private Sub export_stt(ByRef User As Integer)

Dim OutlookApp As Object, OutlookMail As Object
Dim message As String, sujet As String, adresse As String
Dim mois As Byte
On Error Resume Next

    ' Récupération de l'adresse mail associée à l'employé.
    adresse = Application.VLookup(User, ThisWorkbook.Worksheets("BDD Partenaires").Range("A:C"), 3, False)

    If adresse <> "" Then 'si adresse a une valeur différent de rien

        'Initialisation des variables
        sujet = "[BON DE FACTURATION] Ventilation de la société " & ThisWorkbook.Worksheets("Conso_Mois").Range("flop").Value & " : Bilan/Recap"
        mois = Month(Range("F2"))
        message = "Bonjour, veuillez trouver ci-joint la ventilation du mois de " & mois

        ' Création du mail
        Set OutlookApp = CreateObject("outlook.Application")
        Set OutlookMail = OutlookApp.CreateItem(0)
    Application.DisplayAlerts = False
        With OutlookMail
            .Subject = sujet
            .To = adresse
            .Body = message
            .Attachments.Add ActiveWorkbook.FullName
            .Display
        End With
    Application.DisplayAlerts = True
     Else
        MsgBox ("Une adresse email a été non définie.")
        Exit Sub
    End If

End Sub

La au niveau de la déclaration de mon argument, je suis pas sur si c'est correcte : de base je voulais le nom de l'entreprise ensuite à l'aide d'une recherche V qu'il me choppe l'adresse mail correspondante mais je sais pas du coup s'il faut déclarer un String ou un Integer ou même si c'est comme ça c'est mieux que je mette rien ?

Up

Bonjour,

Tu parles VBA comme une vache espagnole : C'est incompréhensible : Au lieu d'utiliser des mots qui "inconsciemment signifient et représentent (psychologiquement) autre chose ;

Au lieu d'utiliser des Sub qui sont en réalité des fonctions, utilise des variables de ton cru qui ne ressemblent pas à des mots réservés mais qui sont malgré tout significatif : "Y" au lieu de Cancel, Ope au lieu de User et pas de Property. Moyennant quoi tu auras peut-être une réponse plus carrée...

Sinon pour moi ce qui suit n'a pas de sens :

Private propertyUser As String
Private propertyCancel As Boolean
'Private propertyMail As Boolean

Public Property Get User() As String
    User = propertyUser
End Property

Public Property Get Cancel() As Boolean
    Cancel = propertyCancel
End Property

Mais c'est sur que comme on attend un "User As Integer"

Il y a de quoi se poser des questions ! Et comme je ne peux pas tester...
A+

Salut,

Merci de ta réponse. Ben c'est sûr que si personne ne me dis qu'il comprend pas ben je peux pas reformuler ma demande ni savoir que c'est chinois.

Du coup je viens de regarder la différence entre un sub et une fonction, je ne savais pas la différence : je viens de voir qu'une fonction permettait de retourner une valeur ; je suppose que tu faisais référence à la variable user ?

Heu... Oui mais comme je n'ai pas compris grand chose ! j'ai pas vraiment approfondi.

Bon je sens confusément que tu jargonnes dans un langage venu d'une autre planète donc c'est pas un jugement hein ! C'est juste mon avis.

Comme personnellement je ne pratique que le VBA je ne suis pas en mesure d'interpréter ce qui dans mon esprit s'apparente à des routines de pro qui butine entre différents langages.

A+

Dans tous les cas après je suis là pour apprendre, donc le fait que je maîtrises pas l'argot propre au VB j'ai envie de te dire que ca viendra avec le temps.

En bon français donc, j'aimerais juste récupérer la valeur de ma Combobox selon ma liste d'entreprise prédéfinie puis qu'en fonction de cette valeur, ça m'effectue le filtre selon l'entreprise sélectionner et enfin que je fasse un export de ce fichier par mail. D'où ma question, étant donné qu'il faut récupérer la valeur d'une variable.

Bonjour tout le monde,

Je me permets de up.

Les répondeurs n'aiment pas trop piétiner les plate bandes des collègues et comme en plus il n'y a pas de fichier pour tester, tu peux supposer qu'ils sont comme moi : Perplexes.

A+

Je suis là pour apprendre et comprendre surtout.

Je te joins mon classeur en question ci-joint. Du coup l'explication a été donné dans la réponse d'avant il me semble, si tu n'as tjrs pas compris encore dis-le moi.

13conso-mois2.xlsm (186.45 Ko)

Comme je l'ai dis plus haut, j'ai essayé de mon côté avant tout, donc si y a des erreurs insignifiantes/flagrantes, c'est que moi-même je ne connais pas les divers possibilités qui existent pour traiter mon problème ; en réfléchissant, j'ai pensé à mettre en place une boucle for each sur une table de données contenant les entreprises que je veux puis utiliser la variable de cette boucle pour l'utiliser en tant que "filtre" et avoir le résultat que je souhaite.

Ça me semble tout de suite beaucoup plus clair.

Malheureusement je ne suis pas un spécialiste de l'envoi de mail via VBA, mais je devrai pouvoir m'en tirer avec ça sauf que vu le calendrier, je risque de n'être pas le plus rapide... Mais je ne me vexerai pas si quelqu'un reprend le fil !

Dans tous les cas ne t'impatiente pas. On va essayer de faire entre tous les impératifs de fête !

A+

EDIT : Dans un premier temps je vois déjà une erreur qui me semble rédhibitoire :

ton Private dans ce contexte :

Private Sub export_stt(ByRef User As Integer)

...fait que ton UserForm ne peut pas trouver la macro. C'est probablement ce qui motive ta question.

Donc virer le Private.

Après, je n'ai pas encore pu analyser toute les incidences et les relations entre le ribbon et les diverses macros, mais déjà ça te fait une piste de réflexion...

EDIT2 : Ton "User" comme nom de variable ne me plait pas du tout : Utilise tout ce que tu veux sauf un mot susceptible d'être un mot réservé...

Salut,

Je te remercie de ta réponse! Pas de soucis par rapport au temps, ce n'est pas pressé.

Du coup, je viens de renommer les variables que tu m'as dis pour pas me porter préjudice ; pareil pour le private, merci à toi : je pensais que lorsqu'il y avait le préfixe "private" avant une procédure elle était utilisable uniquement dans le dit-classeur en cours.

Du coup j'ai remplacé ma variable User par Utilisateur dans le "module" de ma Userform. Lorsque je compile maintenant ça me met "Erreur de compilation - impossible d'affecter à une propriété en lecture seule" au niveau de l'initialisation de ma usf.

'Gestionnaire d'initialisation du formulaire à l'ouverture
Private Sub UserForm_Initialize()

    ' Reset des propriétés du formulaire
    annuler = True
    Utilisateur = ""

    ' Initialisation des contrôles de la fenêtre
    CheckBoxAllPrestataire = False 'décocher
    ComboBoxPrestataireList.Enabled = True 'available
    EnvoiMail = False 'décocher

End Sub
7conso-mois2.xlsm (187.17 Ko)

Edit : Pas de soucis, c'est pas spécialement pressé.
Au passage, bonne année !

Bonjour,

On va commencer l'année sur des bases saines : Pour moi ce classeur c'est n'importe quoi.

J'allais te conseiller d'oublier mon intervention et de laisses tomber ce fil pour revenir auprès d'André13, sauf que je viens de vérifier qu'il souhaitait passer la main lui aussi.

Aussi mon conseil est de repartir sur des bases saines : On oublie tout et on recommence sur la base de ce que j'ai préparé : Voir en pièce jointe

13conso-mois-vg.xlsm (185.58 Ko)

. Me dire si mon organisation est satisfaisante (possible dans ton contexte) Tableaux nommées, segment, onglets, userform.

A+

Salut,

D'accord ça marche, pas de soucis : c'est vrai que comme ça, tout est plus clair avec des noms parlants.

Juste au niveau du tableau TPart, y avait une ligne de donnée qui était pas compris dans la tableau. Sinon, c'est bon, tout est correct ; pour confirmation, le "Me." signifie que tu parles de l'userform en question si j'ai bien compris ?

7conso-mois-vg.xlsm (185.17 Ko)

Bonjour toutes et tous

coucou Galopin01 beau taf comme d'hab^^

@AjsZoo24 attention! dans la feuille BDConso le bouton de commande Bouton 3 fait une longueur en profondeur et à ce rythme, il n'y aura plus de lignes libre lol

(voir ligne 1710 entre les colonnes P, Q et R), le raccourcir et peut être le déplacer au-dessus vers les premières lignes. (ancienne macro je pense filtre_amirat_pdf)

crdlt,

André

Oui bon je n'ai pas travaillé la mise au point ni la finition des macros, juste la remise en ordre des param et des plages.

J'ai aussi viré les propertymachin qui ne servent à rien et réajuster avec des variables classiques. Mais ça je verrai après.

Parce que aujourd'hui c'est dimanche et j'étais un peu débordé. Et puis je n'étais pas trop certain des intention avec tous ces trucs à la noix, il va va falloir que j'explore un peu les usertruc et les conditions des checkbox qui me paraissent parfois paradoxale...

Mais je n'ai pas trop poussé l'analyse finale. Déjà quand on part sur des bases claires après les solutions viennent plus facilement.

Demain est un autre jour...

A+

Après je ne suis pas certain de savoir mener jusqu'au bout l'envoi des mails, car l'enchevètrement des Utilisateurs et Property est tel qu'on a l'impression qu'on a chercher à obfusquer le processus.

De plus je ne suis pas du tout un pro du SendMail à toutes les sauce.

Mébon... Pitêtre que quelqu'un arrivera à finaliser plus simplement maintenant le désir de notre ami...

Bon en attendant il faudra sans doute que tu me réexliques un peu la finalité de TOUSSA.

Je comprend qu'on veut pouvoir envoyer à UN seul destinataire ou a TOUS les destinataires. Les utilisateurs étant en fait des Destinataires ? C'est ça ?

Il faudra que tu m'exlique à quoi sert vraiment le CheckBox Envoi par mail puisque de toute façon on est dans un UserForm Envoi par mail ?

A+

EDIT : Je m'interroge encore sur le "Destination" de :

Sub ExportPdf(Utilisateur, Destination)

???

Bon finalement je pense que j'ai résolu ton problème. (Au moins pour ce que j'en ai compris)

Il y a juste le second checkbox qui est inutilisé car je n'ai pas compris à quoi il sert.

J'ai juste testé pour un envoi unique car il y a un problème de Nom de fichier pour tes pdf :

"sujet" est un string qui ne convient pas pour un nom de pdf :Peut-être un pb de caractère interdit "[ ]/"ou pas... ou un string trop long. ..

C'est vrai que les string plus ils sont petits, plus on les aime ! Quoi qu'il en soit, il convient de concocter un string plus conforme à un nom de fichier usuel.

Donc pour l'instant le pdf s'appelle "blabla.pdf."

Quand tu auras trouvé un nom qui convient, tu pourras tester sur la totalité du combo. Pour l'instant, il se fait tard et j'ai la flemme !

A+

6conso-mois-vg2.xlsm (126.50 Ko)

@Andre13 Ah oui, effectivement, je ne l'avais même pas vu, merci.

@galopin01 De base je voulais enregistrer le document après filtrage en format PDF dans un dit dossier en spécifiant le chemin (d'où le paramètre Destination) (et/ou l'imprimer) mais après avoir réfléchi je me suis demandé si ça en valait la peine ou non. D'où le commentaire qui à rien avoir "Impression d'1 seul salarié".

J'ai téléchargé le fichier et c'est exactement ce que je voulais !! Je te remercie infiniment !

Juste ce passage que je n'ai pas très bien saisi :

Private Sub cbAllPrest_Click()
   Dest = IIf(cbAllPrest = True, Me.cboPrest.Value, "")
   Me.cboPrest.Enabled = Not Me.cbAllPrest
End Sub
_________________________________________________________
Private Sub cboPrest_Change()
   Dest = Me.cboPrest.Value
End Sub

Cela signifie que si cbAllPrest est coché, la variable Dest prend la valeur présente dans la comboBox qui est rien, car derrière si la comboBox est "utilisable" cela signifie que cbAllPrest est forcément dédoché ?

Par rapport à la variable "Sujet" d'accord, ça marche, je la renommerai "sbj" éventuellement. Ca m'a permis également de voir une première utilisation des segments en VBA, ça peut être intéressant. Ainsi que filtrer une base de donnée selon la valeur d'une comboBox.
D'ailleurs tu m'as également répondu à ma question du début qui était d'appeler une ou plusieurs procédure(s) dans n'importe quels types de procédure.

En tout cas, je te remercie énormément encore. Je pense avoir fait le tour de la macro, je regarderai ça demain de plus près si jamais j'ai encore d'autres questions et puis ben je vais profiter de la checkBox qui reste pour y mettre ma fonction enregistrement PDF tant qu'à faire.

" je vais profiter de la checkBox qui reste pour y mettre ma fonction enregistrement PDF "

L'enregistrement PDF fonctionne déjà. Ya vraiment rien à fiche de ce second Checkbox : Juste à le virer.
Les 2 macros que tu cites doivent être modifiées en fonction de ce dernier fichier joint.
cbAllPrest est décoché par Construction
et le cmdButtonOk est invisible et n'est visible que si le combo est coché ou cbAllPrest est coché.

" Par rapport à la variable "Sujet" d'accord, ça marche, je la renommerai "sbj" éventuellement "

Ce n'est pas la variable qu'il faut renommer mais le contenu de FName :
La variable sujet on s'en fout : La variable tu peux bien l'appeler LIBELLULE ou PAPILLON, ça ne changera rien au problème :
C'est le contenu de FName qui "ne passe pas" si tu te sert de "sujet" comme nom de fichier pour le pdf.
Par contre sujet dans le mail ne pose aucun problème.

Par ailleurs j'ai donc fait un peu le ménage dans les macros J'ai laissé sujet tel quel dans la macro SendMail.
Avec "FName" j'ai rajouté une variable "Fchemin" pour les PDF : Ce sont les seules choses que tu auras à modifier aux endroits indiqués en commentaire...
Sous cette dernière réserve, la version définitive :

12conso-mois-vg3.xlsm (127.55 Ko)

A+

Bonjour,

Je suis vraiment navré pour le retard, j'étais en plein semaine de partiels ; du coup, je viens de voir la dernière version définitive, c'est vrai que c'est beaucoup plus simple ainsi : enregistrer le PDF au moment de l'envoi.

Par rapport au nom du sujet, ça marche, merci du coup je l'ai réduis un peu.

Edit : Du coup je vais l'adapter par rapport à mon cas. Je te remercie encore infiniment, tu m'as montré pas mal de choses pour exploiter VBA, j'en ferais bon usage.

Edit2 : Finalement, j'ai comme un petit problème : il s'agit de lorsque je veux joindre le fichier en cours : apparemment il est vraiment conséquent. Je vais essayer d'y joindre du coup directement le fichier enregistrer à partir de la fonction PDF.

Rechercher des sujets similaires à "appel procedure userform"