Macro qui récupére des données de classeurs externes

lyly

XLDnaute Nouveau
Bonjour,

Je suis une newbie en VBA, mais j'ai tout de même essayé de réaliser un code.
Tout d'abord, pour présenter le contexte: je suis en stage, et doit réaliser un outil de gestions où toutes les données se trouvent dans différents classeurs excel dans un même dossier.
La macro que je dois réaliser doit donc aller chercher la même ligne d'information dans tous les classeurs du dossier puis les inscrire dans un tableau récapitulatif. Ceci, j'avais réussi à le faire.
Seulement, il y a un hic: les classeurs excels contiennent des données de "différente importance" c'est pour cela qu'il y a une case (toujours la même) dans les classeurs qui les classe en importance 1, 2 ou 3. Et c'est là que mon programme bug.
Car les projets d'importance 1 doivent être mis les uns à la suite des autres dans le tableau, de même pour les autres importances...
J'ai donc essayé de codé ceci avec des "case". Théoriquement, je pense que ça marche mais en pratique, le programme oublie des fichiers quand il fonctionne, il me manque donc des données à la fin...

Comme je ne m'y connais pas trop trop, je me demandais si vous ne pouviez pas m'aider à regarder si je n'ai pas fait une erreur de débutante ou s'il y avait une façon plus simple de faire...
Je vous en remercie d'avance. :)

Voici mon code:

Option Compare Binary


Public Sub Programme1()
Application.ScreenUpdating = False '<- inhibe la fonction de rafraichissement de l'affichage dans excel (evite le clignotement de l'écran) et augmente aisni la rapidité de la fonction...


donnee1 = 0 '<- initialisation de la variable de retour
donnee2 = 0
donnee3 = 0
Dim importance As Byte

chemin = "C:\Users\JQ1214\Desktop\base de données\" '<- initialisation de la variable chemin donnant l'accès au repertoire ou sont les fichiers XL
nom = Dir(chemin & "*.xlsx") '<- la fonction dir(*.xls) permet de trouver la 1ère occurrence de fichier xls et renvoie le nom du fichier s'il existe.


Do While nom <> "" '<- le do while permet de boucler tant qu'une occurrence de fichier xls est trouvée (quand il n'y en a plus, la fonction dir() renvoie "")
Set mon_fichier = Excel.Workbooks.Open(chemin & nom) '<- on ouvre l'occurrence trouvée ... ce fichier pointe sur une variable objet qui est "mon_fichier" (utile pour plus tard)
importance = mon_fichier.Sheets(1).Cells(7, 2) ' on définit la valeur de la variable importance


Select Case (importance)
Case Is = 1 ' si c'est de première importance
donnee1 = mon_fichier.Sheets(1).Range("B7:L7") '<- on recupère la valeur désirée
Excel.Workbooks("Outil plan de compte.xlsm").Sheets(2).Range("B8:L8") = donnee1 'on colle la valeur trouvée à un endroit précis
Excel.Workbooks("Outil plan de compte.xlsm").Sheets(2).Rows(7).EntireRow.Insert 'on insère une ligne au dessus de la valeur copiée

Case Is = 2 ' si c'est d'importance secondaire
donnee2 = mon_fichier.Sheets(1).Range("B7:L7") '<- on recupère la valeur désirée
Excel.Workbooks("Outil plan de compte.xlsm").Sheets(2).Range("B9:L9") = donnee2 'on colle la valeur trouvée à un endroit précis
Excel.Workbooks("Outil plan de compte.xlsm").Sheets(2).Rows(8).EntireRow.Insert 'on insère une ligne au dessus de la valeur copiée


Case Is = 3 ' si c'est d'importance moindre
donnee3 = mon_fichier.Sheets(1).Range("B7:L7") '<- on recupère la valeur désirée
Excel.Workbooks("Outil plan de compte.xlsm").Sheets(2).Range("B10:L10") = donnee3 'on colle la valeur trouvée à un endroit précis
Excel.Workbooks("Outil plan de compte.xlsm").Sheets(2).Rows(9).EntireRow.Insert 'on insère une ligne au dessus de la valeur copiée

Case Else
MsgBox "remplissez la case importance dans le fichier"

End Select


nom = Dir() '<- on rècupère l'occurrence suivante ...voir plus bas
mon_fichier.Close '<- on ferme le fichier ouvert un peu plus haut.

Loop '<- on repète l'action autant de fois que de fichiers xls existent



Application.ScreenUpdating = True '<- reactive la fonction de rafraichissement de l'affichage dans excel


End Sub
 

JNP

XLDnaute Barbatruc
Re : Macro qui récupére des données de classeurs externes

Bonsoir Lyly et bienvenue :),
Comme je ne m'y connais pas trop trop, je me demandais si vous ne pouviez pas m'aider à regarder si je n'ai pas fait une erreur de débutante ou s'il y avait une façon plus simple de faire...
L'idée d'insérer une ligne au dessus pour garder les informations est bonne, MAIS insérer une ligne entre plusieurs tableaux te décalent les tableaux du dessous, donc tu les écrases quand tu écrit des lignes fixes :rolleyes:... Le plus simple serait d'envoyer importance 1 en Feuil1, 2 en Feuil2 et 3 en Feuil3, puis, à l'issue de la boucle, tout regrouper en Feuil1 :p...
Bon courage :cool:
 

YANN-56

XLDnaute Barbatruc
Re : Macro qui récupére des données de classeurs externes

Bonsoir lyly, JNP, et à ceux qui passeront par là,

Juste envie de dire ceci:

Je suis estomaqué de voir une telle macro écrite par une "débutante"....

Et de la même façon que toi, JNP, tu puisses en faire un corrigé par suite d'une simple lecture...

Je viens de prendre une grande leçon de modestie.

Bravo à vous,

Amicalement,

Yann
 

lyly

XLDnaute Nouveau
Re : Macro qui récupére des données de classeurs externes

Bonjour JNP, YANN-56,

tout d'abord merci de répondre à mon problème, je me sentais un peu seule^^
j'ai donc essayé de modifier mon programme pour mettre les données de différentes importance dans des feuilles différentes:


i=8
j=8
k=8

Select Case (importance)
Case Is = 1 ' si c'est de première importance
donnee1 = mon_fichier.Sheets(1).Range("B7:L7") '<- on recupère la valeur désirée
Excel.Workbooks("Outil plan de compte.xlsm").Sheets(5).Range("Bi:Li") = donnee1 'on colle la valeur trouvée à un endroit précis
'Excel.Workbooks("Outil plan de compte.xlsm").Sheets(2).Rows(7).EntireRow.Insert 'on insère une ligne au dessus de la valeur copiée
i = i + 1

Case Is = 2 ' si c'est d'importance secondaire
donnee2 = mon_fichier.Sheets(1).Range("B7:L7") '<- on recupère la valeur désirée
Excel.Workbooks("Outil plan de compte.xlsm").Sheets(6).Range("Bj:Lj") = donnee2 'on colle la valeur trouvée à un endroit précis
'Excel.Workbooks("Outil plan de compte.xlsm").Sheets(2).Rows(8).EntireRow.Insert 'on insère une ligne au dessus de la valeur copiée
j = j + 1


Case Is = 3 ' si c'est d'importance moindre
donnee3 = mon_fichier.Sheets(1).Range("B7:L7") '<- on recupère la valeur désirée
Excel.Workbooks("Outil plan de compte.xlsm").Sheets(7).Range("Bk:Lk") = donnee3 'on colle la valeur trouvée à un endroit précis
'Excel.Workbooks("Outil plan de compte.xlsm").Sheets(2).Rows(9).EntireRow.Insert 'on insère une ligne au dessus de la valeur copiée
k = k + 1


(jai donc mis les insertions de ligne en commentaire)

Seulement pas moyen, bug total, je pense que le fait d'ajouter plus 1 aux variables ne fonctionne pas, mais je ne vois pas comment faire autrement.

Avez-vous une idée? merci bien :)
 

JNP

XLDnaute Barbatruc
Re : Macro qui récupére des données de classeurs externes

Re :),
Beaucoup d'erreur de syntaxe :p...
Pour charger une variable Range, le Set est obligatoire devant :rolleyes:...
Pourquoi incrémenter une variable si tu insère une ligne au dessus :confused: ?
L'utilisation d'une variable, c'est Range("B" & i & ":L" & i) ;)...
Bon courage :cool:
 

lyly

XLDnaute Nouveau
Re : Macro qui récupére des données de classeurs externes

Voilà ce qui ne marchait pas!
Merci bien, tout fonctionne maintenant!
j'ai enlevé l'insertion de lignes, c'est pour ça que je fais une incrémentation.

En tout cas, un grand merci pour le coup de main! :)

A une prochaine fois!
 

Discussions similaires

Statistiques des forums

Discussions
312 109
Messages
2 085 384
Membres
102 878
dernier inscrit
asmaa