IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

function sub et utilisation dans autre module [AC-2019]


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Coordinateur service technique
    Inscrit en
    Novembre 2021
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Coordinateur service technique

    Informations forums :
    Inscription : Novembre 2021
    Messages : 153
    Par défaut function sub et utilisation dans autre module
    Bonjour,

    alors voilà: un module1 qui contient la function suivante (pour permettre le choix du dossier de destination):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Public Function choisirdestination() As String
     
    Dim boitedialogue As FileDialog
    Dim Destination As String
     
    Set boitedialogue = Application.FileDialog(msoFileDialogFolderPicker)
    boitedialogue.AllowMultiSelect = False
    boitedialogue.Title = "choisir un dossier"
    boitedialogue.Show
    If boitedialogue.SelectedItems(1) = "" Then
        MsgBox "Selectionner un dossier"
        Else
        Destination = boitedialogue.SelectedItems(1)
    End If
     
    End Function
    Elle fonctionne; mais je veux l'utiliser dans un objet de classe (sur un état, j'ai un bouton export pour générer un pdf); le code suivant ne fonctionne pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Private Sub commExportPdf_Click()
     
    Dim NomFichier As String
    Dim Dmaj As String
    Dim Site As String
    Dim Cible As String
     
    Dmaj = Replace(DT_Maj, "/", "")
    Site = Replace([Nom Site], "/", "%")
    NomFichier = "Fiche Technique" & "_" & Site & "_" & Dmaj & ".pdf"
     
    Cible = choisirdestination()
     
    MsgBox Cible
    MsgBox NomFichier
    DoCmd.OutputTo acOutputReport, , acFormatPDF, Cible & "/" & NomFichier, True
     
    End Sub
    Je comprends que la Private Sub commExportPdf_Click(), exécute la function choisirdestination mais ne conserve pas la variable destination de cette function (MsgBox de ligne 14 reste vide). Remplacer Dim par Static? Qu'est-ce qui est approprié dans mon module1 ? Sub? Function? (pour moi il me faut une valeur, donc c'est function)...

    Auriez vous une piste?

  2. #2
    Membre éclairé
    Homme Profil pro
    Coordinateur service technique
    Inscrit en
    Novembre 2021
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Coordinateur service technique

    Informations forums :
    Inscription : Novembre 2021
    Messages : 153
    Par défaut
    Changement de la variable destination dans la function choisirdestination

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    Public Destination As String
    ...
    Public Function choisirdestination() As String
     
    Dim boitedialogue As FileDialog
     
    Set boitedialogue = Application.FileDialog(msoFileDialogFolderPicker)
    boitedialogue.AllowMultiSelect = False
    boitedialogue.Title = "choisir un dossier"
    boitedialogue.Show
    If boitedialogue.SelectedItems(1) = "" Then
        MsgBox "Selectionner un dossier"
        Else
        Destination = boitedialogue.SelectedItems(1)
    End If
     
    End Function
    puis ajustement de la privatesub commexportpdf_click() de la façon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Private Sub commExportPdf_Click()
     
    Dim NomFichier As String
    Dim Dmaj As String
    Dim Site As String
    Dim Cible As String
     
    Dmaj = Replace(DT_Maj, "/", "")
    Site = Replace([Nom Site], "/", "%")
    NomFichier = "Fiche Technique" & "_" & Site & "_" & Dmaj & ".pdf"
     
    Call choisirdestination
     
    MsgBox Destination
    MsgBox NomFichier
    DoCmd.OutputTo acOutputReport, , acFormatPDF, Destination & "/" & NomFichier, True
     
    End Sub
    Là ça fonctionne. Mais je crains qu'il y ait un risque poru la suite si j'utilise cette function dans d'autres sub... De plus, ne faudrait-il pas penser dès le début un module avec toutes mes variables public?

  3. #3
    Membre Expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 887
    Par défaut
    Bonjour gui_li_aume,

    Le post # 1 est la bonne manière de fonctionner, cependant il y a une erreur dans la fonction. En aucun temps dans votre fonction vous ne lui donner une valeur. Voici le code qui fonctionnera (ajout de la ligne 15):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Public Function choisirdestination() As String
     
    Dim boitedialogue As FileDialog
    Dim Destination As String
     
    Set boitedialogue = Application.FileDialog(msoFileDialogFolderPicker)
    boitedialogue.AllowMultiSelect = False
    boitedialogue.Title = "choisir un dossier"
    boitedialogue.Show
    If boitedialogue.SelectedItems(1) = "" Then
        MsgBox "Selectionner un dossier"
        Else
        Destination = boitedialogue.SelectedItems(1)
    End If
    choisirdestination = Destination
    End Function
    Bonne journée

  4. #4
    Membre Expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 887
    Par défaut
    Bonjour gui_li_aume,

    Complément d'information, les variables publiques sont a utilisées avec grande modération.

    Bonne journée

  5. #5
    Membre éclairé
    Homme Profil pro
    Coordinateur service technique
    Inscrit en
    Novembre 2021
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Coordinateur service technique

    Informations forums :
    Inscription : Novembre 2021
    Messages : 153
    Par défaut
    Merci Robert1957,

    Je me disais bien que mettre trop de variables publiques n'était pas très sain...

    Sur mon post#1, j'étais induit en erreur car avant mon end If j'avais testé msgbox destination. Je pige que au final ma variable destination n'existait plus au delà de end if

  6. #6
    Membre Expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 887
    Par défaut
    Bonjour gui_li_aume,

    En fait la variable existe à l'intérieur de la fonction. C'est la fonction qui est publique et qui retourne une valeur, dans votre cas une chaine de caractères (string) qui ne peut être "null".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Public Function choisirdestination() As String
     
    Dim boitedialogue As FileDialog
    Dim Destination As String  '*** à partir d'ici la variable existe***
     
    Set boitedialogue = Application.FileDialog(msoFileDialogFolderPicker)
    boitedialogue.AllowMultiSelect = False
    boitedialogue.Title = "choisir un dossier"
    boitedialogue.Show
    If boitedialogue.SelectedItems(1) = "" Then
        MsgBox "Selectionner un dossier"
        Else
        Destination = boitedialogue.SelectedItems(1)
    End If
     
    End Function  '***elle est détruite ici***
    Bonne journée

  7. #7
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 580
    Par défaut
    Bonjour,
    pourquoi utiliser une fonction qui retourne rien et une variable public alors que la fonction pourrait retourner la valeur utile!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Function choisirdestination() As Variant
    With Application.FileDialog(msoFileDialogFolderPicker)
        .AllowMultiSelect = False
        .Title = "choisir un dossier"
        .Show
       If CBool(.SelectedItems.Count) Then choisirdestination = .SelectedItems(1) Else choisirdestination = False
    End With
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Private Sub commExportPdf_Click()
    Dim NomFichier As String
    Dim Dmaj As String
    Dim Site As String
    Dim Cible As Variant
     
    Dmaj = Replace(DT_Maj, "/", "")
    Site = Replace([Nom Site], "/", "%")
    NomFichier = "Fiche Technique" & "_" & Site & "_" & Dmaj & ".pdf"
     
    Cible = choisirdestination()
     
    If TypeName(Cible) = "Boolean" Then
        MsgBox "Vous n'avez pas Selectionner un dossier"
    Else
        MsgBox NomFichier
        DoCmd.OutputTo acOutputReport, , acFormatPDF, Cible & "\" & NomFichier, True
    End If
    End Sub

  8. #8
    Membre éclairé
    Homme Profil pro
    Coordinateur service technique
    Inscrit en
    Novembre 2021
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Coordinateur service technique

    Informations forums :
    Inscription : Novembre 2021
    Messages : 153
    Par défaut
    Bonjour thumbdown,

    Parce que ta proposition fonctionne. Merci. Je n'avais pas testé la proposition de robert1957, mais elle me paraissait limpide. Donc c'est ton code qui marche. Merci à vous deux

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2013] Recuperer valeur TextBox Userform et utiliser dans second module
    Par Allanbzh dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/06/2017, 14h52
  2. une variable utilisée dans plusieurs modules
    Par kekule10 dans le forum Général Python
    Réponses: 0
    Dernier message: 22/07/2014, 01h01
  3. variable a utiliser dans plusieurs modules
    Par davenne.benoit dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/05/2010, 10h23
  4. récupération valeur variable dans autre module
    Par cchampion2fr dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 08/10/2008, 16h53
  5. Réponses: 3
    Dernier message: 17/04/2008, 15h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo