Coller des données après la dernière cellule non vide
Bonjour à tous,
Je suis débutante en macro et je rencontre quelques difficultés...
L'objectif de la macro est de récupérer des données provenant de 6 fichiers et de les coller dans un seul et même onglet.
Ma problématique est que je n'arrive pas à coller les données les unes après les autres.
Ci-dessous ma macro :
Dim derniereligne As Integer
Dim ficheure As String, fictech As String, chmtech As String, ficcms As String, chmcms As String
------> Ouverture du 1ier Fichier
Workbooks.Open Filename:= _
chmtech, _
UpdateLinks:=0
Sheets("CP").Visible = True
Sheets("CP").Activate
derniereligne = Range("B65536").End(xlUp).Row
Range("B5:NC" & derniereligne).Copy
Windows(ficheure).Activate
Sheets("CP").Select
derniereligne = Range("B65536").End(xlUp).Row
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
-------> Ouverture du 2nd Fichier
Workbooks.Open Filename:= _
chmcms, _
UpdateLinks:=0
Sheets("CP").Visible = True
Sheets("CP").Activate
derniereligne = Range("B65536").End(xlUp).Row
Range("B5:NC" & derniereligne).Copy
Windows(ficheure).Activate
Sheets("CP").Select
derniereligne = Range("B65536").End(xlUp).Row
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Pourriez-vous m'expliquer ce qui ne va pas dans mon codage ?
Je vous remercie par avance pour vos réponses et vous souhaite une excellente journée
Nina
Yo Nina ! Yo le Forum !
Ma problématique est que je n'arrive pas à coller les données les unes après les autres.
Faut faire une boucle
Est-ce que tout tes fichiers sont réunies dans le même dossier ?
Si oui c'est tout tout simple !
Sub ListFiles()
Dim Fichier As String, Chemin As String
Dim i As Long, x As Long, a As Long, v As Long
Chemin = "P:\PERSONNEL\Excel\" 'ICI TU MET TON PROPRE CHEMIN ;D
Fichier = Dir(Chemin)
i = Range("G" & Rows.Count).End(xlUp).Row
If Fichier <> "" Then
Do While Fichier <> ""
i = i + 1
Sheets(1).Cells(i, 7) = Chemin & Fichier
Sheets(1).Cells(i, 8) = Fichier
Fichier = Dir
Loop
End If
End SubLe code ci-dessus te permet de faire la liste de tes fichiers dans le chemin indiqué !
Option Explicit
Public NewClasseur As LongFaut que tu mette sa dans ton module pour savoir si tu ouvre un nouveau classeur ou non !
Sub OpenFiles()
Dim x As Long, i As Long, a As Long, y As Long
Dim MonFichier As String, Files As String, Way As String
Dim classeur As Workbook
If NewClasseur = 0 Then
Set classeur = Application.Workbooks.Add 'creer un new classeur
With classeur
.SaveAs 'ICI LE CHEMIN DE SAUVEGARDE DE TON NOUVEAU FICHIER
End With
Else
Workbooks("ICI TON NEW FICHIER.xlsx").Activate
End If
Sheets.Add.Name = "Onglet" 'créer un onglet
Workbooks("ICI TON FICHIER OU SONT LISTER TES FICHIERS.xlsm").Activate
x = Range("G" & Rows.Count).End(xlUp).Row
Application.DisplayAlerts = False
y = 0
For i = 2 To x
If Cells(i, 7) <> "" And Cells(i, 8) <> "" Then
Way = Cells(i, 7)
Files = Cells(i, 8)
Workbooks.Open Filename:="" & Way & ""
a = Range("A" & Rows.Count).End(xlUp).Row
If y = 0 Then
Range("A1:AZ" & a).Copy
Else
Range("A2:AZ" & a).Copy
End If
Workbooks("ICI TON NEW FICHIER.xlsx").Activate
If y = 0 Then
a = Range("A" & Rows.Count).End(xlUp).Row
Else
a = Range("A" & Rows.Count).End(xlUp).Row + 1
End If
y = 1
Cells(a, 1).Select
ActiveSheet.Paste
Cells(1, 1).Select
Workbooks(Files).Close savechanges:=False
Workbooks("ICI TON NOM FICHIER OU SONT LISTER TES FICHIERS.xlsm").Activate
End If
Next
Application.DisplayAlerts = True
Columns("G:H").Select
Selection.ClearContents
NewClasseur = 1
End SubCe code la ci-dessus va ouvrir tout les fichiers lister un par un et les copier / coller dans un nouveau classeur et dans le même onglet
Tu peux adapter ces codes à ta manière ou les utiliser tel quel !
Restant à dispo !
Bonjour Juice,
Je te remercie pour ta réponse rapide !
Oui, tous les fichiers se trouvent dans le même dossier.
Je vais essayer d'adapter ma macro en fonction des indications que tu m'as donné.
Je reviens vers toi pour te tenir au courant du résultat
Bonjour,
Il y a de nombreuses choses qui ne vont pas dans le codage, avant même de se demander pourquoi ça ne fonctionne pas, pourquoi recopier les mêmes lignes plusieures fois, alors que tu peux utiliser des goto / gosub et return? ou alors appeler une sous fonction?
On va reprendre étape par étape ton programme et voir ce qui ne va pas, et par quoi il faut le remplacer :
Dim derniereligne As Integer
Dim ficheure As String, fictech As String, chmtech As String, ficcms As String, chmcms As String
premier soucis :
Dim derniereligne As Integer
Dim ficheure As String, fictech As String, chmtech As String, ficcms As String, chmcms As String
------> Ouverture du 1ier Fichier
Workbooks.Open Filename:= _
chmtech, _
UpdateLinks:=0
Sheets("CP").Visible = True
Sheets("CP").Activate
derniereligne = Range("B65536").End(xlUp).Row
Range("B5:NC" & derniereligne).Copy
Windows(ficheure).Activate
Sheets("CP").Select
derniereligne = Range("B65536").End(xlUp).Row
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
-------> Ouverture du 2nd Fichier
Workbooks.Open Filename:= _
chmcms, _
UpdateLinks:=0
Sheets("CP").Visible = True
Sheets("CP").Activate
derniereligne = Range("B65536").End(xlUp).Row
Range("B5:NC" & derniereligne).Copy
Windows(ficheure).Activate
Sheets("CP").Select
derniereligne = Range("B65536").End(xlUp).Row
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
On voit double, la partie bleue et rouge ont exactement les mêmes lignes, il n'y a que le nom du fichier qui change, en clair tu utilises la même fonction à chaque fois, mais au lieu de juste changer la valeur d'une variable, tu recopies le code...
Pour régler ça, tu peux utiliser un gosub par exemple, qui va au sub souhaité, je te mets un exemple qui affiche un message (dans ce cas c'est vrai que le gosub n'est pas préférable, mais c'est un exemple) :
exemple :
Sub message()
texte = "coucou"
GoSub afficher 'pour aller au sous-programme
texte = "test"
GoSub afficher
Exit Sub 'à mettre avant les sub
afficher: 'syntaxe d'un sub "nom + :"
MsgBox (texte)
Return 'return pour revenir au programme principal
End SubSi on applique cette méthode à ton programme on obtient ça :
Dim derniereligne As Integer
Dim ficheure As String, fictech As String, chmtech As String, ficcms As String, chmcms As String
'Ouverture du 1er Fichier / pas de i pour 1er ;)
nomfichier = chmtech 'au fait, tu fais appelles à la variable chmtech, mais tu ne la remplis jamais,
'ça marche quand même? il faudrait mettre le nom du fichier dedans
gosub copie
'Ouverture du 2ème fichier
nomfichier = chmcms
gosub copie
exit sub
copie:
Workbooks.Open Filename:= _
nomfichier, _
UpdateLinks:=0
Sheets("CP").Visible = True
Sheets("CP").Activate
derniereligne = Range("B65536").End(xlUp).Row
Range("B5:NC" & derniereligne).Copy
Windows(ficheure).Activate
Sheets("CP").Select
derniereligne = Range("B65536").End(xlUp).Row
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
return
end subBon le soucis du doublon est reglé car on stocke le nom du fichier dans la variable nomfichier, mais tu utilises des variables de nom de fichier dont tu déclares le format, mais dans lesquelles tu ne mets rien, à ce rythme autant directement utiliser nomfichier en mettant directement le nom, sans passer par d'autres variables, non?
On passe maintenant aux autres soucis dans le programme :
Dim derniereligne As Integer
Dim ficheure As String, fictech As String, chmtech As String, ficcms As String, chmcms As String
'Ouverture du 1er Fichier
nomfichier = chmtech
gosub copie
'Ouverture du 2ème fichier
nomfichier = chmcms
gosub copie
exit sub
copie:
Workbooks.Open Filename:= _
nomfichier, _
UpdateLinks:=0
Sheets("CP").Visible = True
Sheets("CP").Activate
derniereligne = Range("B65536").End(xlUp).Row
Range("B5:NC" & derniereligne).Copy
Windows(ficheure).Activate
Sheets("CP").Select
derniereligne = Range("B65536").End(xlUp).Row
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
return
end sub
Bon... Tout ce qui est en rouge est à remettre en question, parce que je vois plein de choses qui ne sont plus à faire en programmation, les select sont à éviter.
Le Sheets("CP").select peut-être remplacé par un With Sheets("CP") si nécessaire, ou encore set feuilCP = sheets("CP") et vider l'objet via un set feuilCP = nothing en fin d'utilisation
ensuite:
derniereligne = Range("B65536").End(xlUp).Row
Range("B5:NC" & derniereligne).Copy
tu n'es pas obligée de mettre cette valeur dans derniereligne comme tu ne l'utilises qu'à un endroit, mais tu peux garder ça si tu le souhaites, en revanche, ne laisses pas le 65536 pour le nombre de lignes, ce programme ne fonctionnerait plus sur des versions d'Excel possédant plus de lignes, utilises plutôt la variable Rows.coutn qui s'adapte en fonction du fichier (ça donnera "B" & rows.count)
Bon, la copie c'est pareil, pas recommandé, mais si tu veux la garder, tu peux, sinon tu peux aussi stocker les lignes remplies dans un tableau et dérouler les données via des boucles.
Ensuite:
Sheets("CP").Select
derniereligne = Range("B65536").End(xlUp).Row
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
ça c'est pareil, ne pas mettre Sheets("CP").select, plutôt utiliser des with ou des set
Ici tu enregistres derniereligne mais tu ne l'utilises pas, c'est sûrement aussi pour ça que ton programme ne marche pas, tu ne vas jamais à la dernière ligne, la copie... tu peux la garder, mais tu peux aussi utiliser des tableaux VBA.
Je te laisse voir tous les commentaires et corriger ton programme en conséquence, bon courage
EDIT:Oups je suis en retard, tu peux regarder aussi mes commentaires si tu le souhaite, salut Juice au passage
Bonjour Ausecour,
J'avais déclaré mes fichiers comme ci-dessous :
Sheets("Table").Select
ficheure = ThisWorkbook.Name
fictech = Range("B7").Value
chmtech = Range("B2").Value & "\" & fictech
ficcms = Range("B3").Value
chmcms = Range("B2").Value & "\" & ficcms
Je te remercie pour toutes ces informations, je ne connaissais pas du tout les gosub.
Je vais essayer,
Merci beaucoup !
PS: J'aimerai apprendre davantage les macros. Aurais-tu par hasard un livre assez simple et complet à me recommander ?
Bonjour,
Ah ça me rassure alors, pour les livres je ne saurais te conseiller... Car je n'en n'ai jamais acheté, j'apprends sur le terrain, en revanche, ce forum est une vraie mine d'informations, tu peux y retrouver des programmes faits par d'autres membres et qui sont très bien écrits
Sinon tu dois pouvoir trouver des sources un peu partout en fonction des informations que tu cherches
PS: tu peux aussi trouver de nombreuses choses via l'explorateur d'objet, ou en mode espionnage via le débogueur de VBA, quand tu veux regarder ce que contient un objet cellule par exemple
Il y a aussi l'aide de microsoft qui peut bien dépanner
Coucou Ausecour !
Re Nina,
PS: J'aimerai apprendre davantage les macros. Aurais-tu par hasard un livre assez simple et complet à me recommander ?
Ah ça me rassure alors, pour les livres je ne saurais te conseiller... Car je n'en n'ai jamais acheté
Pour ma part, je me suis lancé dans la VBA en commençant par suivre ce cours : https://www.excel-pratique.com/fr/vba.php qui t'apprend les bases de la VBA et te donne des exercices corrigés !
Qui plus est, il provient de ce Forum ;D (n'est-il pas parfait ??)
Super !
Je vous remercie vraiment tous les deux pour votre aide !
Je vais m'entrainer pour approfondir les macros et connaître plus de notions, comme par exemple les gosub
Je vous dérange de nouveau ^^
J'ai une autre petite question concernant la variable "nomfichier".
La macro fonctionne très bien pour la partie CP, mais arrivée à la partie RTT, cela bloque à cause de : "Workbooks(nomfichier).Activate"
J'ai essayé de remplacer String par Workbook mais dans ce cas là l'erreur provient de : "chmtech = Range("B2").Value & "\" & fictech"
J'ai également essayé de le remplacer par Windows comme pour "Windows(ficheure).Activate" qui lui fonctionne très bien, sans succès...
Pour quelle raison ai-je une erreur ? J'ai du mal déclarer la variable nomfichier.
Dim nomfichier as string, ficheure as string
chmtech = Range("B2").Value & "\" & fictech
nomfichier=chmtech
GoSub copie
nomfichier = chmcms
GoSub copie
copie:
Workbooks.Open Filename:= _
nomfichier, _
UpdateLinks:=0
Sheets("CP").Visible = True
Sheets("CP").Activate
derniereligne = Range("B" & Rows.Count).End(xlUp).Row
Range("B5:NC" & derniereligne).Copy
Windows(ficheure).Activate
Sheets("CP").Select
derniereligne = Range("A" & Rows.Count).End(xlUp)(2).Select
ActiveSheet.Paste
Workbooks(nomfichier).Activate
Sheets("RTT").Visible = True
Sheets("RTT").Activate
derniereligne = Range("B" & Rows.Count).End(xlUp).Row
Range("B5:NC" & derniereligne).Copy
Windows(ficheure).Activate
Sheets("RTT").Select
derniereligne = Range("A" & Rows.Count).End(xlUp)(2).Select
ActiveSheet.Paste
Je vous remercie pour votre aide
Bonjour,
Je pense que le soucis c'est que la fonction workbooksopen attend un string qui contient également le chemin du fichier, alors que workbooks.activate attend juste le nom du classeur, il est déjà ouvert, donc il n'a plus besoin de connaître le chemin, il faut que tu utilises 2 variables, une qui aura le nom complet avec le fichier, une qui aura seulement le nom du fichier, c'est sûrement pour ça que ça refuse de fonctionner