Automatisation de la récupération de données Excel

Incudine Messages postés 2 Date d'inscription mardi 17 mars 2009 Statut Membre Dernière intervention 18 mars 2009 - 18 mars 2009 à 08:33
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 - 18 mars 2009 à 20:28
Bonjour,

Je suis entièrement néophyte au niveau VBA, mais je pense que mon problème doit être très simple pour un habitué de ce langage.

Avec Excel 2003, je dois récupérer dans une feuille certaines données chiffrées qui proviennent d’autres fichiers Excel.
Les données récupérées seront mises au fur et à mesure dans une ligne de la feuille d’un fichier Récap.xls, exemple :
A1, B1, C1 & D1
puis
A2, B2, C2,& D2
etc…

L’affaire se corse quand on sait que ces données proviennent de fichiers de tailles variables. Je m’explique : soit le premier fichier (appelons-le Fich01.xls) où je dois récupérer les cellules A4, B5, C3 & E7 (qui vont alimenter A1, B1, C1 & D1 du fichier Récap.xls), puis les cellules A14, B15, C13 & E17 (qui vont alimenter A2, B2, C2 & D2 du fichier Récap.xls.

Le hic vient du fait que le fichier Fich01.xls peut comporter N séries de valeurs à récupérer et ce nombre N peut varier suivant les fichiers Fich**.xls.
Et il faut mettre dans Récap.xls, ligne par ligne, toutes les valeurs extraites des fichiers Fich**.xls qui ont, je le répète une nombre de valeurs à récupérer qui change.
Par contre, les valeurs à récupérer sont toujours positionnées (dans chaque fichier Fich**.xls) avec une séquence identique (10 lignes dans mon exemple ci-dessus).

Merci d’avance pour toute piste utile.





José

3 réponses

cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
18 mars 2009 à 12:47
Bonjour

Voici une approche possible :


<hr />
1. Dresser la liste des classeurs source dans un tableau (on omet les extensions .xls) :
    Dim classeurs As Variant
    Classeurs = Array("Fich01", "Fich02", ...)   ' dresse la liste des classeurs source

<hr />
2. Etablir la liste des cellules à lire dans chaque classeur source :
    Dim cellules As Variant
    Cellules = Array( _
        "A4", "B5", "C3", "E7", _
        "A14", "B15", "C13", "E17", _
        ...)                                                      ' dresse la liste des cellules source

<hr />
3. Recopier la liste des cellules de chaque classeur source dans le classeur Recap.xls
    Dim ptrClasseur As Integer
    Dim ptrCellule As Integer
    Dim numLigne As Integer
    Dim numColonne As Integer
    Dim w1 As Worksheet
    Dim w2 As Worksheet
    Set w1 = ActiveSheet

    Do                                                                  ' boucle sur la liste des classeurs source
        Workbooks.Open Classeurs(ptrClasseur) & ".xls"   ' ouvre le classeur source
        Set w2 = ActiveSheet
        ptrCellule = 0
        Do    ' boucle sur la liste des cellules à lire dans le classeur source
            If (ptrCellule Mod 4 = 0) Then                    ' lorsque 4 cellules ont été lues...
                numLigne = numLigne + 1                    ' écrit sur une nouvelle ligne du classeur Recap
                numColonne = 1
            End If
            w1.Cells(numLigne, numColonne).Value = _
                w2.Range(Cellules(ptrCellule)).Value    ' recopie la cellule du classeur source dans le classeur Recap
            ptrCellule = ptrCellule + 1
            numColonne = numColonne + 1
        Loop Until ptrCellule > Ubound(Cellules)
        ptrClasseur = ptrClasseur + 1
        ActiveWorkbook.Close False                 ' ferme le classeur source
    Loop Until ptrClasseur > Ubound(Classeurs)

<hr />
4. Rassembler ces trois blocs de code à l'intérieur d'une Sub d'un module du classeur Recap.xls, avec quelques aménagements ; ça donne quelque chose comme ça :

Option Explicit

Sub recapitulation()

    Dim classeurs As Variant
    Dim cellules As Variant
    Dim ptrClasseur As Integer
    Dim ptrCellule As Integer
    Dim numLigne As Integer
    Dim numColonne As Integer
    Dim w1 As Worksheet
    Dim w2 As Worksheet

' 1. Dresse la liste des classeurs source dans le tableau Classeurs

    Classeurs = Array("Fich01", "Fich02")          

' 2. Dresse la liste des cellules des classeurs source à transférer dans le classeur Recap.xls

    Cellules = Array( _
        "A4", "B5", "C3", "E7", _
        "A14", "B15", "C13", "E17" _
        ) 

' 3.  Recopie la liste des cellules du classeur source dans le classeur Recap.xls

    Application.ScreenUpdating = False
    Set w1 = ActiveSheet
    Do                                                                  ' boucle sur la liste des classeurs source
        Workbooks.Open Classeurs(ptrClasseur) & ".xls"   ' ouvre le classeur source
        Set w2 = ActiveSheet
        ptrCellule = 0
        Do    ' boucle sur la liste des cellules à lire dans le classeur source
            If (ptrCellule Mod 4 = 0) Then                    ' lorsque 4 cellules ont été lues...
                numLigne = numLigne + 1                    ' écrit sur une nouvelle ligne du classeur Recap
                numColonne = 1
            End If
            w1.Cells(numLigne, numColonne).Value = _
                w2.Range(Cellules(ptrCellule)).Value     ' recopie la cellule du classeur source dans le classeur Recap
            ptrCellule = ptrCellule + 1
            numColonne = numColonne + 1
        Loop Until ptrCellule > Ubound(Cellules)
        ptrClasseur = ptrClasseur + 1
        ActiveWorkbook.Close False                       ' ferme le classeur source
    Loop Until ptrClasseur > Ubound(Classeurs)
    Application.ScreenUpdating = True

End Sub

<hr />
5. Compile, puis exécute pas à pas la procédure recapitulation() pour mettre au point car, bien sûr, ce n'est qu'une approche.

Précision : dans le code ci-dessus, aucun chemin d'accès n'étant spécifié à l'ouverture des classeurs source, Excel cherche ces classeurs dans le même répertoire que Recap.xls.

<hr />
Recontacte-moi s'il y a un problème.

Amicalement
0
Incudine Messages postés 2 Date d'inscription mardi 17 mars 2009 Statut Membre Dernière intervention 18 mars 2009
18 mars 2009 à 15:43
Bonjour et merci de ta réponse hyper rapide.
J'ai esssayé d'adapter les codes à mon problème.
En vérité j'ai 9 cellules à récupérer chaque fois : "B5", "D5", "F12", "B6", "D6", "F6", "B3", "D3", "F3", puis "B19", "D19", "F26", "B20", "D20", "F20", "B17", "D17", "F17", etc...
(Les cellules sont toujours séparées de 14 lignes)
J'ai utilisé pour des essais deux fichiers sources VM1.xls et VM2.xls qui se trouvent dans le même dossier que mon fichier Recap2.xls

La transposition que j'ai faite est la suivante :

Option Explicit



Sub recapitulation()



    Dim classeurs As Variant
    Dim cellules As Variant
    Dim ptrClasseur As Integer
    Dim ptrCellule As Integer
    Dim numLigne As Integer
    Dim numColonne As Integer
    Dim w1 As Worksheet
    Dim w2 As Worksheet
   
    classeurs = Array("VM1", "VM2")
   
    cellules = Array("B5", "D5", "F12", "B6", "D6", "F6", "B3", "D3", "F3", "B19", "D19", "F26", "B20", "D20", "F20", "B17", "D17", "F17")
   
    Application.ScreenUpdating = False
    Set w1 = ActiveSheet
    Do                              'Boucle sur la liste des classeurs source
        Workbooks.Open classeurs(ptrClasseur) & ".xls"   ' ouvre le classeur source
        Set w2 = ActiveSheet
        ptrCellule = 0
        Do    ' boucle sur la liste des cellules à lire dans le classeur source
            If (ptrCellule Mod 9 = 0) Then         ' lorsque 9 cellules ont été lues...
                numLigne = numLigne + 1            ' écrit sur une nouvelle ligne du classeur Recap
                numColonne = 1
            End If
            w1.Cells(numLigne, numColonne).Value = w2.Range(cellules(ptrCellule)).Value 'recopie la cellule du classeur source dans le classeur Recap
            ptrCellule = ptrCellule + 1
            numColonne = numColonne + 1
        Loop Until ptrCellule > UBound(cellules)
        ptrClasseur = ptrClasseur + 1
        ActiveWorkbook.Close False                       ' ferme le classeur source
    Loop Until ptrClasseur > UBound(classeurs)
    Application.ScreenUpdating = True



End Sub



    




 



Private Sub Worksheet_SelectionChange(ByVal Target As Range)



End Sub


Cela fonctionne, mais comme résultat, je trouve seulement dans les cellules A1, B1, C1 & D1 les valeurs des 4 premières cellules lues de VM1.xls mais pas les 5 autres et pas d'autres séquences, ni de ce fichier ni du fichier VM2.xls.

Au delà de ce soucis, n'y a-t-il pas un moyen de dire au niveau :
cellules = Array("B5", "D5", "F12", "B6", "D6", "F6", "B3", "D3", "F3", "B19", "D19", "F26", "B20", "D20", "F20", "B17", "D17", "F17")
que l'on doit prendre les mêmes cellules chaque fois 14 lignes plus bas, car rien que dans le fichier VM1.xls il y a 135 séquences de cette série de 9 chiffres !

Merci de tes bons soins

Cordialement

José
0
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
18 mars 2009 à 20:28
Ta transposition me paraît excellente, et j'avoue que je ne vois pas très bien pourquoi seules les cellules A1:D1 sont transférées, soit 4 cellules. Il me semblerait plus logique qu'il n'y aucune cellule de transférée ou encore 9 cellules, mais pourquoi le transfert s'arrête après quatre cellules, c'est assez illogique...

Pourrais-tu exécuter le Sub normalement (sans utiliser le pas à pas) ?

Une fois résolu ce problème, on pourra simplifier le code comme tu le proposes, ça n'est pas compliqué.

A te lire
0
Rejoignez-nous