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

Macros et VBA Excel Discussion :

Connexion ADO à un classeur fermé


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mai 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2016
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Connexion ADO à un classeur fermé
    Bonjour,

    j'ai développé une petite macro qui permet de mettre à jour des lignes dans un classeur fermé. Ça fonctionne bien lorsque le classeur fermé est sur le réseau local.
    Par contre quand je veux mettre à jour un classeur fermé d'un réseau plus éloigné (dans une autre ville), cela ouvre le classeur. Comme le réseau n'est pas terrible, ça prend un temps fou et au bout d'un moment ça plante. J'ai remarqué aussi que lorsque le classeur fermé est sur le réseau local, il s'ouvre aussi lorsque deux personnes se connectent en même temps au classeur. Or normalement le classeur ne doit pas s'ouvrir car on établit juste une connexion...
    Y-a-t-il un moyen d’empêcher l'ouverture du classeur ?

    Voici mon code :

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    'Ecrit les données dans le fichier Source
    Sub ExporterDonnees(NomFichier As String, Feuille As String, Cellule As String, LigneEnCours As Variant, derLigne As Long)
     
    Dim rs As ADODB.Recordset
    Dim cnn As ADODB.Connection
    Dim ADOCommand As ADODB.Command
    Dim repertoire As String, i As Long, j As Long
    Dim Champ As Variant, Donnee As Range
    Dim indexChampRef As Long, IndexChampCle As Long
    Dim CouleurLigne As Long, Champ2() As Variant
     
    Dim RefOffre As String, VersionOffre As String, Cpt As Long
     
        Champ = Split(LISTE_DES_CHAMPS, ";", , vbBinaryCompare)
     
        ' Ouvre la connexion vers le fichier
        Set cnn = New ADODB.Connection
        With cnn
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                & NomFichier & ";" & "Extended Properties=""Excel 12.0;HDR=YES"";"
            .Open
        End With
     
        ' Ouvre un Recordset contenant les données de la feuille
        Set rs = New ADODB.Recordset
     
        rs.Open "SELECT * from `" & Feuille & Cellule & "`", cnn, adOpenKeyset, adLockOptimistic
     
        ' On se positionne sur le premier enregistrement
        rs.MoveFirst
     
        For i = 0 To UBound(LigneEnCours, 3)
            Cpt = 0
            RefOffre = LigneEnCours(1, 0, i): VersionOffre = LigneEnCours(2, 0, i)
            Do Until (rs.EOF Or rs.BOF) Or rs(indexChampRef) = RefOffre And rs(IndexChampCle) = VersionOffre
                rs.MoveNext
            Loop
            For j = 0 To UBound(Champ) Step 2
                Set Donnee = SearchString(Range("A14:T14"), Champ(j))
                If Not Donnee Is Nothing Then
                   ' Mise à jour de la ligne
                   If rs.Fields(Val(Champ(j + 1) - 1)).Name <> NOM_SemaineReporting And _
                      rs.Fields(Val(Champ(j + 1) - 1)).Name <> NOM_AvancementReporting Then
     
                      rs.Fields(Val(Champ(j + 1) - 1)).value = LigneEnCours(Cpt, 0, i)
                      rs.Update
                      Cpt = Cpt + 1
                   Else
                      Cpt = Cpt + 1
                   End If
                End If
            Next j
            rs.MoveFirst
        Next i
        rs.Update
     
        ' Ferme la connexion
        rs.Close
        cnn.Close
        Set cnn = Nothing
        Set rs = Nothing
     
    end sub()
    Merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    sens garantie!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Set cnn = New ADODB.Connection
        With cnn
            .CommandTimeout = 500
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                & NomFichier & ";" & "Extended Properties=""Excel 12.0;HDR=YES;Readonly=true"";"
            .Open
        End With

  3. #3
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    rdurupt, j'ai failli poster tout à l'heure en mettant justement le lien d'un message où tu présentait l'argument ReadOnly
    (http://www.developpez.net/forums/d15...e/#post8616478)

    mais avant de valider mon message, j'ai relu le contexte et vu qu'il souhaite ecrire dans le classeur, et pas aller chercher des données ... je me suis dis que c'était pas terrible de lui proposer une lecture seule

    à moins que ce soit encore une subtilité du ADO ? La lecture seule n'empêche pas l'écriture ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour Joe,
    Oui effectivement, il veux écrire!
    mais en générale je n'ai pas ce problème Config Excel?????

    mais même pour CommandTimeout je ne suis pas sur!

    je l’utile pour les connexions car les « toto » laisse leur appli ouverte pendant des heures et ensuite viennent pleurer!

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mai 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2016
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    merci à tous les deux pour vos réponses. J'ai testé avec "ReadOnly" mais malheureusement c'est pareil. Il ouvre systématiquement le classeur au lieu de seulement se connecter
    En plus il ne fait même plus la mise à jour des données ! Pourtant je n'ai rien changé au code et hier ça fonctionnait ! On dirait que le rs.Update est ignoré. Pourtant j'ai bien activé les librairies "Microsoft ActiveX Data Objects 2.8 Library" et "Microsoft ADO Ext. 2.8 for DDl and Security". J'en ai peut-être oublié une, ou il y en a une en trop ? (voir les librairies activées ci-dessous)
    Ou alors c'est parce que le fichier est sur un réseau ?
    J'ai l'impression que ADO n'est pas très fiable, je vais devoir trouver une autre solution, peut-être avec le partage du classeur. Mais ça met tellement de temps à ouvrir le fichier qu'il faut plus de 5 min pour une simple modif dans une ligne ! C'est pour ça que j'avais choisi ADO afin d'éviter d'ouvrir le classeur...

    Apparemment je viens de voir sur le forum grâce au lien de joe.levrai que je ne suis pas le seul à avoir ce problème... C'est peut-être un bug d'Excel

    Librairies actives :
    Nom : References.JPG
Affichages : 1724
Taille : 40,2 Ko

  6. #6
    Invité
    Invité(e)
    Par défaut
    tu n'as pas besoin de "Microsoft ActiveX Data Objects 2.8 Library" et "Microsoft ADO Ext. 2.8 for DDl and Security"

    Nom : Sans titre.png
Affichages : 1739
Taille : 35,2 Ko

  7. #7
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Dans le lien que j'ai fourni, ce n'est pas du tout le même contexte.

    Le demandeur voulait requêter dans un fichier fermé, et le fichier s'ouvrait SI un autre utilisateur l'avait déjà ouvert. Le fait de forcer le ReadOnly évitait simplement l'ouverture et l'affichage du fichier.

    toi c'est l'inverse, tu veux écrire une données. Donc forcément si tu utilises l'argument ReadOnly, l'update ne se fera pas ... ou se fera et le fichier ne conservera pas la modification (ce qui revient au même)

    as-tu essayé de travailler en LateBinding plutôt qu'une EarlyBinding ? Parfois une méthode pose soucis et pas l'autre

    D'ailleurs, question central de ton problème, ADO as-t-il la possibilité d'établir une connexion, tester si le fichier est en lecture seule, et agir en conséquence ? Vu que je ne fais que des import de données et jamais d'écriture, c'est un sujet auquel je n'ai jamais touché.

    Car de toute façon, si le fichier est ouvert ailleurs, comment voudrais-tu le modifier sans qu'il soit sous une fonctionnalité de partage (= avec donc une ouverture du fichier à faire)

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mai 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2016
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci pour vos réponses, c'est vrai que j'aurais dû mieux expliquer le contexte.

    En fait le fichier qui doit rester fermé est une sorte de base de données (Fichier Source) où plusieurs personnes viennent chercher et mettre à jours des données. Il est donc placé sur le réseau à un emplacement précis. Chaque utilisateur a un fichier Excel spécifique avec pour chacun des données différentes à aller récupérer dans le fichier source.
    Je pense en effet que si plusieurs personnes se connectent en même temps, Excel voit que le fichier est ouvert et il ouvre donc en lecture seule en premier plan. C'est surement ce qui se passe dans mon cas. Pensez-vous qu'il est possible avec ADO de gérer ces connections ? C'est à dire que tant que le fichier est utilisé par une autre personne, la macro attend que le fichier se libère pour se connecter ? J'ai essayé de le faire avec une gestion d'erreur mais ça fonctionne pas très bien... Je ne sais pas comment savoir si quelqu'un a déjà ouvert une connection ADO sur le fichier... Si on pouvait savoir ça, la gestion serait très simple...

  9. #9
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    C'est justement ce dont je parlais juste avant : existe-il une méthode ADO qui teste la lecture seule du fichier sans l'ouvrir ?


    A défaut, j'ai une idée.
    Tu pourrais réserver une cellule nommée (par exemple "EST_LIBRE"). Cette cellule est :

    - toujours vide
    - quand tu ouvres une connexion pour écrire, la première chose qui est faite est de vérifier si la cellule est vide ou non
    - la cellule est vide : ça écrit une valeur dans la cellule, enregistre le fichier, puis seulement après effectue l'écriture des données. A la fin du traitement, la cellule est de nouveau vidée
    - si la cellule est pas vide : tu sais que le fichier est utilisé, la requête s'arrête, ou tu met cette condition dans une boucle While/Wend (par exemple) qui attendra que la cellule soit vide


    par contre, c'est peu être super gourmand en termes de performances ?
    C'est juste une idée farfelue qui m'a traversé l'esprit

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mai 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2016
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci pour ton idée, je vais tester ça...
    Je pense qu'il faut effectivement chercher dans ce sens pour trouver le moyen de savoir s'il existe déjà une connexion ADO au fichier ou pas pour éviter les conflits...
    S'il y a d'autres idées, n'hésitez pas !

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mai 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2016
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    J'ai à peu près réussi à gérer les connections avec une gestion d'erreur qui relance la macro de connection au fichier source. Dès qu'il n'y a plus d'erreur, la connection se fait. Par contre j'ai un autre problème, la mise à jour du fichier source est aléatoire... A la première connection, la mise à jour se passe bien et si j'essaie 1 ou 2 minutes après il ne fait plus la mise à jour ! Et souvent Excel se ferme complètement ! Et pourtant il n'y a que moi qui me connecte au fichier source. J'ai l'impression que la connection ADO n'est pas très au point avec Excel Ce n'est pas très fiable, c'est dommage. Je vais être obligé d'ouvrir le fichier à chaque fois et ça va prendre un temps fou...

  12. #12
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    d’abord si ton fichier XLS est en mode partagé, le problème ne devrait pas ce produire!

    de plus de ce que j'ais compris dans ce cas de figure que je n'es jamais rencontré, le fichier est physiquement ouvert par un utilisateur!

    actuellement j'ai un fichier Excel protégé par un mot de passe, ouvert physiquement par un utilisateur qui entre des données, et quinze autre utilisateur qui l'utilise en Ado sens que celui ci s'affiche sur l'écran de clients (Xls 2013)!

    je n'est pas, à ce jour, trouvé de réponse à ton problème que je n'arrives as à reproduire!

  13. #13
    Nouveau Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mai 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2016
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par rdurupt Voir le message
    actuellement j'ai un fichier Excel protégé par un mot de passe, ouvert physiquement par un utilisateur qui entre des données, et quinze autre utilisateur qui l'utilise en Ado sens que celui ci s'affiche sur l'écran de clients (Xls 2013)!
    En fait c'est exactement cela que je voudrais faire ! Un utilisateur qui gère un fichier source et plein d'autres utilisateurs qui se connectent avec ADO au fichier pour le mettre à jour. Malheureusement je rencontre tous les problèmes que j'ai décris précédemment. Peut-être que dans Excel 2013 certains bugs ont été corrigés...
    Ou alors je m'y prend pas bien dans la structure de mon code... Ton fichier Excel ouvert physiquement et protégé par mot de passe est partagé ?
    Pourrais-tu, s'il te plaît, me montrer un exemple de tes routines qui se connectent et mettent à jour le fichier source ?
    Merci.

  14. #14
    Invité
    Invité(e)
    Par défaut
    oui il est partagé!

  15. #15
    Candidat au Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2
    Points : 3
    Points
    3
    Par défaut [XL-2010] Connexion ADO à un classeur protégé
    Hello à la communauté,
    J'ai eu beau chercher sur le forum, je n'ai pas trouvé de réponse à ce sujet.
    J'accède à un fichier Excel distant fermé via une connexion de type ADODB. Jusque là tout va bien.
    J'aimerais protéger ce classeur pour éviter tout accès intempestif par un utilisateur lambda, et pourvoir accéder à ce classeur depuis un autre : du coup cela nécessite une authentification (un mot de passe à minima), mais je ne trouve rien sur ADODB qui permette de déverouiller le classeur cible.
    Merci pour vos réponses

  16. #16
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par SilkyRoad
    il n'est pas possible d'utiliser un classeur protégé par un mot de passe.
    https://silkyroad.developpez.com/VBA/ClasseursFermes/

  17. #17
    Candidat au Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par dysorthographie Voir le message
    Merci silkyroad

Discussions similaires

  1. [XL-2013] VBA code ADO ADODB - classeurs fermés
    Par SylVBA dans le forum Excel
    Réponses: 1
    Dernier message: 30/09/2014, 12h29
  2. Réponses: 2
    Dernier message: 16/04/2014, 11h23
  3. [XL-2010] VBA/ADO : récupération de données dans un classeur fermé.
    Par Anto_NEX dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/07/2012, 09h07
  4. [XL-2002] Methode Find ADO classeur fermé
    Par Djo04 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 19/10/2010, 18h53
  5. [E-02]Réduire la taille / le poids d'un classeur (avec connexion ADO)
    Par peofofo dans le forum Macros et VBA Excel
    Réponses: 22
    Dernier message: 16/02/2009, 08h54

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