Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel
Excel Forum d'entraide sur Excel. Vos questions sur les fonctions, formules, manipulations, et tout sujet qui ne trouve pas sa place dans un sous-forum.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/02/2012, 20h37   #1
Invité de passage
 
Femme
Inscription : janvier 2012
Messages : 13
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : janvier 2012
Messages : 13
Points : 3
Points : 3
Par défaut MACRO : copie de plusieurs feuilles sous conditions

J'ai une macro qui me permet de recopier les colonnes A à J de la feuille 1 sur la feuille 2 si la colonne K de la feuille 1 comporte un A ou un I.

La macro fonctionne mais... je voudrais appliquer cette macro pour d'autres feuilles c'est à dire copier les mêmes colonnes dans la feuille 3 si A et I se trouvent dans la colonne J.

etc, etc... (j'ai 5 feuilles dans ce fichier).

Je ne sais pas comment faire pour qu'une seule macro puisse me permettre cela...


J'espère avoir été assez claire...

Ci-joint ma macro :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Sub Filtre()
 
  Dim Lig     As Long
  Dim Col     As String
  Dim NbrLig  As Long
  Dim NumLig  As Long
 
  Sheets("2").Activate
  Col = "K"
  NumLig = 1
  With Sheets("1")
  NbrLig = .Cells(65536, Col).End(xlUp).Row
  For Lig = 2 To NbrLig
    If .Cells(Lig, Col).Value = "A" Or .Cells(Lig, Col).Value = "I" Then
       .Range("A" & Lig & ":K" & Lig).Copy
    NumLig = NumLig + 1
    Cells(NumLig, 1).Select
    ActiveSheet.Paste
    End If
    Next
End With
 
End Sub



Merci beaucoup de votre aide.
Killie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 21h59   #2
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 924
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 924
Points : 7 254
Points : 7 254
Bonjour,

Ci dessous une adaptation de ton code en utilisant l'objet worksheet
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Sub Filtre()
 
Dim Lig As Long
Dim Col As String
 
Dim NumLig As Long
 
Dim Sh As Worksheet
Dim Shcible As Worksheet
 
Set Shcible = ThisWorkbook.Sheets("2")
 
Col = "K"
 
NumLig = 1
 
For Each Sh In ThisWorkbook.Worksheets
    If Sh.Name <> Shcible.Name Then
        For Lig = 2 To Sh.Range("K" & Rows.Count).End(xlUp).Row
            If Sh.Range("K" & Lig).Value = "A" Or Sh.Range("K" & Lig).Value = "I" Then
                Sh.Range("A" & Lig & ":K" & Lig).Copy Shcible.Range("A" & NumLig)
                NumLig = NumLig + 1
            End If
        Next
    End If
Next Sh
 
End Sub
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 08h30   #3
Invité de passage
 
Femme
Inscription : janvier 2012
Messages : 13
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : janvier 2012
Messages : 13
Points : 3
Points : 3
Je pense que je me suis mal expliquée parce que je copie les lignes :
dans la feuille 2 si j'ai A ou I colonne J (de la feuille1)
dans la feuille 3 si j'ai A ou I colonne K (de la feuille1)
dans la feuille 4 si j'ai A ou I colonne L (de la feuille 1)

Je n'ai pas trop l'habitude et je suis larguée...

Un grand merci pour votre aide.
Killie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 15h48   #4
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 924
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 924
Points : 7 254
Points : 7 254
A essayer

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Sub Filtre()
 
Dim Lig As Long
 
Dim Sh As Worksheet
Dim Shcible As Worksheet
 
For Each Sh In ThisWorkbook.Worksheets
    If Sh.Name <> "1" Then
        For Lig = 2 To Sh.Range("K" & Rows.Count).End(xlUp).Row
            If Sh.Range("K" & Lig).Value = "A" Or Sh.Range("K" & Lig).Value = "I" Then
                Set Shcible = ThisWorkbook.Sheets("2")
                Sh.Rows(Lig).Copy Shcible.Range("A" & Shcible.Range("A" & Rows.Count).End(xlUp).Row + 1)
            End If
            If Sh.Range("J" & Lig).Value = "A" Or Sh.Range("J" & Lig).Value = "I" Then
                Set Shcible = ThisWorkbook.Sheets("1")
                Sh.Rows(Lig).Copy Shcible.Range("A" & Shcible.Range("A" & Rows.Count).End(xlUp).Row + 1)
            End If
            If Sh.Range("L" & Lig).Value = "A" Or Sh.Range("L   " & Lig).Value = "I" Then
                Set Shcible = ThisWorkbook.Sheets("4")
                Sh.Rows(Lig).Copy Shcible.Range("A" & Shcible.Range("A" & Rows.Count).End(xlUp).Row + 1)
            End If
        Next
    End If
Next Sh
 
End Sub
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 21h21   #5
Invité de passage
 
Femme
Inscription : janvier 2012
Messages : 13
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : janvier 2012
Messages : 13
Points : 3
Points : 3
Une erreur s'affiche :

erreur d'exécution '9' - indice en dehors de la plage


C'est dommage....

Mais merci quand même !
Killie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 08h51   #6
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 700
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 700
Points : 1 460
Points : 1 460
Bonjour,

Si j’ai bien compris,
si la colonne J de la feuille "1" contient « A » ou « I », on copie la ligne correspondante dans la feuille "2"
si la colonne K de la feuille "1" contient « A » ou « I », on copie la ligne correspondante dans la feuille "3"
si la colonne L de la feuille "1" contient « A » ou « I », on copie la ligne correspondante dans la feuille "4"

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Option Explicit
Sub Filtre()
Dim ShSource As Worksheet
Dim ShCible As Worksheet
Dim LigSource As Long, LigCible As Long
Dim ColSource As Variant
Dim N°OrdreSh As Byte
 
    Set ShSource = ThisWorkbook.Worksheets("1")
    'Initialisation
    N°OrdreSh = 0
    'Pour chaque feuille cible
    For Each ShCible In ThisWorkbook.Worksheets(Array("2", "3", "4"))
        'On définit la colonne de référence correspondante dans la feuille source
        ColSource = Array("J", "K", "L")
        'On définit le numéro de la première ligne où s'effectue la copie dans la feuille cible
        LigCible = 2 ' la première ligne est réservée à l'en-tête
        'Pour chaque ligne de la feuille source
        For LigSource = 2 To ShSource.Cells(ShSource.Rows.Count, ColSource(N°OrdreSh)).End(xlUp).Row
            'Si la colonne de référence de la feuille source contient "A" ou "I"
            If ShSource.Cells(LigSource, ColSource(N°OrdreSh)).Value = "A" Or ShSource.Cells(LigSource, ColSource(N°OrdreSh)).Value = "I" Then
                'recopie la ligne correspondante de la feuille "1" vers la feuille cible
                ShSource.Rows(LigSource).Copy Destination:=ShCible.Range("A" & LigCible)
                'Incrémentation de la ligne cible
                LigCible = LigCible + 1
            End If
        Next LigSource
        'Incrémentation de la colonne de référence
        N°OrdreSh = N°OrdreSh + 1
    Next ShCible
End Sub
Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 20h29   #7
Invité de passage
 
Femme
Inscription : janvier 2012
Messages : 13
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : janvier 2012
Messages : 13
Points : 3
Points : 3
Trop fort !

Franchement un grand merci et un énoooorme bravo, je suis scotchée !

Juste... je ne voudrais pas abuser.... mais si je peux ajouter une petite question...

Au lieu de copier la ligne entière je souhaiterais seulement copier les 5 premières colonnes (ABCDE), c'est possible ?

Merci Merci Merci !
Killie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 22h37   #8
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 700
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 700
Points : 1 460
Points : 1 460
Bonsoir,

c'est possible ! (ça me rappelle une pub) .

Tu remplaces
Code :
ShSource.Rows(LigSource).Copy Destination:=ShCible.Range("A" & LigCible)
par
Code :
ShSource.Range(ShSource.Cells(LigSource, "A"), ShSource.Cells(LigSource, "E")).Copy Destination:=ShCible.Range("A" & LigCible)
Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 22h52   #9
Invité de passage
 
Femme
Inscription : janvier 2012
Messages : 13
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : janvier 2012
Messages : 13
Points : 3
Points : 3
Ça marche !

Bravo, vraiment, je suis admirative...

Sincèrement, mille mercis !
Killie est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h44.


 
 
 
 
Partenaires

Hébergement Web