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

Access Discussion :

Bloquer une exportation excel enregistrée si la requête est vide


Sujet :

Access

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 26
    Points : 18
    Points
    18
    Par défaut Bloquer une exportation excel enregistrée si la requête est vide
    Bonjour,

    Je n'ai pas trouvé le sujet sur le forum ; j'espère ne pas créer un doublon...

    J'ai créée une requête "MaRequête" que j'exporte en Excel via une macro VBA qui fait appel à une exportation enregistrée "ExporteMaRequête" par la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.RunSavedImportExport ("ExporteMaRequête")
    Ces macros et exportations enregistrées fonctionnent bien.

    Toutefois, il arrive que le croisement des données ne remontent rien (suite à un weekend par exemple, et c'est normal) et le fichier Excel est vide.

    Question :
    Connaitriez-vous un bout de code qui permet de lancer l'exportation enregistrée uniquement si la requête remonte des données ?

    Quelque chose du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if "MaRequête" <> 0 then
        DoCmd.RunSavedImportExport ("ExporteMaRequête")
    Else
    End if
    Précisions : "MaRequête" est une sous requête de "Requête0" ; elle comptabilise le nombre de résultat de "Requête0" et elle indique justement "0" quand il n'y a aucune donnée. Mais la macro VBA ne tient pas compte de mon code ' if "MaRequête" <> 0 then ' et continue d'exporter le fichier Excel avec ou sans données.... j'ai également testé avec ' if "MaRequête" is not null then ' en vain...

    Merci pour votre aide car là, je bloque...
    Cordialement.

  2. #2
    Expert éminent Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 274
    Points : 6 583
    Points
    6 583
    Par défaut
    Salut,
    En VBA on utilise entre autre un truc comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set rst = dbs.OpenRecordset(strSql, dbOpenDynaset)
    If rst.RecordCount = 0 Then Exit Sub

  3. #3
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 842
    Points : 14 946
    Points
    14 946
    Par défaut
    bonsoir,
    il y a aussi EOF qui renvoie Vrai lorsque le Recordset ne contient aucun enregistrement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Set rst = dbs.OpenRecordset(strSql, dbOpenDynaset)
    If rst.EOF then
       Exit Sub
    Else 
       '... code si il existe des enregistrements
    End if

  4. #4
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 398
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 398
    Points : 20 519
    Points
    20 519
    Par défaut
    attention si vous utilisez un recordset il faut faire un movefirst c'est conseillé.
    Mais tout le monde le sait ce truc

  5. #5
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 842
    Points : 14 946
    Points
    14 946
    Par défaut
    bonsoir,
    Citation Envoyé par Mat.M
    attention si vous utilisez un recordset il faut faire un movefirst c'est conseillé.
    conseillé par qui ?
    on utilise Movefirst éventuellement lorsque que l'on utilise un clone du recordset et qu'on veut le parcourir depuis le premier enregistrement mais quand c'est une instance que l'on vient de créer, c'est inutile.
    Movelast certainement, si on souhaite connaitre le nombre total d'enregistrements car il est à 1 par défaut si on ne le fait pas, mais aucun des 2 ne peut être exécuté si EOF est Vrai (aucun enregistrement en cours)

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    Bonjour

    Merci pour vos réponses mais je ne suis qu'un padawan qui n'a pas encore toutes les ficelles...
    et je ne comprends pas ce code...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set rst = dbs.OpenRecordset(strSql, dbOpenDynaset)
    If rst.EOF then
       Exit Sub
    A quoi correspond : rst ?
    et dbs.OpenRecordset(strSql, dbOpenDynaset ?

    A quel moment le code fait appel à la requête "MaRequête" ?
    J'ai oublié de préciser que dans cette base Access il y a plusieurs requêtes ayant toute une exportation enregistrée du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if "MaRequête1" <> 0 then
        DoCmd.RunSavedImportExport ("ExporteMaRequête1")
    Else
    End if
     
    if "MaRequête2" <> 0 then
        DoCmd.RunSavedImportExport ("ExporteMaRequête2")
    Else
    End if
     
    'etc.
    Et donc, à quel ce code exécute t-il : "ExporteMaRequête1" si elle n'est pas vide ?

    Merci pour votre aide,
    Cordialement.

  7. #7
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 842
    Points : 14 946
    Points
    14 946
    Par défaut
    bonjour,
    rst est une instance d'un objet Recordset ou jeu de données, cela peut être une table ou une requête
    dbs est une instance de l'objet Database que tu utilises
    avec l'instruction Set rst = ..., tu charges ta requête en mémoire dans un jeu de données (Recordset en anglais)
    EOF est la propriété du jeu de données qui indique qu'on est en fin de fichier (dernier enregistrement lu), ce qui arrive également quand on n'a pas d'enregistrement.
    EOF est un booléen (valeurs: True/False), donc, si EOF n'est pas faux (traduction à peu près de: If Not rst.EOF), il est donc vrai, on peut exporter la requête:
    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
    Dim rst as DAO.recordset
    dim dbs as DAO.Database
    Set dbs = Currentdb
     
    ' 1ère requête
    Set rst = dbs.OpenRecordset("MaRequête1")
    If not rst.EOF then DoCmd.RunSavedImportExport ("ExporteMaRequête1") 
     
    ' 2ème requête
    Set rst = dbs.OpenRecordset("MaRequête2")
    If not rst.EOF then DoCmd.RunSavedImportExport ("ExporteMaRequête2") 
     
    ' nième requête
    Set rst = dbs.OpenRecordset("MaRequêten")
    If not rst.EOF then DoCmd.RunSavedImportExport ("ExporteMaRequêten") 
     
    ' fermeture des instances créées
    rst.close
    dbs.close

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/03/2021, 17h02
  2. Bloquer une plage excel
    Par Boulangeriegestion dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/04/2017, 20h57
  3. Réponses: 0
    Dernier message: 11/04/2017, 13h27
  4. Réponses: 3
    Dernier message: 05/05/2008, 09h57
  5. [SQL] Déterminer si le résultat d'une requête est vide ou non
    Par khamett dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 18/01/2008, 21h53

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