BESOIN D'AIDE URGENTE MACROS EXCEL 2003
pijaku Messages postés 13513 Date d'inscription Statut Modérateur Dernière intervention -
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.
- BESOIN D'AIDE URGENTE MACROS EXCEL 2003
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Si ou excel - Guide
- Déplacer colonne excel - Guide
- Comment trier par ordre alphabétique sur excel - Guide
26 réponses
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.
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.
Il me prend des donnée d'une autre base et le met sur la même ligne dans ma cible.
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...
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 ?
Remplace au début de ta macro :
ActiveSheet.Range("A2:Z65536").ClearContents
par :
ActiveSheet.Range("A2:AZ65536").Delete
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question"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"
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...
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.
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.
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