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

Requêtes et SQL. Discussion :

[Requete] Export vers Excel depuis Access


Sujet :

Requêtes et SQL.

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut [Requete] Export vers Excel depuis Access
    Bonjour à tous,

    Je vous explique mon problème :

    Je développe sous access une base de données destinée à récupérer des données statistiques depuis un serveur puis à les exporter sous excel.
    A partir d'un formulaire, l'utilisateur sélectionne des critères (qui correspondent à des requêtes) et clique sur un bouton "export vers Excel".
    J'utilise la commande Domcmd.TransferSpreadsheet qui renvoi la requête dans un fichiers excel : Stats.xls
    Toutes mes requêtes vont dans ce fichier excel.
    Tout marche très bien sauf dans un cas :
    si l'utilisateur ouvre le fichier Stats.xls et lance sous access un nouvel export, une erreur arrête la macro.
    La solution que j'ai trouvé serait de tester si le classeur Stats.xls est ouvert et alors de stopper la macro. C'est là que j'ai besoin de votre aide.

    Merci par avance

  2. #2
    seb92400
    Invité(e)
    Par défaut
    Pourquoi ne programme tu pas ton code en vab ? Ca te permettrait de gérer les erreurs... (les macros ne les gèrent pas, à ma connaissance...)

    Si erreur n° xxxx (qui correpopnd à classeur ouvert) alors effetuer action yyyy (qui correspond à l'arrêt de la procédure)

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    J'utilise bien du code, c'est juste que je m'exprime mal ...

    Pour ta solution, la difficulté c'est que la commande TranfertSpeadsheet créée au départ un object excel.application puis renvoi le message d'erreur parce que le transfert ne peut s'effectuer.

    Donc même si j'arrête le code après l'apparition de l'erreur, il y aura l'application excel qui va rester ouverte.

    Quand je vais dans gestionnaire de programmes j'ai deux applications Excel :
    - une créée par Stats.xls à l'ouverture
    - l'autre par TransferSpreadsheet

    Du coup impossible après d'ouvrir un autre classeur excel !

    Il faut donc que je test avant d'exécuter le code si le classeur stats.xls est ouvert ou non.

  4. #4
    Membre chevronné
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Points : 2 178
    Points
    2 178
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Sub ExportExcel()
     On Error GoTo erreur
     DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "NomTable", "e:\stat.xls", True
     Exit Sub
    erreur:
     If Err = 3010 Then MsgBox ("Le fichier est occupé" & vbCrLf & "Veuillez réessayer plus tard")
    End Sub

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Salut helas, merci pour ta réponse. J'ai inséré ton code mais ca n'a pas pu résoudre mon problème.

    Le message s'affiche bien après l'erreur 3010. Je ferme donc Stats.xls, j'essaie de l'ouvrir impossible...... Je regarde dans le gestionnaire des tâches dans les processus EXCEL.EXE est présent alors qu'aucun fichier excel n'est ouvert !

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour Gylles_

    A toutes fins utiles, une procédure que j'utilise pour ouvrir un fichier Excel s'il n'est pas ouvert ou pour y accéder s'il est déjà ouvert :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    Option Compare Database
    Public Cn As ADODB.Connection
    ' Déclare les routines d'API nécessaires:
    Declare Function FindWindow Lib "user32" Alias _
    "FindWindowA" (ByVal lpClassName As String, _
    ByVal lpWindowName As Long) As Long
     
    Declare Function SendMessage Lib "user32" Alias _
    "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _
    ByVal wParam As Long, _
    ByVal lParam As Long) As Long
     
    Sub Demarre_Excel()
    Dim MyXL As Object
    Dim ExcelWasNotRunning As Boolean
     
     
    ' Test pour déterminer si une copie de Microsoft Excel
    ' est déjà en exécution.
    On Error Resume Next
    Set MyXL = GetObject(, "Excel.Application")
     
    If Err.Number <> 0 Then
    ExcelWasNotRunning = True
    Call DetectExcel
    ' Définit la variable objet faisant référence au fichier à ouvrir.
    Set MyXL = GetObject("C:\xxxx\zzzzzzz.XLS")
    fichouv = 1
     
    MyXL.Application.Visible = True
    MyXL.Parent.Windows(1).Visible = True
    GoTo Suite
    End If
     
    MyXL.Application.WindowState = vbMaximizedFocus
    'MyXL.Visible = True
    'MyXL.Parent.Windows(1).Visible = True
    Set MyXL = Nothing ' Libère la référence à l'application
    ' et à la feuille de calcul.
    End Sub
     
    Sub DetectExcel()
     
    Const WM_USER = 1024
    Dim hWnd As Long
    hWnd = FindWindow("XLMAIN", 0)
    If hWnd = 0 Then
    Exit Sub
    Else
    SendMessage hWnd, WM_USER + 18, 0, 0
    End If
    End Sub
    Amicalement
    Dernière modification par loufab ; 17/03/2007 à 13h52. Motif: Les balises de Code ne sont pas FACULTATIVES !!

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Désolé de n'avoir pas répondu plus tôt, j'étais en déplacement professionnel cette semaine.

    Pour revenir sur ton post, Getobject me permet de savoir si Excel est utilisé ou pas. Par contre je n'ai pas tout compris dans ton code, comment accéder au fichier excel ?

  8. #8
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    C'est que tu gardes une instance d'Excel ouverte dans ton code que nous n'avons pas pu voir.

    Ce qui nous amène à répondre au hazard.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Voici le code que j'utilise : (grâce à la FAQ et à helas, merci au passage)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private sub commande50_click
    Dim strchemin as string
    on error Goto classeurouvert
    strchemin = CurrentProject.path
    strchemin = strchemin + "\StatsFrs.xls"
     
    DoCmd.TransferSpreadSheet acExport, acSpreadsheetTypeExcel9,"CA",strchemin,True
     
    Exit sub
    classeurouvert:
    if Err = 3010 then Msgbox "Le classeur StatsFrs doit être fermé pour pouvoir exporter les données"
     
    End sub
    J'ai essayé de mettre : après classeurouvert:
    mais au lieu de quitter excel il m'a créer une nouvelle application.

  10. #10
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Je viens de refaire le tour et tu n'as pas d'instance d'Excel ouverte, puisque tu n'ouvre pas Excel.

    Mais si le fichier est ouvert, il est normal que tu reçoive un message d'erreur.

    Une des solutions possible, c'est de travailler avec une frontale et une dorsale et de sauver ton fichier sur le disque local.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Je suis débutant donc j'ai pas tout compris sur la "frontale" et "dorsale". Par contre le fichier est bien sauvegardé en local.

    La solution que j'ai pensé serait de tester si excel est actif (via GetObject) si oui alors de fermer le fichier StatsFrs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim MyXL As Object
     
    ' Test pour déterminer si Excel est déjà en exécution.
     
    Set MyXL = GetObject(, "Excel.Application")
     
    If Err.Number = 0 Then
    Excel.Workbooks("STATSFRS.XLS").close savechanges:=false
     
    else
    end if
    (J'ai utilisé l'aide de VBA)
    Message d'erreur Erreur d'exécution '9' l'indice n'appartient pas à la sélection
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Excel.Workbooks("STATSFRS.XLS").close savechanges:=false

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Je suis un peu bloqué sur mon projet. J'arrive à fermer un classeur mais que si je l'ai ouvert auparavant par VBA. En revanche je n'arrive pas à fermer ou détecter le classeur s'il est déjà ouvert, avez vous une idée ?

    merci de votre aide

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Ca y est j'ai résolu mon problème ! Avant de faire l'export je supprime le fichier StatsFrs, s'il y a un message d'erreur c'est qu'il est ouvert le tour est joué !

    Je met le code final pour ceux qui pourrait en avoir besoin :

    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
    Private sub commande50_click
    Dim strchemin as string
    on error Goto classeurouvert
    strchemin = CurrentProject.path
    strchemin = strchemin + "\StatsFrs.xls"
     
    kill strchemin
     
    DoCmd.TransferSpreadSheet acExport, acSpreadsheetTypeExcel9,"CA",strchemin,True
     
    Exit sub
    classeurouvert:
    Msgbox "Le classeur StatsFrs doit être fermé pour pouvoir exporter les données"
     
    End sub
    Merci à ceux qui m'ont aidé

  14. #14
    Candidat au Club
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Novembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Novembre 2011
    Messages : 4
    Points : 4
    Points
    4
    Par défaut export vers excel : trop de champs definis
    J'utilise le code suivant
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, maRequete, monFichierXLS, True
    qui marche 1 fois

    La 2eme fois si des champs sont ajoutés j'ai le message "trop de champs definis"
    En fait access crée une plage limitée la 1ere
    Je dois supprimer cette plage dans xl pour reimporter de nouveau!

    Merci de vos tuyaux

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

Discussions similaires

  1. Export vers excel depuis JSF avec netbeans
    Par Evenmor dans le forum JSF
    Réponses: 11
    Dernier message: 29/05/2008, 21h28
  2. Requete en access exporter vers excel
    Par Kalvin_20 dans le forum VBA Access
    Réponses: 3
    Dernier message: 15/05/2008, 13h51
  3. Export sur deux feuilles vers excell depuis access.
    Par schwinny dans le forum VBA Access
    Réponses: 3
    Dernier message: 25/03/2008, 17h27
  4. Image exportée vers Word depuis un report access
    Par thierry0409 dans le forum Access
    Réponses: 3
    Dernier message: 21/11/2005, 10h47
  5. Exporter des données d'un requete SQL vers excel (csv)
    Par PrinceMaster77 dans le forum ASP
    Réponses: 9
    Dernier message: 08/10/2005, 22h28

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