Automatisation de la récupération de données Excel
Incudine
Messages postés2Date d'inscriptionmardi 17 mars 2009StatutMembreDernière intervention18 mars 2009
-
18 mars 2009 à 08:33
cs_Orohena
Messages postés577Date d'inscriptionvendredi 26 septembre 2008StatutMembreDernière intervention20 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é
A voir également:
Automatisation de la récupération de données Excel
cs_Orohena
Messages postés577Date d'inscriptionvendredi 26 septembre 2008StatutMembreDernière intervention20 novembre 20104 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
' 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.
Incudine
Messages postés2Date d'inscriptionmardi 17 mars 2009StatutMembreDernière intervention18 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
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 !
cs_Orohena
Messages postés577Date d'inscriptionvendredi 26 septembre 2008StatutMembreDernière intervention20 novembre 20104 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é.