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 :

Impossible de lire une cellule dans un fichier fermé


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 78
    Points : 48
    Points
    48
    Par défaut Impossible de lire une cellule dans un fichier fermé
    Bonjour à tous,

    Je suis en train de m'arracher les derniers cheveux qui me restent.
    Dans mon programme, je génère des fichiers Excel en .html
    Pourquoi en html ? tout simplement parce qu'ils n'apparaissent pas dans la liste des fichiers récents Excel du bouton démarrer de windows. Et comme j'en fait pas mal, cette liste serait vite remplie de fichiers dont je n'ai aucune utilité en accès direct. Ce sont des fichiers liés au fichier principal dans lequel le code VBA tourne. Mais le problème n'est pas là.

    Ces fichiers comportent 4 onglets. Le premier est vide, le deuxième (Infos) comporte des données qui sont inscrites à la création du fichier, le troisième (Sessions) et le quatrième (SauvProp) sont des tableaux crées avec le fichier et alimentés à l'aide d'une connexion ADODB.
    Les 3 derniers onglets (Infos, Sessions et SauvProp) sont cachés en Veryhidden et les onglets sont aussi en mode cachés sous Excel.

    Pas de problème pour lire les données qui ont été inscrites sur la feuille 2 à la création du fichier.
    Je retrouve bien dans la cellule 'Lientemp' les données inscrites en A10 de la feuille Infos avec l'instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Lientemp] = "='" & CheminEchange & "\" & "[" & FicUtil & "]Infos'!$A$10"
    Pas de problème non plus pour écrire dans les tableaux à l'aide d'une connexion ADODB comme ceci pour la feuille Sessions :
    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
    Sub EnregUtil(NomFic As String, NomFeuil As String, Statut As String)
     
    Dim Source As ADODB.Connection
    Dim Sql As String
    Dim ConWeb As String
    Dim Droits As String
    Dim Donnees(5) As String
    Dim LongueurDonnees As Long
    Dim Compteur As Integer
    Dim Resultat As String
    On Error Resume Next
    Erase Donnees
     
    ......... quelques instructions de mise en forme des données sans intérêt pour la compréhension .............
     
    SetAttr NomFic, vbNormal 'ici je restitue le mode normal au fichier
    Set Source = New ADODB.Connection
    Source.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & NomFic & ";Extended Properties=""Excel 12.0;;HDR=YES;"""
    Sql = "INSERT INTO [" & NomFeuil & "$] " & _
    "VALUES(#" & Format(Date, "dd/mm/yyyy") & "#, #" & Time & "#, '" & Donnees(1) & "', '" & Donnees(2) & "', '" & _
        Donnees(3) & "', '" & Donnees(4) & "')"
    Source.Execute Sql
    Source.Close
    Set Source = Nothing
    SetAttr NomFic, vbHidden 'remise en mode caché
    End Sub
    En revanche, je n'arrive pas à lire ce que contient la cellule A2 de cette même feuille Sessions.
    Alors qu'il y a eut une date inscrite avec le code ci-dessus,

    le code suivant ne me renvoie rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Lientemp] = "='" & CheminEchange & "\" & "[" & FicUtil & "]Sessions'!$A$2"
    celui-ci non plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Lientemp] = ExecuteExcel4Macro("'" & CheminEchange & "\[" & FicUtil & "]Sessions'!R2C1")
    et une connexion ADODB comme celle-ci :
    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
     
    Code envoyé à Sub Extraction :
    Extraction CheminEchange & "\" & FicUtil, "Sessions$", "A2:A2"
     
    Sub Extraction(NomFic As String, NomFeuil As String, Cellule As String)
    Dim Source As ADODB.Connection
    Dim Rst As ADODB.Recordset
    Dim ADOCommand As ADODB.Command
     
    On Error Resume Next
     
    SetAttr NomFic, vbNormal
    Set Source = New ADODB.Connection
    Source.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & NomFic & ";Extended Properties=""Excel 12.0;;HDR=YES;"""
    Set ADOCommand = New ADODB.Command
    With ADOCommand
        .ActiveConnection = Source
        .CommandText = "SELECT * FROM [" & NomFeuil & Cellule & "]"
    End With
     
    Set Rst = New ADODB.Recordset
    Rst.Open ADOCommand, , adOpenKeyset, adLockOptimistic
     
    Set Rst = Source.Execute("[" & NomFeuil & Cellule & "]")
     
    [Lientemp].CopyFromRecordset Rst
     
    Rst.Close
    Source.Close
    Set Source = Nothing
    Set Rst = Nothing
    Set ADOCommand = Nothing
    SetAttr NomFic, vbHidden 'vbReadOnly abandonné car pb maj avec CS
     
    End Sub
    à deux comportements :
    - Sans l'instruction On Error Resume Next le code bloque à l'instruction Rst.Open .... avec l'erreur d'exécution -2147467259 (80004005) : "cette table contient des cellules hors de la plage de cellules définie dans cette feuille de calcul" si le tableau n'a pas encore eut d'enregistrement, (il y a seulement les titres des colonnes dans la feuille),
    - Et s'il y a une valeur date en A2, ce code ne renvoie rien.

    Ce que j'ai du mal à comprendre c'est pourquoi je peux lire sans problème le contenu d'une cellule qui a été remplie lors de la création du fichier et que je ne peux pas le faire sur une cellule d'un tableau rempli classeur fermé à l'aide d'ADODB. Excepté que la première est un texte et la seconde une date, qu'est-ce qui différencie ces cellules du point de vue de leur lecture ?

    En fait, cette feuille enregistre les sessions de l'utilisateur avec une date et une heure. Je cherche l'absence de valeur en A2 pour réaliser des instructions d'accueil des nouveaux utilisateurs. Pour le moment, comme la valeur renvoyée est nulle, j'accueille les utilisateurs à chacune de leur session !

    Merci d'avance à ceux qui pourront m'aider.

    Michel

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Cellule="A2"
    CommandText = "SELECT * FROM [" & NomFeuil & "$" & Cellule  ":" & Cellule & "]"

  3. #3
    Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 78
    Points : 48
    Points
    48
    Par défaut
    Bonjour rdurupt. Merci pour ta réponse.

    A moins qu'il y ait un truc que je ne pige pas, je ne vois pas de différence avec mon code.

    Avec l'instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Extraction CheminEchange & "\" & FicUtil, "Sessions$", "A2:A2"
    je renvoie les variables vers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sub Extraction(NomFic As String, NomFeuil As String, Cellule As String)
    j'ajoute bien le signe $ à la fin du nom de la feuille, et la cellule est aussi nommée "A2:A2", ce qui au final donne le même résultat au niveau du CommandText que ce que tu proposes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .CommandText = "SELECT * FROM [" & NomFeuil & Cellule & "]"
    Quand je fais du pas à pas, CommandText m'indique bien SELECT*FROM [Sessions$A2:A2]

    Mais en faisant des essais pour te répondre, j'ai découvert l'origine de mon problème. Il y avait une erreur dans ma connexion ADODB.
    Mon code était le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Source.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & NomFic & ";Extended Properties=""Excel 12.0;;HDR=YES;"""
    En modifiant YES par NO comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Source.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & NomFic & ";Extended Properties=""Excel 12.0;;HDR=NO;"""
    je récupère bien la valeur de la cellule A2 dans ma cellule [Lientemp].

    J'avoue ne pas comprendre pourquoi car ma table comporte bien une ligne d'en-tête. Cette ligne est à indiquer pour l'écriture (elle l'est par défaut si on omet le HDR), mais il faut impérativement la mettre à NO pour la lecture. Comprend qui peut.

    L'essentiel c'est que ça marche.

    Problème résolu donc, bien qu'il y ait des gros points d'interrogation, et notamment pourquoi les instructions classiques dans mon premier message ne me renvoient rien.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    là tu as bien un ligne d'entête!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT*FROM [Sessions$A1:A2]
    imaginons que ton entête s'appel TOTO!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT TOTO FROM [Sessions$] where TOTO='Moi';

  5. #5
    Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 78
    Points : 48
    Points
    48
    Par défaut
    Intéressant de savoir qu'on pouvait remplacer l'* par le nom de la colonne, mais j'ai pas bien compris ce que tu voulais démontrer et quelle était l'impact sur mon code ci-dessus.

    Est-ce que tu veux dire que si je mets le paramètre HDR=Yes et cellule à A1:A2 je pourrais récupérer la valeur en A2 ?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Est-ce que tu veux dire que si je mets le paramètre HDR=Yes et cellule à A1:A2 je pourrais récupérer la valeur en A2 ?
    pour définir HDR=Yes il est impératif d'avoir au moins deux cellules un sur l'autre et que la première soit le titre.

    Il faut également savoir qu'avec HDR=no les colonnes ont un titre par défaut [F1],[F2] etc...

    En résumé si ta requête pointe sur A2:A2 il ne peut être question. De HDR=Yes !


    Est-ce que tu veux dire que si je mets le paramètre HDR=Yes et cellule à A1:A2 je pourrais récupérer la valeur en A2 ?
    oui
    SELECT TOTO FROM [Sessions$A1:A2]pour reprendre précédant!
    Bien sur ça ça marche SELECT * FROM [Sessions$A1:A2]

  7. #7
    Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 78
    Points : 48
    Points
    48
    Par défaut
    OK merci rdurupt pour ces explications. Je comprends maintenant pourquoi mon HDR=Yes avec une seule cellule d'adressage ne pouvait pas fonctionner.

    Mais bon, pour la clarté de mon code et puisque je ne cherche qu'à avoir la cellule A2, je vais garder HDR=NO et A2:A2.

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

Discussions similaires

  1. [Débutant] Lire une cellule dans un fichier excel
    Par Annihil dans le forum C#
    Réponses: 1
    Dernier message: 15/11/2011, 08h32
  2. Lire une cellule dans un autre fichier
    Par jurgh dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/09/2009, 18h22
  3. lire une cellule dans une DBGrid
    Par flo74 dans le forum Bases de données
    Réponses: 10
    Dernier message: 30/01/2006, 09h52
  4. [VBA] Copier une plage de cellules dans un fichier fermé
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 25/01/2006, 17h52
  5. Sauvegarder/Lire une classe dans un fichier
    Par Rodrigue dans le forum C++
    Réponses: 10
    Dernier message: 10/09/2005, 15h12

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