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 Sub

Merci d'avance :)

Bonjour,

    For Each Feuille In Worksheets
        If Range("B10").Value > 1 Then

quand 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 Then

Et 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 With

le 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.Worksheets

Super 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.Paste

Il 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 Sub

PS : 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.

capture

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 Sub

Je 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

Rechercher des sujets similaires à "vba selectionner feuille"