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 :

importer les données d'un fichier Excel Protégé


Sujet :

Access

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 14
    Points : 6
    Points
    6
    Par défaut importer les données d'un fichier Excel Protégé
    Bonjour le forum,
    Un de mes tables utilise les données d'un fichier Excel (un code Vba se déclenche à l'ouverture de la base et vas chercher les données dans Excel)

    ce fichier Excel est protégé par un mot de passe (feuille et classeur), je doit pour cela lancer un code VBA Excel depuis ACCESS pour désactiver la protection. jusque là !!!! c'est bon
    MAis malgré une instruction : Excel.application.quit
    Excel reste actif dans les processus.

    Existe il une commande comme "DoCmd.TransferSpreadsheet acImport, 8, , , , qui contourne les protections.?

    A noter également que la feuille qui contient les données est masquée !!

    Merci d'avance pour votre aide !!

    ARFY

  2. #2
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 14
    Points : 6
    Points
    6
    Par défaut Processus Excel actif
    Bonjour à tous,
    tout bien réfléchis, le probleme est que Excel ne se ferme pas correctement et reste actif dans les Processus Windows !!!
    J'ai rappatrier le code VBA Excel sous Access pour déprotéger le classeur, je pense que l'ensemble n'est pas très clean et ouvre des processus Excel (à l'insu de mon plein gré )

    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
    Private Sub Form_Open(Cancel As Integer)
     
    'lancement de la macro pour oter les protections du fichier "Clients.xls"
            Dim appexcel As Excel.Application
            Dim wbexcel As Excel.Workbook
            Dim MDP As String
            Set appexcel = CreateObject("excel.application")
            appexcel.Visible = False
            Set wbexcel = appexcel.Workbooks.Open("c:\clients\clients.xls")
            MDP = "motdepasse"
     
          appexcel.ActiveWorkbook.Unprotect MDP    'retire la protection du classeur
     
       'affichage de la feuille "Données"
        appexcel.Sheets("Données").Visible = True
        appexcel.Sheets("Données").Select
        appexcel.ActiveSheet.Unprotect MDP     'retire la protection de la feuille "Données"
     
       appexcel.Application.DisplayAlerts = False
     
    'importation des données du fichier "CLients.xls"
    DoCmd.TransferSpreadsheet acImport, 8, "DonnéesXL", "C:\Clients\Clients.xls", True, "Données!"
     
      appexcel.ActiveSheet.Protect MDP                ' protège la feuille "Données"
      appexcel.ActiveWindow.SelectedSheets.Visible = False        ' masque la feuille "Données"
        appexcel.ActiveWorkbook.Protect MDP   ' protège le classeur
        wbexcel.Save
        appexcel.ActiveWorkbook.Close
        appexcel.Application.DisplayAlerts = True
        appexcel.Quit    'ferme Excel
     
      Set appexcel = Nothing
      Set wbexcel = Nothing
     
     End Sub
    Avec çà Excel reste toujours actif, même après avoir quitter ACCESS !!!
    Si une âme charitable pouvais se pencher sur mon problème

    Merci d'avance

  3. #3
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 017
    Points : 24 548
    Points
    24 548
    Par défaut
    Bonjour,

    Ton code comporte un gros problème de conception. D'une part tu fais tout pour faire de l'automation (très correctement d'ailleur) et au lieu de continuer sur cette lancé tu fais un docmd.transfer !

    Soit du fait l'un soit tu fais l'autre mais pas les 2 ensembles.

    Pour l'automation il existe un méthode qui s'appelle Recordsetcopy et qui remplace très avantageusement le docmd.transfer

    Regarde mon tuto sur la recherche dans le 3ème chapitre. Le code est directement exploitable, bien que je ne pense pas que tu en ai réellement besoin.

    Cordialement,

    Bonne continuation en omettant pas les balises de code.

  4. #4
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Bonjour Loufab, et le Forum
    Merci de t'être penché sur mon problème.
    Tes Tutos sont une véritable mine d'or , mais étant novice, j'avoue ne pas avoir tout compris sur l'automation et sur "Recordsetcopy".
    Qu'est-ce que le "Recordsetcopy" fait exactement, par rapport au "docmd.transfer". ?
    Je vais me pencher sur le sujet, en espérant que çà fermera correctement Excel !!
    Je te tiens au courant, et promis je mettrais des balises de codes
    Arfy

  5. #5
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 017
    Points : 24 548
    Points
    24 548
    Par défaut
    Le transfer ouvre une instance d'Excel (dans une boite noire) et y copie le contenu de ta table/requete.

    Le recordsetcopy utilise l'instance Excel crée par l'utilisateur pour transférer le contenu d'un recordset.

    Dans le premier cas ACCESS controle tout avec plus ou moins de succés, dans la deuxième c'est ton code qui controle.

    Sacrée différence !

  6. #6
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Merci Loufab pour tes conseils,

    J'ai essayé une importation par le "recordset" directement dans les différentes tables : çà marche pas mal
    Mais c'est beaucoup plus lent ..... et le processus Excel est toujours actif

    Cordialement

    ARFY

  7. #7
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 017
    Points : 24 548
    Points
    24 548
    Par défaut
    Je vais jeter un coup d'oeil à ton code dés que j'ai un moment pour voir ou le problème se situe.

    à bientôt.

  8. #8
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Salut à tous,

    je viens de faire un essai sur un fichier de 2 lignes (sans protection) et sur une table hyper simple avec la commande DoCmd.TransferSpreadsheet
    et j'ai le meme problème d'Excel actif, le code exact est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.TransferSpreadsheet acImport, 8, "Table1", "C:\essai.xls", True, "Feuil1!"
    A chaque fois que je lance la commande j'ai 1 Excel de plus !!!!
    Y a t'il un probleme de version : j'ai Excel 2000 (9) et Access 2002(10) ???

    A bientot

  9. #9
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Bonjour le Forum et Joyeux Noël

    ERRATUM sur le dernier message : si le fichier Excel n'est pas protégé, il n'y a aucun soucis.
    C'est la commande qui va ouvrir Excel pour enlever la protection qui (je pense!!) est à l'origine de mon soucis.
    MAis je doit garder le fichier Excel protégé (contre les "touches à tout").

    Je creuse ...... a suivre.

    A bientot , et Bonnes Fêtes

    ARFY

  10. #10
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 017
    Points : 24 548
    Points
    24 548
    Par défaut
    Bonjour,

    Voici la commande qui ne va pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       'appexcel.ActiveWorkbook.Close
    à remplacer par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        appexcel.Workbooks.Close
    Si vraiment Excel ne veut pas se fermer. Je te posterai un code pour tuer la tache.

  11. #11
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Salut Loufab et le Forum,

    Merci Loufab pour ta réponse.
    Effectivement, il y avait un problème important de conception : si j'ai bien tout compris la commande "DoCmd.TransferSpreadsheet acImport" n'ouvre pas le fichier Excel, et dans mon code le fichier est déjà ouvert à ce moment là.
    j'ai donc placé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    appexcel.Workbooks.Close
    avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.TransferSpreadsheet acImport
    et là çà marche nickel !!!!
    Merci encore et à bientôt (eh oui, je vais pouvoir commencer les requetes )

    ARFY

  12. #12
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 017
    Points : 24 548
    Points
    24 548
    Par défaut
    C'est le contraire.

    Le docmd.transfer ouvre un fichier et exporte/importe des données puis le referme.

    L'automation permet de piloter l'application et entre autre de pouvoir faire de l'import/export.

    Dans ton code voici ce que tu fais en résumé :
    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
    ' ici tu prépares les variable pour l'automation Excel
            Dim appexcel As Excel.Application
            Dim wbexcel As Excel.Workbook
            Dim MDP As String
    ' tu ouvre l'application excel.exe
            Set appexcel = CreateObject("excel.application")
            appexcel.Visible = False
    ' tu charges le fichier client.xls
            Set wbexcel = appexcel.Workbooks.Open("c:\clients\clients.xls")
            MDP = "motdepasse"
    ' tu déprotège le classeur   
          appexcel.ActiveWorkbook.Unprotect MDP    
    ' tu affiches la feuille "Données"
        appexcel.Sheets("Données").Visible = True
        appexcel.Sheets("Données").Select
        appexcel.ActiveSheet.Unprotect MDP     'retire la protection de la feuille "Données"
    ' tu supprimes les messages   
       appexcel.Application.DisplayAlerts = False
         
    'ici tu ouvre une nouvelle instance d'excel et du fichier Client.xls et tu
    ' y copie les données, puis tu refermes (tout ça en une ligne de commande)   DoCmd.TransferSpreadsheet acImport, 8, "DonnéesXL", "C:\Clients\Clients.xls", True, "Données!"
    
    ' tu reprotège la feuille   
      appexcel.ActiveSheet.Protect MDP                ' protège la feuille "Données"
      appexcel.ActiveWindow.SelectedSheets.Visible = False        ' masque la feuille "Données"
        appexcel.ActiveWorkbook.Protect MDP   ' protège le classeur
    ' tu sauves
        wbexcel.Save
    ' tu refermes la feuille
        appexcel.ActiveWorkbook.Close
        appexcel.Application.DisplayAlerts = True
    ' tu quitte excel
        appexcel.Quit    'ferme Excel
       
      Set appexcel = Nothing
      Set wbexcel = Nothing
    Conclusion à aucun moment tu n'utilises les objets excel ouvert.

    Cordialement,

  13. #13
    Membre habitué
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2016
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2016
    Messages : 136
    Points : 149
    Points
    149
    Par défaut
    Pour les sessions Excel qui restent ouvertes, j'ai eu le problème plusieurs fois !

    Il faut vraiment être d'une rigueur de dingue sur la création des objets (application, workbook, sheets) puis sur leurs "close" et "Set .. = Nothing" respectifs.

    Personnellement, j'encadre tout avec des With xlApp / With xlBook / With xlSheet / End With / set xlSheet = Nothing / End With / set xlBook = Nothing / End With / Set xlApp = Nothing

    MAIS si vous avez le malheur d'utiliser un objet (ex. ActiveWorkBook) sans le "." devant, cela va marcher, mais cela va AUSSI provoquer une "autovivification" d'un père anonyme ... que vous ne pourrez donc plus détruire et qui empêchera la fermeture de la session Excel !

    Si quelqu'un connaît un moyen de demander un mode objet "strict", sans autovivification, je prends !

    A+

  14. #14
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 770
    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 770
    Points : 14 812
    Points
    14 812
    Par défaut
    bonsoir olra72,
    Set xlApp = Nothing oui, si le type d'objet est en Early binding (assignation anticipée du type d'objet Dim xlApp As Excel.Application)
    non, en Late binding (assignation tardive du type d'objet Dim xlApp As Object): là, il est impératif d'utiliser xlApp.Quit

  15. #15
    Membre habitué
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2016
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2016
    Messages : 136
    Points : 149
    Points
    149
    Par défaut
    Ok pour la différence entre le Early et le Late ... mais quid d'un usage de xlApp.ActiveWorkbook versus ActiveWorkbook tout court, dans les deux cas ?

  16. #16
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 770
    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 770
    Points : 14 812
    Points
    14 812
    Par défaut
    pas testé ...

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/08/2010, 21h48
  2. importer les données d'un fichier excel vers oracle 10g
    Par sarita_ima dans le forum Documents
    Réponses: 2
    Dernier message: 04/09/2009, 13h52
  3. Réponses: 170
    Dernier message: 12/08/2009, 08h56
  4. Importer les données d'un fichier excel dans une table
    Par dams95190 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 07/12/2007, 10h35
  5. Réponses: 3
    Dernier message: 27/07/2007, 13h06

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