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 :

Problème pour lire dans un classeur fermé [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 228
    Par défaut Problème pour lire dans un classeur fermé
    Bonjour à tous.

    Afin de de pouvoir utiliser des données présentes dans un fichier Excel fermé, j'utilise la méthode suivante qui fonctionne à merveille : Lire et écrire dans les classeurs Excel fermés

    Je remarque cependant un problème : Lorsque le classeur fermé (me servant de base de données) est ouvert par un autre utilisateur, et que j’exécute le code cité plus haut, le classeur "bdd" s'ouvre automatiquement. Il suffit que je demande à mon collègue de fermer le classeur en question pour que la méthode s’exécute normalement, classeur fermé donc.

    Savez-vous pourquoi ?

    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 CommandButton1_Click()
    Dim cnx As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim Feuille As String
    Set rst = New ADODB.Recordset
    Set cnx = New ADODB.Connection
    Feuille = "Planning"
     
    cnx.Provider = "Microsoft.Jet.Oledb.4.0"
    cnx.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\SERVEUR\Planning.xlsm;Extended Properties=""Excel 12.0;HDR=No;"""
    cnx.Open
     
    Set rst = New ADODB.Recordset
    Set rst = cnx.Execute("SELECT * FROM [" & Feuille & "$B2:B2" & "]")
    ThisWorkbook.Sheets("Planning").Range("B1").CopyFromRecordset rst
    rst.Close
     
    cnx.Close
    End Sub
    Merci d'avance et très bonne journée

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Bonjour,

    J'ai remarqué la même chose.
    Je ne pense pas qu'il y ait une parade quelconque sauf de vérifier si le fichier est en lecture seule auparavant, mais comme tu lis dans ce fichier, ça ne change pas grand chose sauf de le fermer à la fin du processus.

    En passant, dans ton code, la 1e ligne ne sert à rien puisque tu déclares un autre Provider sur la ligne suivante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cnx.Provider = "Microsoft.Jet.Oledb.4.0"
    cnx.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\SERVEUR\Planning.xlsm;Extended Properties=""Excel 12.0;HDR=No;"""

  3. #3
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    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 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    en spécifiant la lecture seule peut-être ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HDR=No;IMEX=1;Readonly=False
    IMEX = 1 n'est pas nécessaire je pense, mais si tu as des données numériques et non numérique je le préconise

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 228
    Par défaut
    Bonjour parmi, merci pour le conseil, une ligne en moins !
    Dans mon cas, la méthode s’exécute automatiquement toutes les 30 minutes. L'ouverture inopiné du classeur est plutôt embêtante.

    Bonjour joe.levrai, j'avais essayé d'ajouter cette commande mais sans succès...
    Mes données sont numériques, mais j'ai tout de même ajouté IMEX.


    Je suis vraiment embêté avec ce petit problème, sinon, comme l'a suggéré parmi, il faudrait testé si le fichier est déjà ouvert avant d’exécuter le code, mais comment ?

    EDIT :
    J'ai pu trouver une fonction permettant de contrôler l'état d'ouverture d'un fichier :

    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
    Public Etat As Boolean
    Function IsFileOpen(filename As String)
    Dim filenum As Integer, errnum As Integer
    On Error Resume Next   ' Turn error checking off.
    filenum = FreeFile()   ' Get a free file number.
    Open filename For Input Lock Read As #filenum ' Attempt to open the file and lock it.
    Close filenum          ' Close the file.
    errnum = Err           ' Save the error number that occurred.
    On Error GoTo 0        ' Turn error checking back on.
    Select Case errnum ' Check to see which error occurred.
      ' No error occurred.
      ' File is NOT already open by another user.
      Case 0
        IsFileOpen = False
      ' Error number for "Permission Denied."
      ' File is already opened by another user.
      Case 70
        IsFileOpen = True
      ' Another error occurred, file is being queried.
      Case Else
        Error errnum
    End Select
    End Function
    Cette fonction dépanne et me permet de faire ce que je souhaite, je vais tout de même laisser ouvert le sujet quelques heures histoire de savoir si quelqu'un aurait trouvé une autre solution.

    Merci.

  5. #5
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    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 169
    Billets dans le blog
    5
    Par défaut
    Voici une fonction qui renvoie TRUE si le fichier est ouvert par quelqu'un d'autres, et FALSE si ce n'est pas le cas

    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
    Sub eeetr()
        MsgBox FichierDejaOuvert("CheminCompletDeMonFichier/NomDuClasseur.Extension")
    End Sub
     
    Function FichierDejaOuvert(CheminFichier As String) As Boolean
    Dim NumFichier As Long, NumErreur As Long
        On Error Resume Next
            NumFichier = FreeFile()
            Open CheminFichier For Input Lock Read As #NumFichier
            Close NumFichier
            NumErreur = Err.Number
        On Error GoTo 0
     
        Select Case NumErreur
            Case 0
                FichierDejaOuvert = False
            Case 70
                FichierDejaOuvert = True
        End Select
    End Function
    L'idée, c'est de l'ouvrir en provoquant une erreur si tu ne peux pas prendre la main/verrouiller le fichier
    ensuite, on vérifie s'il y a eu ou non une erreur pour avoir la réponse souhaitée

    Je n'ai pas inclus la gestion d'éventuelles autres erreurs comme l'erreur 75 (erreur accès au fichier) au 53 (fichier introuvable) par exemple


    EDIT : peux-tu nous indiquer le site internet où tu as trouvé cette source ?

    En effet, ma fonction je ne l'ai pas inventée, je l'ai récupérée y'a plusieurs années et je l'avais juste retouchée à ma sauce.
    Or, je n'avais pas noté l'auteur ... et j'ai à coeur de citer les auteurs originels dans mes procédures, ça comblera cette lacune enfin

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 228
    Par défaut
    Il s'agit d'un code microsoft que j'ai trouvé.

    Merci du coup de main

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

Discussions similaires

  1. [XL-2003] Rechercher, lire dans un classeur fermé.
    Par Nicoyong dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 06/02/2015, 11h09
  2. Lire dans des classeurs fermés Excel2007 xlsx et xlsm
    Par SilkyRoad dans le forum Contribuez
    Réponses: 0
    Dernier message: 26/08/2007, 15h59
  3. Problème pour lire dans un tableau ...
    Par themis dans le forum Oracle
    Réponses: 1
    Dernier message: 15/02/2006, 18h04

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