VBA - Sélectionner une feuille
Bonjour à tous,
J'ai un souci, j'essaye de faire une macro qui copie des valeurs dans un classeur pour venir les copier dans un autre.
Ca fonctionne sauf que je n'arrive pas à changer de feuille ce qui a pour résultat de copier à chaque itération de ma boucle For Each les mêmes valeurs qu'à la première.
Auriez-vous une solution? (Je suppose que le problème vient du fait de sélectionner avec la méthode "Windows")
La macro en question:
Sub Macro2()
'
' Macro2 Macro
' test
'
Dim compteur As Integer
Dim numLigne As Integer
'
numLigne = 20
compteur = 0
Windows("Rapport Pipecheck (horaire).xls").Activate
For Each Feuille In Worksheets
If Range("B10").Value > 1 Then
Windows("Rapport Pipecheck (horaire).xls").Activate
Range("B13").Select
Selection.Copy
Windows("LHP - TRAPIL TRAME V8 MAJ 19-10-2020 .xlsm").Activate
Range("E" & numLigne).Select
ActiveSheet.Paste
Windows("Rapport Pipecheck (horaire).xls").Activate
Range("B12").Select
Application.CutCopyMode = False
Selection.Copy
Windows("LHP - TRAPIL TRAME V8 MAJ 19-10-2020 .xlsm").Activate
Range("I" & numLigne).Select
ActiveSheet.Paste
Windows("Rapport Pipecheck (horaire).xls").Activate
Range("B6").Select
Application.CutCopyMode = False
Selection.Copy
Windows("LHP - TRAPIL TRAME V8 MAJ 19-10-2020 .xlsm").Activate
Range("J" & numLigne).Select
ActiveSheet.Paste
Windows("Rapport Pipecheck (horaire).xls").Activate
Range("B9").Select
Application.CutCopyMode = False
Selection.Copy
Windows("LHP - TRAPIL TRAME V8 MAJ 19-10-2020 .xlsm").Activate
Range("K" & numLigne).Select
ActiveSheet.Paste
Windows("Rapport Pipecheck (horaire).xls").Activate
numLigne = numLigne + 1
End If
Next
End SubMerci d'avance :)
Bonjour,
For Each Feuille In Worksheets
If Range("B10").Value > 1 Thenquand tu utilises For Each feuille, il faut lui préciser que c'est cette feuille que tu veux utiliser, sinon il prend celle active par défaut.
Donc :
For Each Feuille In Worksheets
If Feuille.Range("B10").Value > 1 ThenEt si tu ne veux pas répéter Feuille. à chaque fois, tu as With :
For Each Feuille In Worksheets
With Feuille
If .Range("B10").Value > 1 Then
' etc...
End Withle fait de mettre un . devant Range, il sait que tu veux utiliser l'objet désigné par le dernier With
eric
PS : utilises plutôt l'objet Workbook plutôt que Windows qui ne se justifie pas ici
Qq chose comme :
Dim wb1 as Workbook
Set wb1 = Workbooks("Rapport Pipecheck (horaire).xls")
For Each Feuille In wb1.WorksheetsSuper merci :)
Ca me donne la moitié de la solution.
Il me reste le souci que je ne sais pas comment faire pour aller copier les valeurs dans l'autre classeur (comment jongler entre les deux finalement)?
même principe, c'est mieux de travailler avec des objets.
Le pb est qu'on ne connait pas ta feuille destination. Il faut être précis, et éviter de travailler avec l'active si tu peux.
J'ai pris Feuil1, que tu déclares ainsi :
Dim shDest As Worksheet
Set shDest = Workbooks("LHP - TRAPIL TRAME V8 MAJ 19-10-2020 .xlsm").Worksheets("Feuil1")ensuite quand tu veux coller dedans :
shDest.Range("E" & numLigne).Select
ActiveSheet.PasteIl faut aussi éviter les .Select inutiles :
Range("B13").Select
Selection.Copy
devient Range("B13").Copy
et si tu ne veux que les valeurs, que les formats ne t'intéressent pas, tu peux faire le copier-coller en 1 ligne :shDest.Range("E" & numLigne).Value = .Range("B13").Value
ne pas oublier le . du With
(écris sans filet, possible adaptation à faire)
eric
Merci beaucoup Éric!
J'ai essayé d'appliquer tes conseils et maintenant j'ai une erreur 9 ("L'indice n'appartient pas à la sélection"), j'ai pourtant bien vérifié le nom du classeur "classeur source" mais rien n'y fait.
J'exécute la macro dans "classeur destination" et j'ai les deux classeurs ouverts dans Excel.
Voici mon code après modifications :
Sub Macro2()
'
' Macro2 Macro
' test
'
Dim numLigne As Integer
Dim shSrc As Worksheet
Dim shDest As Worksheet
Set shSrc = Workbooks("classeur source".Worksheets("Default_1") 'classeur source
Set shDest = Workbooks("classeur destination").Worksheets("Feuil1 MT") 'classeur destination
numLigne = 20 'permet de copier à la bonne ligne
shSrc.Activate 'on active le classeur source
For Each Feuille In Worksheets 'boucle sur chaque feuille du classeur source
With Feuille
If .Range("B10").Value > 1 Then
Range("B13").Select
Selection.Copy
shDest.Range("E" & numLigne).Select
ActiveSheet.Paste
shSrc.Activate
Range("B12").Select
Selection.Copy
shDest.Range("I" & numLigne).Select
ActiveSheet.Paste
shSrc.Activate
Range("B6").Select
Application.CutCopyMode = False
Selection.Copy
shDest.Range("J" & numLigne).Select
ActiveSheet.Paste
shSrc.Activate
Range("B9").Select
Selection.Copy
shDest.Range("K" & numLigne).Select
ActiveSheet.Paste
shSrc.Activate
numLigne = numLigne + 1
End If
End With
Next
End SubPS : j'ai essayé en mettant le chemin d'accès complet de "classeur source", ca ne fonctionne pas non plus, même erreur.
Bonjour,
Set shSrc = Workbooks("classeur source".Worksheets("Default_1")
tu as oublié de fermer une parenthèse.
shSrc.Activate 'on active le classeur source
non, c'est une feuille, pas le classeur.
Et comme dit précédemment, éviter les .Activate et .Select inutiles, utiliser les objets déclarés.
Je t'avais mis un exemple
eric
Sur ma macro je n'en ai pas oublié non, c'est en recopiant le code sur le forum.
J'ai bien :
Set shSrc = Workbooks("Rapport Pipecheck (horaire).xls").Worksheets("Default_1") 'feuille source
Pourtant j'ai quand même l'erreur 9 à cette ligne.
Je vais essayer de remplacer les .Activate et .Select ;)
Soit tu t'es trompé dans le nom du classeur ou de la feuille, soit le classeur n'est pas ouvert.
Ca a fonctionné en fermant / rouvrant les classeurs :)
Après modification je n'ai plus de message d'erreur, en revanche les valeurs copiées sont toujours les mêmes, celles de la première feuille.
La boucle a pourtant l'air de fonctionner, il y a bien 5 feuilles différentes sur lesquelles "B10" est supérieure à 1.
Voici où mon code en est :
Sub Macro2()
'
' Macro2 Macro
' test
'
Dim numLigne As Integer
Dim shSrc As Worksheet
Dim shDest As Worksheet
Set shSrc = Workbooks("Rapport Pipecheck (horaire).xls").Worksheets(2) 'feuille source
Set shDest = Workbooks("LHP - TRAPIL TRAME V8 MAJ 19-10-2020 .xlsm").Worksheets("Feuil1 MT") 'feuille destination
numLigne = 20 'permet de copier à la bonne ligne
shSrc.Activate 'on active le classeur source
For Each Feuille In Worksheets 'boucle sur chaque feuille du classeur source
With Feuille
If .Range("B10").Value > 1 Then
Range("B13").Select
Selection.Copy
shDest.Activate
shDest.Range("E" & numLigne).Select
ActiveSheet.Paste
shSrc.Activate
Range("B12").Select
Selection.Copy
shDest.Activate
shDest.Range("I" & numLigne).Select
ActiveSheet.Paste
shSrc.Activate
Range("B6").Select
Selection.Copy
shDest.Activate
shDest.Range("J" & numLigne).Select
ActiveSheet.Paste
shSrc.Activate
Range("B9").Select
Selection.Copy
shDest.Activate
shDest.Range("K" & numLigne).Select
ActiveSheet.Paste
shSrc.Activate
numLigne = numLigne + 1
End If
End With
Next
End SubJe n'ai pas fait le ménage sur les .Select et .Activate, j'ai essayé mais je ne sais pas quoi mettre à la place.
C'est bon !
J'ai réussie en ajoutant une ligne Feuille.Activate à chaque cellule à copier :)
Merci beaucoup pour ton aide Éric.
PS : Si ce n'est pas trop compliqué je veux bien comprendre comment nettoyer mon code en enlevant les .Select et .Activate ?
et les . devant les Range("B13").Select c'est moi qui vais les mettre ?
Une fois mis, pas besoin d'activer les feuilles.
je veux bien comprendre comment nettoyer mon code en enlevant les .Select et .Activate ?
Tu as un exemple dans la 2nde moitié de mon post de22:34
Ok, je vais essayer de travailler (et comprendre) tout ça ;)
Merci encore!
Je pourrais te donner la réponse toute mâchée, mais c'est plus formateur si tu y arrives petit à petit.
On verra s'il reste des améliorations à faire l'année prochaine...
Bon réveillon :)
eric