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 :

Récupération de données dans des classeurs Excel fermés


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Automatisme, robotique et info indus
    Inscrit en
    Avril 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Automatisme, robotique et info indus
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 35
    Points : 15
    Points
    15
    Par défaut Récupération de données dans des classeurs Excel fermés
    Bonjour la communauté,

    Dans le cadre d'un projet, je dois réaliser des bilans sur des données contenues dans des classeurs Excel (format xslm) et ranger le tout dans un classeur excel "bilan".
    Ma question porte sur la façon d'accéder aux données contenues dans les fichiers que je dois traiter, sachant que ça passera par du code VBA et que le nombre de fichiers à analyser sera assez conséquent (environ 500).
    Les ouvrir un par un risque de prendre un certain temps, même si j'ai déjà mis en place un système pour ne prendre en compte que les nouveaux fichiers ou les fichiers mis à jour, lors d'une mise à jour du bilan.

    Je sais qu'il est possible de traiter des fichiers Excel comme des bases de données, et donc d'utiliser des objets ADO pour récupérer des données, mais dans mon cas, ça me semble bien compliqué, voir impossible, vu que les fichiers que je dois analyser ne semblent pas structurés de façon adéquate, les données étant disséminées un peu partout dans le classeur.
    Alors est ce quand même possible d'utiliser cette méthode? A ce jour, je n'ai pas vraiment trouvé d'infos .

    Existe-t-il d'autres méthodes explorables pour traiter ces fichiers, en dehors de la méthode classique (i.e. les ouvrir un par un).

    Merci.

  2. #2
    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,

    tu as été voir ce tuto ?
    http://silkyroad.developpez.com/VBA/ClasseursFermes/

    au début, des méthodes sans ADO sont proposées

    maintenant, si ta structure n'est pas "propre" et harmonisée ... comment ta procédure (ou une formule) va savoir quoi chercher ?
    Ca se trouve, c'est plus pratique d'ouvrir les fichier, de faire une recherche (Méthode FIND()) pour rappatrier les résultats.
    En figeant le rafraichissement d'écran c'est transparent, et traiter 500 fichiers ne va pas demander des heures non plus

  3. #3
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 250
    Points
    34 250
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  4. #4
    Membre à l'essai
    Homme Profil pro
    Automatisme, robotique et info indus
    Inscrit en
    Avril 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Automatisme, robotique et info indus
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 35
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Jean-Philippe André Voir le message
    Nickel, ça répond à ma problématique.
    Du coup, j'ai testé vite fait ce bout de 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
    Sub LireCellule_ClasseurFerme()
    Dim Source As Object, Rst As Object
    Dim Feuille As String, Cellule As String, CheminFichier As String, NomFichier As String
     
    CheminFichier = "X:\Telesurveillance\2- Heures Agents 2017\02-CADRES\"
    NomFichier = "2017-DUPONT Pierre.xlsm"
    Feuille = "RECAP. ANNUEL" & "$"
    Cellule = "P25:P25"
     
    Set Source = CreateObject("ADODB.Connection")
    Source.Open "Provider = Microsoft.ACE.OLEDB.12.0;data source=" & CheminFichier & NomFichier & ";extended properties=""Excel 12.0;HDR=NO"""
    MsgBox (CheminFichier & NomFichier)
    Set Rst = Source.Execute("SELECT * FROM [" & Feuille & Cellule & "]")
    MsgBox (Feuille & Cellule)
    ActiveCell.CopyFromRecordset Rst
     
    End Sub
    Et ça fonctionne!
    Je récupère les valeurs de cellules dont j'ai besoin, maintenant il n'y a plus qu'à mettre tout ça en forme.
    Je posterai mon code final milieu de semaine prochaine, pour voir si cela est cohérent et sans erreurs.

    En attendant, un grand merci à vous.

  5. #5
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Bonjour,
    Il y a tout de même plus simple qu'ADO pour récupérer des valeurs de cellules de classeurs fermés...
    On peut, pour cela, utiliser les "plages nommées"...

    Supposons, pour la forme :
    Ton classeur "récap" comporte deux feuilles vierges au départ : Feuil1 et Feuil2.
    tu veux y rapatrier les données contenues dans :
    - le classeur : X:\Telesurveillance\2- Heures Agents 2017\02-CADRES\2017-DUPONT Pierre.xlsm
    - la feuille : RECAP. ANNUEL
    - la plage de cellules : $A$1:$F$10

    Ce code devrait fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub ImporterDonneesSansOuvrir()     
    Dim Chemin As String, Fichier As String, Feuille As String   
    Chemin = "X:\Telesurveillance\2- Heures Agents 2017\02-CADRES\"     
    Fichier = "2017-DUPONT Pierre.xlsm"
    Feuille = "RECAP. ANNUEL"   
    ThisWorkbook.Names.Add "plage", RefersTo:="='" & Chemin & "[" & Fichier & "]" & Feuille & "'!$A$1:$F$10"     
        With Sheets("Feuil2")     
            .[A1:F10] = "=plage"     
            .[A1:F10].Copy     
            Sheets("Feuil1").Range("A1").PasteSpecial xlPasteValues  'A ADAPTER le collage et le Range de "réception" qui peut être dynamique...   
            .[A1:F10].Clear     
        End With     
    End Sub
    Avec boucle sur tous les fichiers ".xlsm" d'un répertoire et "importation" de chacune des cellules A1 :
    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
    Option Explicit   
     
    Sub ImporterA1()   
    Dim Chemin As String, fichier As String, Feuille As String
     
        Chemin = "X:\Telesurveillance\2- Heures Agents 2017\02-CADRES\"   
        fichier = Dir(Chemin & "*.xlsm")    ' A ADAPTER l'extension des fichiers...
        Feuille = "RECAP. ANNUEL"   
        Do While Len(fichier) > 0   
            If fichier <> ThisWorkbook.Name Then   'ici on écarte la possibilité de traiter le classeur "récap"
                ThisWorkbook.Names.Add "Plage", RefersTo:="='" & Chemin & "[" & fichier & "]" & Feuille & "'!$A$1"   
                With Sheets("Feuil2")   
                    .[A1] = "=Plage"   
                    .[A1].Copy   
                    Sheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues    
                    .[A1].Clear   
                End With   
            End If   
            fichier = Dir()   
        Loop  
    End Sub
    Cordialement,
    Franck

  6. #6
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Bonjour tout le monde,

    Pijaku, j'étais tombé sur ta méthode sur un site, le lien dans le code indiquant ton pseudo,
    Je t'ai mis
    Sinon autre méthode, voir ici :
    https://www.developpez.net/forums/d5...a/#post3278272
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  7. #7
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Salut Ryu !
    Pijaku, j'étais tombé sur ta méthode sur un site
    Oui, mais ce "tuto" que tu as vu date d'une autre époque...
    Celle ou je me servais encore de l'enregistreur de macro! (chose qu'il m'arrive encore de faire...)

    Sinon, dans ton lien tu renvoies vers un code de macro "ExecuteExcel4Macro". Je crois que le but est exactement le même que mon code donné ci-dessus.
    Mais, à vrai dire, je n'aime pas trop utiliser "ExecuteExcel4Macro", certainement du à mon manque de connaissances...

    Si kiki passe dans le coin, peut être pourra-t-il nous éclairer...
    Cordialement,
    Franck

  8. #8
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Pourtant il me semble que le code que j'ai vu ressemble presque trait pour trait au 1er code : "ImporterDonneesSansOuvrir"

    Pourtant le code de kiki sur ExecuteExcel4Macro en lien, je le trouve super explicite
    il faut juste reprendre les variables de son code et leurs données des valeurs :
    Dossier => le chemin
    Classeur => le nom du classeur
    Feuille => le nom de la Feuille
    Cellule => la Cellule visée (D5, ou autres) - dans le code l'adresse de la cellule se met automatiquement en R1C1

    si j'ai bien compris ExecuteExcel4Macro marche avec R1C1

    Si je dis une bêtise kiki fais le moi savoir ;-)
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  9. #9
    Membre à l'essai
    Homme Profil pro
    Automatisme, robotique et info indus
    Inscrit en
    Avril 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Automatisme, robotique et info indus
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 35
    Points : 15
    Points
    15
    Par défaut
    Merci pijaku pour l'autre solution.
    Pour l'instant je teste tout ce qui m'a été proposé, afin de voir ce qui va être le plus facile à mettre en oeuvre, et j'en profite aussi pour "m'autoformer".
    Et j'ai une petite question au sujet des Recordset.

    Si j'enchaîne les Recorset comme dans le code qui suit:

    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
    Set mSource = CreateObject("ADODB.Connection")
    mSource.Open "Provider = Microsoft.ACE.OLEDB.12.0;data source=" & mFolderPath & "\" & mFileName & ";extended properties=""Excel 12.0;HDR=NO"""
     
    Set mRst = mSource.Execute("SELECT * FROM [" & cYearAddress & "]")
    mWeek = mRst(0).Value
     
    Set mRst = mSource.Execute("SELECT * FROM [" & cWeekAddress & "]")
    mYear = mRst(0).Value
     
    Set mRst = mSource.Execute("SELECT * FROM [" & cEmployeeAddress & "]")
    mEmployee = mRst(0).Value
     
    For i = 0 To UBound(mImputation)
        Set mRst = mSource.Execute("SELECT * FROM [" & mtblImputationAddress(i) & "]")
        mImputation(i).strProjectNumber = mRst(eImputation.idProjectNumber).Value
        mImputation(i).strProjectElement = mRst(eImputation.idProjectElement).Value
        mImputation(i).strTaskCode = mRst(eImputation.idTaskCode).Value
        mImputation(i).strHoursCount = mRst(eImputation.idHoursCount).Value
    Next i
     
    mRst.Close
    mSource.Close
    Est il nécessaire de fermer ou d'effacer le recordset entre chaque requête, ou la simple fermeture à la fin suffit elle?
    Ce code fonctionne actuellement, c'est donc plus pour être sûr que j'ai écrit les choses de façon correcte que je pose cette question.

  10. #10
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    Est il nécessaire de fermer ou d'effacer le recordset entre chaque requête, ou la simple fermeture à la fin suffit elle?
    Losqu'une variable objet est unique (tu es dans ce cas), sa destruction (pas "effacement") détruit l'objet et libère ipso-facto la mémoire de cet objet

    EDIT : voilà comment on détruit un objet (un recordset en est un) :
    http://warin.developpez.com/access/dao/?page=partie_5
    rubrique 5.4.4
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Automatisme, robotique et info indus
    Inscrit en
    Avril 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Automatisme, robotique et info indus
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 35
    Points : 15
    Points
    15
    Par défaut
    Merci unparia.

    Donc voilà ce à quoi j'arriverai en utilisant un ADO. J'ai intégré le tout dans un module de classe, afin de gagner en flexibilité. Il y a encore des petites choses à voir, comme la gestion des erreurs et ajouter des commentaires (très important çà!).
    J'aimerai avoir vos avis sur ce bout de code, car je ne suis pas expert en VBA, et ce projet est justement pour moi un moyen d'améliorer mes connaissances.

    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    Option Explicit
     
    Dim mFolderPath As String
    Dim mFileName As String
    Dim mSource As Object, mRst As Object
    Dim mtblImputationAddress
    Dim mWeek, mYear, mEmployee, mProjectNumber As String
    Dim mImputation(0 To 16) As tImputationData
    Dim mDataLocation As tDataLocation
    Const cYearAddress As String = "A$U3:U3"
    Const cWeekAddress As String = "A$X3:X3"
    Const cEmployeeAddress As String = "A$Q4:Q4"
    Const cImputationAddress As String = "A$T14:X14;A$T18:X18;A$T22:X22;A$T26:X26;A$T30:X30;A$T34:X34;A$T38:X38;A$T42:X42;A$T46:X46;A$T50:X50;A$T54:X54;A$T58:X58;A$T62:X62;A$T66:X66;A$T70:X70;A$T74:X74;A$T78:X78;"
    Enum eImputation
        idProjectNumber = 0
        idProjectElement = 1
        idTaskCode = 2
        idHoursCount = 4
    End Enum
     
     
    Public Property Let FolderPath(strFolderPath As String)
        mFolderPath = strFolderPath
    End Property
     
    Public Property Let FileName(strFileName As String)
        mFileName = strFileName
    End Property
     
    Public Property Get Week() As Integer
        Week = Val(mWeek)
    End Property
     
    Public Property Get Year() As Integer
        Year = Val(mYear)
    End Property
    Public Property Get Employee() As String
        Employee = mEmployee
    End Property
     
    Public Property Get Imputation(Idx As Integer) As tImputationData
        If Idx >= 0 And Idx <= 16 Then
            Imputation = mImputation(Idx)
        End If
    End Property
     
    Public Function Execute() As Long
     
    FileReader mFolderPath, mFileName
     
    End Function
    Private Sub FileReader(strFolderPath As String, strFileName As String)
     
    Dim i As Integer
     
    mtblImputationAddress = Split(cImputationAddress, ";")
     
    Set mSource = CreateObject("ADODB.Connection")
    mSource.Open "Provider = Microsoft.ACE.OLEDB.12.0;data source=" & mFolderPath & "\" & mFileName & ";extended properties=""Excel 12.0;HDR=NO"""
     
    Set mRst = mSource.Execute("SELECT * FROM [" & cYearAddress & "]")
    mWeek = mRst(0).Value
     
    Set mRst = mSource.Execute("SELECT * FROM [" & cWeekAddress & "]")
    mYear = mRst(0).Value
     
    Set mRst = mSource.Execute("SELECT * FROM [" & cEmployeeAddress & "]")
    mEmployee = mRst(0).Value
     
    For i = 0 To UBound(mImputation)
        Set mRst = mSource.Execute("SELECT * FROM [" & mtblImputationAddress(i) & "]")
        mImputation(i).strProjectNumber = mRst(eImputation.idProjectNumber).Value
        mImputation(i).strProjectElement = mRst(eImputation.idProjectElement).Value
        mImputation(i).strTaskCode = mRst(eImputation.idTaskCode).Value
        mImputation(i).strHoursCount = mRst(eImputation.idHoursCount).Value
    Next i
     
    mRst.Close
    mSource.Close
     
    Set mRst = Nothing
    Set mSource = Nothing
     
    End Sub

  12. #12
    Invité
    Invité(e)
    Par défaut
    Il y a encore des petites choses à voir, comme la gestion des erreurs et ajouter des commentaires (très important çà!).
    on qualifié les données via des propriétés dans ton module le classe par exemple! et on gère le incohérences mais de préférences pas de On Error!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Property Let MaPropriete(value As String)
    'if value=pas bon then  '['] Commentaire
    End Property
    Public Property Get MaPropriete()
    MaPropriete="pas bon"
    End Property
    Public Property Let FolderPath(strFolderPath As String)
    If Dir(strFolderPath, vbDirectory) = "" Then MsgBox "Err" 'En commentaire Getion des erreurs!
        mFolderPath = strFolderPath
    End Property
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dim MyClasse as New Classe1
    MyClasse.MaPropriete="toto"
    J'aimerai avoir vos avis sur ce bout de code, car je ne suis pas expert en VBA, et ce projet est justement pour moi un moyen d'améliorer mes connaissances.
    difficile à dire vue que j'ai rien compris!
    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
    Private Sub test()
    With CreateObject("ADODB.Connection")
        .Open "Provider = Microsoft.ACE.OLEDB.12.0;data source=" & mFolderPath & "\" & mFileName & ";extended properties=""Excel 12.0;HDR=NO"""
        mWeek = .Execute("SELECT * FROM [" & cYearAddress & "]").fields(0)
        mYear = .Execute("SELECT * FROM [" & cWeekAddress & "]").fields(0)
        mEmployee = .Execute("SELECT * FROM [" & cEmployeeAddress & "]").fields(0)
        For i = 0 To UBound(mImputation)
            With .Execute("SELECT * FROM [" & mtblImputationAddress(i) & "]")
                      mImputation(i).strProjectNumber = .fields(eImputation.idProjectNumber).value
                      mImputation(i).strProjectElement = .fields(eImputation.idProjectElement).value
                      mImputation(i).strTaskCode = .fields(eImputation.idTaskCode).value
                      mImputation(i).strHoursCount = .fields(eImputation.idHoursCount).value
           End With
        Next i
        .Close
    End With
    End Sub
    Et j'ai une petite question au sujet des Recordset.
    quel Recordset? maintenant il n'y en a plus!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim mtblImputationAddress : mtblImputationAddress = Array("A$T14:X14", "A$T18:X18", "A$T22:X22", "A$T26:X26", "A$T30:X30", "A$T34:X34", "A$T38:X38", "A$T42:X42", "A$T46:X46", "A$T50:X50", "A$T54:X54", "A$T58:X58", "A$T62:X62", "A$T66:X66", "A$T70:X70", "A$T74:X74", "A$T78:X78")
    intéresses toi a la méthode initialised et terminate de ta classe, tu pourrais automatiser l'ouverture et la fermeture de ta connections et initialiser tes variable typées.
    Dernière modification par Invité ; 25/03/2017 à 11h21.

  13. #13
    Membre à l'essai
    Homme Profil pro
    Automatisme, robotique et info indus
    Inscrit en
    Avril 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Automatisme, robotique et info indus
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 35
    Points : 15
    Points
    15
    Par défaut
    Merci dysorthographie.

    Citation Envoyé par dysorthographie Voir le message
    on qualifié les données via des propriétés dans ton module le classe par exemple! et on gère le incohérences mais de préférences pas de On Error!
    Pourquoi ne préconises tu pas l'utilisation de On Error?

  14. #14
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    l'utilisation du on error doit être exceptionnel, indépendant de ma volonté! je veux écrire dans un répertoire réseau, je vérifie la présence du répertoire et au moment de l'écriture j'ai une coupure réseau! qui puis-je?
    le on error n'est pas là pour palier aux faiblesses du code et en plus de savoir le maîtriser!


    pourtant j'ai bien tous vérifié!

    les Property ( et tu les utilises) sont des variables qui te permettent également de mettre du code à l’intérieur! utilises les pour qualifier tes données!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    PublicPropertyGet Imputation(Idx AsInteger)As tImputationData
        If Idx >= 0 And Idx <= 16 Then
            Imputation = mImputation(Idx)
        End If EndProperty
    Public Property Let FolderPath(strFolderPath As String)
    If Dir(strFolderPath, vbDirectory) = "" Then MsgBox "Err" 'En commentaire Getion des erreurs! je véifi la presence du épertoire
        mFolderPath = strFolderPath
    End Property
    le on error inhibe les message d'erreurs, mieux vaut une ereur qu'in résultat incohérent.

    autant de Property c'est autant de moyen de qualifier tes données!

  15. #15
    Membre à l'essai
    Homme Profil pro
    Automatisme, robotique et info indus
    Inscrit en
    Avril 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Automatisme, robotique et info indus
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 35
    Points : 15
    Points
    15
    Par défaut
    Petite question à propos de ce bout de 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
    Private Sub test()
    With CreateObject("ADODB.Connection")
        .Open "Provider = Microsoft.ACE.OLEDB.12.0;data source=" & mFolderPath & "\" & mFileName & ";extended properties=""Excel 12.0;HDR=NO"""
        mWeek = .Execute("SELECT * FROM [" & cYearAddress & "]").fields(0)
        mYear = .Execute("SELECT * FROM [" & cWeekAddress & "]").fields(0)
        mEmployee = .Execute("SELECT * FROM [" & cEmployeeAddress & "]").fields(0)
        For i = 0 To UBound(mImputation)
            With .Execute("SELECT * FROM [" & mtblImputationAddress(i) & "]")
                      mImputation(i).strProjectNumber = .fields(eImputation.idProjectNumber).value
                      mImputation(i).strProjectElement = .fields(eImputation.idProjectElement).value
                      mImputation(i).strTaskCode = .fields(eImputation.idTaskCode).value
                      mImputation(i).strHoursCount = .fields(eImputation.idHoursCount).value
           End With
        Next i
        .Close
    End With
    End Sub
    A quel moment y-a-t-il destruction de l'objet ADO, vu qu'il n'y a plus d'affectation objet = nothing?

  16. #16
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Bonjour, bonjour !

    Nothing est inutile car tout simplement il n'y a pas d'affectation ‼    End With clôturant donc le sujet

    Ainsi c'est plus rapide et économe de se passer de variable objet …
    Voilà, voilà !

    ___________________________________________________________________________________________________________
    Je suis Paris, London, Istanbul, Berlin, Nice, Bruxelles, Charlie, …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  17. #17
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    une instance n'est valide que dans sa porté! elle est donc détruit automatiquement à la fin de la portée!

    la porté d'une variable dans une sub est valide qu'entre le sub et le End Sub!

    la porté dans un with n'est valide qu'entre le with et le end with donc l'objet est détruit automatiquement à la fin de la porté du with!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    With CreateObject("ADODB.Connection") 'Création de l'instance
          Open "Provider = Microsoft.ACE.OLEDB.12.0;data source=" & mFolderPath & "\" & mFileName & ";extended properties=""Excel 12.0;HDR=NO""" 'Dans la porté de l'instance!
    End With 'Destruction automatique (implicite) de l'instance
    Dernière modification par Invité ; 27/03/2017 à 11h14.

  18. #18
    Membre à l'essai
    Homme Profil pro
    Automatisme, robotique et info indus
    Inscrit en
    Avril 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Automatisme, robotique et info indus
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 35
    Points : 15
    Points
    15
    Par défaut
    Merci, comme ça j'ai la confirmation de ce que je pensais.

    Et si j'ai bien compris, le code qui suit permet aussi de ne pas avoir à cocher la référence "Microsoft ActiveX Data Objects...", en utilisant du late binding, ce qui facilite l'utilisation de mon fichier sur différents postes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With CreateObject("ADODB.Connection") 'Création de l'instance
          Open "Provider = Microsoft.ACE.OLEDB.12.0;data source=" & mFolderPath & "\" & mFileName & ";extended properties=""Excel 12.0;HDR=NO""" 'Dans la porté de l'instance!
    End With 'Destruction de l'instance

  19. #19
    Invité
    Invité(e)
    Par défaut
    Et si j'ai bien compris, le code qui suit permet aussi de ne pas avoir à cocher la référence "Microsoft ActiveX Data Objects..."
    Oui exactement!
    Code et voila l'utilité d'un module de classe! : 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
    Private cn As Object
    Private Sub Class_Initialize()
    Set cn = CreateObject("ADODB.Connection")
    End Sub
    Private Sub Class_Terminate()
    If Cn.State <> 0 Then cn.Close
    Set cn = Nothing
    End Sub
    public Property Let FolderPath(strFolderPath As String)
    If Dir(strFolderPath, vbDirectory) = "" OR mFileName= "" Then MsgBox "Err" : Exit Property 'En commentaire Getion des erreurs! je véifi la presence du épertoire
    mFolderPath = strFolderPath
    Set cn = CreateObject("ADODB.Connection")
    cn.Open "Provider = Microsoft.ACE.OLEDB.12.0;data source=" & mFolderPath & "\" & mFileName & ";extended properties=""Excel 12.0;HDR=NO"""
    End Property
    Public Property Let FileName(strFileName As String)
        mFileName = strFileName
    If Dir(strFolderPath, vbDirectory) = "" OR mFileName= "" Then MsgBox "Err" : Exit Property 'En commentaire Getion des erreurs! je véifi la presence du épertoire
    Set cn = CreateObject("ADODB.Connection")
    cn.Open "Provider = Microsoft.ACE.OLEDB.12.0;data source=" & mFolderPath & "\" & mFileName & ";extended properties=""Excel 12.0;HDR=NO"""
    End Property
    Property Get mWeek()
    With cn.Execute("SELECT * FROM [" & cYearAddress & "]")
    If Not eof Then mWeek = .fields(0).Value Else mWeek = "Err"
    .Close
    End With
    End Property
    Property Get Imputation(ImputationAddress As String, eImputation As tImputationData) As tImputationData
    With cn.Execute("SELECT * FROM [" & ImputationAddress & "]")
    If Not .EOF Then
    mImputation.strProjectNumber = .fields(eImputation.idProjectNumber).Value
    mImputation.strProjectElement = .fields(eImputation.idProjectElement).Value
    mImputation.strTaskCode = .fields(eImputation.idTaskCode).Value
    mImputation.strHoursCount = .fields(eImputation.idHoursCount).Value
    End If
    .Close
    End With
    End Property
    Private Sub test()
    Debug.Print mWeek
    For i = 0 To UBound(mImputation)
    mImputation(i) = Imputation(mtblImputationAddress(i), eImputation)
    Next i
    End Sub
    pas besoin de On Error
    Dernière modification par Invité ; 27/03/2017 à 12h08.

  20. #20
    Membre à l'essai
    Homme Profil pro
    Automatisme, robotique et info indus
    Inscrit en
    Avril 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Automatisme, robotique et info indus
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 35
    Points : 15
    Points
    15
    Par défaut
    J'ai une question sur ton dernier code, pourquoi avoir mis 3 fois le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set cn = CreateObject("ADODB.Connection")
    Une première fois, dans l'évènement Initialize de la classe, puis dans les Property Let FolderPath et Property Let FolderName?
    Autant je comprends l'utilité dans l'évènement Initialise, puisque l'objet ADO est créé à l'initialisation de la classe et reste valable pour le reste du module, autant je ne comprend pas son utilité dans les Property Let.

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/06/2014, 17h05
  2. [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
  3. Récupérer données dans des classeurs fermés
    Par Mimosa777 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/05/2009, 20h40
  4. Réponses: 1
    Dernier message: 04/06/2006, 16h08
  5. problème récupération de données dans des fichiers .DAT
    Par indymontpellier dans le forum Bases de données
    Réponses: 4
    Dernier message: 13/04/2006, 07h54

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