BESOIN D'AIDE URGENTE MACROS EXCEL 2003

itreal Messages postés 30 Statut Membre -  
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,
je viens vers vous pour trouver une solution à mon GROS problème pour créer une macro sur Excel.
Je dois faire en sorte de rapatrier des données de quatre tableaux excel à ramener sur un seul.
Deux d'entre eux ont exactement les même colonnes et deux autres non.
Je dois donc pouvoir sélectionner les colonnes que je veux ramener et cela doit se faire après automatiquement, les données à la suite les unes des autres.
On m'a dit que je pouvais faire ça avec une macro qui fait une boucle... après je comprenais plus.
Mon problème est que l'on m'a embaucher pour ce poste et que j'ai un mois pour réussir ça ou je pense que j'ai de grande chance de dégager.
En espérant que quelqu'un me vienne en aide.
A voir également:

26 réponses

Résumé de la discussion

L’objectif est d’importer quatre tableaux Excel dans un seul fichier en précisant les colonnes à conserver et de les concaténer verticalement. Une macro VBA est proposée pour boucler sur les fichiers sources, déterminer dynamiquement la plage de données et copier les colonnes sélectionnées dans la feuille cible en poursuivant sur la dernière ligne. Les points critiques portent sur éviter les en-têtes répétés (départ à la ligne 2), remplacer les plages fixes par des plages calculées et gérer les erreurs comme l’erreur 1004 liée aux références Range/Cells. Des exemples montrent comment spécifier les colonnes à importer et organiser l’ouverture/ fermeture des fichiers source, avec la possibilité d’adapter le code lorsque les colonnes diffèrent entre les tableaux.

Généré automatiquement par IA
sur la base des meilleures réponses
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 770
 
Ne pas cèder à la panique!
La macro, tous les codes donnés ci-dessus sont corrects. Envoie moi par mail (tu trouveras mon adresse perso dans mon profil) tes 5 classeurs, je ferais en sorte que les petits réglages de fin fonctionnent.
0
itreal Messages postés 30 Statut Membre
 
Salut,
je reviens vers toi en plus des couleurs car je m'aperçois que quand je change ma macro (je lui dit par exemple que la colonne 11 du "base3" ne va plus en AA mais en Q de ma "cible")
il ne rafraichit pas correctement.
ce qui fait que des données se trouvent mélangées, c'est la catastrophe.
0
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 770 > itreal Messages postés 30 Statut Membre
 
Salut,
pas compris! quand je change ma macro (je lui dit par exemple que la colonne 11 du "base3" ne va plus en AA mais en Q de ma "cible")
il ne rafraichit pas correctement

Mets voir ici ton code stp.
0
itreal Messages postés 30 Statut Membre > pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention  
 
Je n'ai mis qu'un exemple de "base" sur les 5 qui s'importent dans "cible".
j'ai voulu changer la destination de la ligne 11 pour qu'elle se mette dans Q et non dans AA.
Et là j'ai données qui se mettent bien en Q mais restent aussi en AA.

Pareil pour la couleur, quand j'enlève les données dans la colonne"Dossier clos", la ligne reste rouge.

Private Sub Workbook_Open()
Dim derlig As Integer, dercol As Integer, numligne As Integer
ActiveSheet.Range("A2:Z65536").ClearContents

Dim i As Integer
derlig = Range("AE65536").End(xlUp).Row
For i = 2 To derlig
If Range("AA" & i) <> "" Then
With Range(Cells(i, 1), Cells(i, 38)).Interior
.ColorIndex = 3
End With
End If
Next i

Workbooks.Open Filename:="C:\Documents and Settings\rperez\Mes documents\bureau\base1.xls"
With Workbooks("cible.xls").Sheets("Feuil1")
numligne = .Range("A65536").End(xlUp).Offset(1, 1).Row
End With
derlig = Range("A1").SpecialCells(xlCellTypeLastCell).Row
Workbooks("base1.xls").ActiveSheet.Range(Cells(2, 1), Cells(derlig, 1)).Copy Workbooks("cible.xls").Sheets("Feuil1").Range("A" & numligne)
Workbooks("base1.xls").ActiveSheet.Range(Cells(2, 2), Cells(derlig, 2)).Copy Workbooks("cible.xls").Sheets("Feuil1").Range("H" & numligne)
Workbooks("base1.xls").ActiveSheet.Range(Cells(2, 3), Cells(derlig, 3)).Copy Workbooks("cible.xls").Sheets("Feuil1").Range("L" & numligne)
Workbooks("base1.xls").ActiveSheet.Range(Cells(2, 4), Cells(derlig, 4)).Copy Workbooks("cible.xls").Sheets("Feuil1").Range("G" & numligne)
Workbooks("base1.xls").ActiveSheet.Range(Cells(2, 5), Cells(derlig, 5)).Copy Workbooks("cible.xls").Sheets("Feuil1").Range("D" & numligne)
Workbooks("base1.xls").ActiveSheet.Range(Cells(2, 6), Cells(derlig, 6)).Copy Workbooks("cible.xls").Sheets("Feuil1").Range("J" & numligne)
Workbooks("base1.xls").ActiveSheet.Range(Cells(2, 7), Cells(derlig, 7)).Copy Workbooks("cible.xls").Sheets("Feuil1").Range("O" & numligne)
Workbooks("base1.xls").ActiveSheet.Range(Cells(2, 9), Cells(derlig, 9)).Copy Workbooks("cible.xls").Sheets("Feuil1").Range("P" & numligne)
Workbooks("base1.xls").ActiveSheet.Range(Cells(2, 10), Cells(derlig, 10)).Copy Workbooks("cible.xls").Sheets("Feuil1").Range("Y" & numligne)
Workbooks("base1.xls").ActiveSheet.Range(Cells(2, 11), Cells(derlig, 11)).Copy Workbooks("cible.xls").Sheets("Feuil1").Range("AA" & numligne)
Workbooks("base1.xls").ActiveSheet.Range(Cells(2, 12), Cells(derlig, 12)).Copy Workbooks("cible.xls").Sheets("Feuil1").Range("AB" & numligne)
Workbooks("base1.xls").ActiveSheet.Range(Cells(2, 14), Cells(derlig, 14)).Copy Workbooks("cible.xls").Sheets("Feuil1").Range("AC" & numligne)

Workbooks("cible.xls").Activate
derlig = Range("A1").SpecialCells(xlCellTypeLastCell).Row
Range("A2").Select
Range("A1:AL" & derlig).Sort Key1:=Range("A2"), Order1:=xlAscending, Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal

End Sub
0
itreal Messages postés 30 Statut Membre
 
Je vois en plus qu'il mélange des données, si la "base4" n'a pas de données à alimenter dans la colonne AA de mon tableau "cible".
Il me prend des donnée d'une autre base et le met sur la même ligne dans ma cible.
0
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 770
 
Déjà la couleur : A la fin de la macro... comme ceci :

Private Sub Workbook_Open()
Dim derlig As Integer, dercol As Integer, numligne As Integer, i As Integer

ActiveSheet.Range("A2:Z65536").ClearContents

Workbooks.Open Filename:="C:\Documents and Settings\rperez\Mes documents\bureau\base1.xls"
With Workbooks("cible.xls").Sheets("Feuil1")
numligne = .Range("A65536").End(xlUp).Offset(1, 1).Row
End With
derlig = Range("A1").SpecialCells(xlCellTypeLastCell).Row
Workbooks("base1.xls").ActiveSheet.Range(Cells(2, 1), Cells(derlig, 1)).Copy Workbooks("cible.xls").Sheets("Feuil1").Range("A" & numligne)
Workbooks("base1.xls").ActiveSheet.Range(Cells(2, 2), Cells(derlig, 2)).Copy Workbooks("cible.xls").Sheets("Feuil1").Range("H" & numligne)
Workbooks("base1.xls").ActiveSheet.Range(Cells(2, 3), Cells(derlig, 3)).Copy Workbooks("cible.xls").Sheets("Feuil1").Range("L" & numligne)
Workbooks("base1.xls").ActiveSheet.Range(Cells(2, 4), Cells(derlig, 4)).Copy Workbooks("cible.xls").Sheets("Feuil1").Range("G" & numligne)
Workbooks("base1.xls").ActiveSheet.Range(Cells(2, 5), Cells(derlig, 5)).Copy Workbooks("cible.xls").Sheets("Feuil1").Range("D" & numligne)
Workbooks("base1.xls").ActiveSheet.Range(Cells(2, 6), Cells(derlig, 6)).Copy Workbooks("cible.xls").Sheets("Feuil1").Range("J" & numligne)
Workbooks("base1.xls").ActiveSheet.Range(Cells(2, 7), Cells(derlig, 7)).Copy Workbooks("cible.xls").Sheets("Feuil1").Range("O" & numligne)
Workbooks("base1.xls").ActiveSheet.Range(Cells(2, 9), Cells(derlig, 9)).Copy Workbooks("cible.xls").Sheets("Feuil1").Range("P" & numligne)
Workbooks("base1.xls").ActiveSheet.Range(Cells(2, 10), Cells(derlig, 10)).Copy Workbooks("cible.xls").Sheets("Feuil1").Range("Y" & numligne)
Workbooks("base1.xls").ActiveSheet.Range(Cells(2, 11), Cells(derlig, 11)).Copy Workbooks("cible.xls").Sheets("Feuil1").Range("AA" & numligne)
Workbooks("base1.xls").ActiveSheet.Range(Cells(2, 12), Cells(derlig, 12)).Copy Workbooks("cible.xls").Sheets("Feuil1").Range("AB" & numligne)
Workbooks("base1.xls").ActiveSheet.Range(Cells(2, 14), Cells(derlig, 14)).Copy Workbooks("cible.xls").Sheets("Feuil1").Range("AC" & numligne)

Workbooks("cible.xls").Activate
derlig = Range("A1").SpecialCells(xlCellTypeLastCell).Row
Range("A2").Select
Range("A1:AL" & derlig).Sort Key1:=Range("A2"), Order1:=xlAscending, Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal

derlig = Range("AE65536").End(xlUp).Row
For i = 2 To derlig
If Range("AA" & i) <> "" Then
With Range(Cells(i, 1), Cells(i, 38)).Interior
.ColorIndex = 3
End With
End If
Next i

End Sub

2- explication du copier coller :
première partie de la phrase = partie à copier ex:
Workbooks("base1.xls").ActiveSheet.Range(Cells(2, 9), Cells(derlig, 9)).Copy
signifie : Classeur"base1", feuille active, Selection de cellules de I2 à I dernière ligne, à copier
la deuxième partie = ou coller? ex :
Workbooks("cible.xls").Sheets("Feuil1").Range("P" & numligne)
signifie coller à : Classeur"cible", Feuille 1, à partir de la cellule P et numligne qui est la variable renseignant la première ligne vide en bas de feuille...
Donc pour copier AA en Q tu devrais avoir quelque chose comme :
Workbooks("base1.xls").ActiveSheet.Range(Cells(2, 27), Cells(derlig, 27)).Copy Workbooks("cible.xls").Sheets("Feuil1").Range("Q" & numligne)
Or je ne vois cela nulle part dans ton code...
0
itreal Messages postés 30 Statut Membre
 
Bonjour,
je vois où se trouve mon problème, il garde en mémoire les anciennes données.
Si je change ma macro, mon tableau cible n'enlève pas les données qui l'avait avec l'ancienne macro.
Ce qui fait que si je modifie quelque chose, il ne reprend pas depuis le début.
Est ce qu'il n'existe pas une commande pour que tout soit contrôlé par ma macro ?
0
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 770
 
Salut,
Remplace au début de ta macro :
ActiveSheet.Range("A2:Z65536").ClearContents
par :
ActiveSheet.Range("A2:AZ65536").Delete
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
itreal Messages postés 30 Statut Membre
 
Il me met qu'il y a un bug dans ma macro que tu m'avais donné pour trier, à la ligne :
"derlig = Range("A1").SpecialCells(xlCellTypeLastCell).Row"

qui se trouve ici :
"Workbooks("cible.xls").Activate
derlig = Range("A1").SpecialCells(xlCellTypeLastCell).Row
Range("A2").Select
Range("A1:AL" & derlig).Sort Key1:=Range("A2"), Order1:=xlAscending, Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal"
0
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 770
 
Peux tu me renvoyer ton tableau par mail que j'y regardes. Le code à l'air bon là...
0
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 770
 
Oui c'est tout à fait normal qu'il y ai un bug ici car : Range("A1").SpecialCells(xlCellTypeLastCell).Row ne peux pas être utilisé plusieurs fois de suite sans enregistrement du classeur.
2 choix :
1- tu enregistres le classeur avant cette ligne :
Workbooks("cible.xls").Activate
Workbooks("cible.xls").Save
derlig = Range("A1").SpecialCells(xlCellTypeLastCell).Row
Range("A2").Select
Range("A1:AL" & derlig).Sort Key1:=Range("A2"), Order1:=xlAscending, Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal

2- tu remplaces : Range("A1").SpecialCells(xlCellTypeLastCell).Row
par : derlig = Range("A65536").End(xlUp).Row

Personnellement je préfères la 2ème solution, mais à toi de voir...
0