Extraire des données de plusieurs feuilles avec deux conditions vers une autre feuille
Tags :
Dernière réponse : dans Programmation
Bonjour,
J'ai enregistrée une macro afin de pouvoir extraire des données de plusieurs feuilles vers une seule si une données d'une colonne correspond à deux conditions différentes.
Bon, je ne sai pas si je m'explique bien mais voilà :
j'ai une base de données de documents classés par feuilles : j'ai donc une feuille "Ancien systeme", une feuille "Procedure", une feuille "Instruction", une feuille "Formulaire" et une feuille "Liste".
Chacune des feuilles contiennent les même informations au niveau des colonnes : "A=Référence", "B=Ancienne Référence", "C=TITRE", "E=Rédacteur", "F=Service Emetteur".....plein d'autres colonnes mais qui ne m'intéresse pas dans l'extraction....et enfin, "S=Date de fin de validité" et "T= Obsolete", sauf pour la feuille "Ancien systeme" dont la colonne A est vide!
Je souhaite donc extraite les données des colonnes que j'ai nommés ci-dessus vers une autre feuille que j'appellerais "liste des obso" en donnant comme conditions que "OBSO" ou "FUTUR OBSO" soit dans la colonne "T=Obsolete" et que chaque extraction arrive à la suite de l'autre.
C'est à dire que l'extraction qui sera faite de la feuille ancien systeme soit en premier, que l'extraction de la feuille Procedure arrive à la première ligne vide et ainsi de suite.
Voici le programme mais je pense qu'il doit y avoir une solution beaucoup plus simple que celle là.
En fait j'ai enregistré une suite de réalisation manuelle dans les différentes feuilles.
J'ai essayé de faire avec la fonction filtre élaboré mais je ne dois pas faire comme il faut car il me dit qua la plage n'est pas valide....
vous verrez aussi que j'ai essayé de mettre une ligne de séparation entre chaque type de documents mais ça ne marche pas parfaitement non plus....
Merci beaucoup pour votre aide.
virginie
J'ai enregistrée une macro afin de pouvoir extraire des données de plusieurs feuilles vers une seule si une données d'une colonne correspond à deux conditions différentes.
Bon, je ne sai pas si je m'explique bien mais voilà :
j'ai une base de données de documents classés par feuilles : j'ai donc une feuille "Ancien systeme", une feuille "Procedure", une feuille "Instruction", une feuille "Formulaire" et une feuille "Liste".
Chacune des feuilles contiennent les même informations au niveau des colonnes : "A=Référence", "B=Ancienne Référence", "C=TITRE", "E=Rédacteur", "F=Service Emetteur".....plein d'autres colonnes mais qui ne m'intéresse pas dans l'extraction....et enfin, "S=Date de fin de validité" et "T= Obsolete", sauf pour la feuille "Ancien systeme" dont la colonne A est vide!
Je souhaite donc extraite les données des colonnes que j'ai nommés ci-dessus vers une autre feuille que j'appellerais "liste des obso" en donnant comme conditions que "OBSO" ou "FUTUR OBSO" soit dans la colonne "T=Obsolete" et que chaque extraction arrive à la suite de l'autre.
C'est à dire que l'extraction qui sera faite de la feuille ancien systeme soit en premier, que l'extraction de la feuille Procedure arrive à la première ligne vide et ainsi de suite.
Sub Macro1()
'
' Macro1 Macro
'
'
Rows("5:500").Select
Application.CutCopyMode = False
Selection.Delete Shift:=xlUp
Range("A5").Select
Sheets("Ancien Systeme").Select
ActiveSheet.Range("$B$1:$W$10").AutoFilter Field:=18, Criteria1:="<>"
ActiveWindow.SmallScroll Down:=-18
ActiveWindow.SmallScroll ToRight:=-3
Range("R3:S10").Select
ActiveWindow.SmallScroll ToRight:=-9
Range("R3:S10,B3:E10").Select
Range("E3").Activate
Selection.Copy
Sheets("Liste des Obso").Select
Range("B5").Select
ActiveSheet.Paste
Range("A12:G12").Select
Application.CutCopyMode = False
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
Selection.Borders(xlInsideVertical).LineStyle = xlNone
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent5
.TintAndShade = 0.799981688894314
.PatternTintAndShade = 0
End With
Sheets("Ancien Systeme").Select
ActiveWindow.ScrollColumn = 5
ActiveWindow.ScrollColumn = 6
ActiveWindow.ScrollColumn = 7
ActiveWindow.ScrollColumn = 11
ActiveWindow.ScrollColumn = 12
ActiveWindow.ScrollColumn = 13
ActiveWindow.ScrollColumn = 14
ActiveWindow.ScrollColumn = 15
ActiveWindow.ScrollColumn = 16
ActiveWindow.ScrollColumn = 17
ActiveWindow.ScrollColumn = 18
ActiveWindow.ScrollColumn = 19
ActiveSheet.Range("$B$1:$W$10").AutoFilter Field:=18
Sheets("Procedure").Select
ActiveSheet.Range("$A$1:$X$293").AutoFilter Field:=20, Criteria1:="<>"
ActiveWindow.SmallScroll Down:=-24
Range("S6:T267").Select
ActiveWindow.ScrollColumn = 16
ActiveWindow.ScrollColumn = 15
ActiveWindow.ScrollColumn = 14
ActiveWindow.ScrollColumn = 13
ActiveWindow.ScrollColumn = 12
ActiveWindow.ScrollColumn = 11
ActiveWindow.ScrollColumn = 10
ActiveWindow.ScrollColumn = 9
ActiveWindow.ScrollColumn = 8
ActiveWindow.ScrollColumn = 7
ActiveWindow.ScrollColumn = 6
ActiveWindow.ScrollColumn = 5
ActiveWindow.ScrollColumn = 3
ActiveWindow.ScrollColumn = 2
ActiveWindow.ScrollRow = 175
ActiveWindow.ScrollRow = 159
ActiveWindow.ScrollRow = 152
ActiveWindow.ScrollRow = 149
ActiveWindow.ScrollRow = 132
ActiveWindow.ScrollRow = 119
ActiveWindow.ScrollRow = 113
ActiveWindow.ScrollRow = 111
ActiveWindow.ScrollRow = 108
ActiveWindow.ScrollRow = 101
ActiveWindow.ScrollRow = 98
ActiveWindow.ScrollRow = 93
ActiveWindow.ScrollRow = 89
ActiveWindow.ScrollRow = 88
ActiveWindow.ScrollRow = 78
ActiveWindow.ScrollRow = 68
ActiveWindow.ScrollRow = 67
ActiveWindow.ScrollRow = 61
ActiveWindow.ScrollRow = 56
ActiveWindow.ScrollRow = 54
ActiveWindow.ScrollRow = 49
ActiveWindow.ScrollRow = 47
ActiveWindow.ScrollRow = 43
ActiveWindow.ScrollRow = 37
ActiveWindow.ScrollRow = 28
ActiveWindow.ScrollRow = 25
ActiveWindow.ScrollRow = 17
ActiveWindow.ScrollRow = 6
ActiveWindow.SmallScroll Down:=-9
Range("A6:F267").Select
Range("F6").Activate
ActiveWindow.ScrollColumn = 3
ActiveWindow.ScrollColumn = 4
ActiveWindow.ScrollColumn = 6
ActiveWindow.ScrollColumn = 7
ActiveWindow.ScrollColumn = 8
ActiveWindow.ScrollColumn = 9
ActiveWindow.ScrollColumn = 10
ActiveWindow.ScrollColumn = 11
ActiveWindow.ScrollColumn = 12
ActiveWindow.ScrollRow = 175
ActiveWindow.ScrollRow = 158
ActiveWindow.ScrollRow = 151
ActiveWindow.ScrollRow = 150
ActiveWindow.ScrollRow = 132
ActiveWindow.ScrollRow = 122
ActiveWindow.ScrollRow = 113
ActiveWindow.ScrollRow = 111
ActiveWindow.ScrollRow = 108
ActiveWindow.ScrollRow = 102
ActiveWindow.ScrollRow = 100
ActiveWindow.ScrollRow = 93
ActiveWindow.ScrollRow = 88
ActiveWindow.ScrollRow = 77
ActiveWindow.ScrollRow = 69
ActiveWindow.ScrollRow = 67
ActiveWindow.ScrollRow = 62
ActiveWindow.ScrollRow = 61
ActiveWindow.ScrollRow = 56
ActiveWindow.ScrollRow = 54
ActiveWindow.ScrollRow = 49
ActiveWindow.ScrollRow = 46
ActiveWindow.ScrollRow = 43
ActiveWindow.ScrollRow = 38
ActiveWindow.ScrollRow = 28
ActiveWindow.ScrollRow = 25
ActiveWindow.ScrollRow = 17
ActiveWindow.ScrollRow = 5
Range("A6:F267,S6:T267").Select
Range("S6").Activate
Selection.Copy
Sheets("Liste des Obso").Select
Cells(Range("K1"), 1).Select
ActiveSheet.Paste
ActiveWindow.SmallScroll Down:=48
Range("A63:G63").Select
Application.CutCopyMode = False
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
Selection.Borders(xlInsideVertical).LineStyle = xlNone
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent5
.TintAndShade = 0.799981688894314
.PatternTintAndShade = 0
End With
Sheets("Procedure").Select
ActiveSheet.Range("$A$1:$X$293").AutoFilter Field:=20
Sheets("Instruction").Select
ActiveWindow.ScrollColumn = 3
ActiveWindow.ScrollColumn = 4
ActiveWindow.ScrollColumn = 6
ActiveWindow.ScrollColumn = 7
ActiveWindow.ScrollColumn = 8
ActiveWindow.ScrollColumn = 9
ActiveWindow.ScrollColumn = 10
ActiveWindow.ScrollColumn = 11
ActiveWindow.ScrollColumn = 12
ActiveWindow.ScrollColumn = 13
Columns("S:U").Select
Selection.EntireColumn.Hidden = False
ActiveSheet.Range("$A$1:$Y$224").AutoFilter Field:=20, Criteria1:="<>"
ActiveWindow.SmallScroll Down:=-24
Range("S7:T168").Select
ActiveWindow.ScrollColumn = 12
ActiveWindow.ScrollColumn = 11
ActiveWindow.ScrollColumn = 10
ActiveWindow.ScrollColumn = 9
ActiveWindow.ScrollColumn = 8
ActiveWindow.ScrollColumn = 7
ActiveWindow.ScrollColumn = 6
ActiveWindow.ScrollColumn = 5
ActiveWindow.ScrollColumn = 3
ActiveWindow.ScrollColumn = 2
ActiveWindow.SmallScroll Down:=-72
Range("S7:T168,A7:F168").Select
Range("F7").Activate
Selection.Copy
Sheets("Liste des Obso").Select
Cells(Range("K1") + 1, 1).Select
ActiveSheet.Paste
Sheets("Instruction").Select
ActiveWindow.SmallScroll ToRight:=9
ActiveSheet.Range("$A$1:$Y$224").AutoFilter Field:=20
Sheets("Liste des Obso").Select
ActiveWindow.SmallScroll Down:=42
Range("A100:G100").Select
Application.CutCopyMode = False
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
Selection.Borders(xlInsideVertical).LineStyle = xlNone
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent5
.TintAndShade = 0.799981688894314
.PatternTintAndShade = 0
End With
Sheets("Liste").Select
ActiveWindow.ScrollColumn = 5
ActiveWindow.ScrollColumn = 6
ActiveWindow.ScrollColumn = 7
ActiveWindow.ScrollColumn = 8
ActiveWindow.ScrollColumn = 9
ActiveWindow.ScrollColumn = 10
ActiveWindow.ScrollColumn = 11
ActiveWindow.ScrollColumn = 12
ActiveWindow.ScrollColumn = 13
ActiveWindow.ScrollColumn = 14
ActiveWindow.ScrollColumn = 15
ActiveWindow.ScrollColumn = 16
ActiveWindow.ScrollColumn = 17
ActiveWindow.ScrollColumn = 16
Columns("R:T").Select
Selection.EntireColumn.Hidden = False
ActiveSheet.Range("$A$1:$V$64").AutoFilter Field:=19, Criteria1:="<>"
ActiveWindow.SmallScroll Down:=-27
Range("R7:S49").Select
ActiveWindow.ScrollColumn = 15
ActiveWindow.ScrollColumn = 14
ActiveWindow.ScrollColumn = 13
ActiveWindow.ScrollColumn = 12
ActiveWindow.ScrollColumn = 11
ActiveWindow.ScrollColumn = 10
ActiveWindow.ScrollColumn = 9
ActiveWindow.ScrollColumn = 7
ActiveWindow.ScrollColumn = 6
ActiveWindow.ScrollColumn = 5
ActiveWindow.ScrollColumn = 4
Range("R7:S49,A7:E49").Select
Range("E7").Activate
Selection.Copy
Sheets("Liste des Obso").Select
Cells(Range("K1") + 2, 1).Select
ActiveSheet.Paste
Sheets("Liste").Select
ActiveWindow.ScrollColumn = 5
ActiveWindow.ScrollColumn = 6
ActiveWindow.ScrollColumn = 7
ActiveWindow.ScrollColumn = 8
ActiveWindow.ScrollColumn = 9
ActiveWindow.ScrollColumn = 10
ActiveWindow.ScrollColumn = 11
ActiveWindow.ScrollColumn = 12
ActiveWindow.ScrollColumn = 13
ActiveWindow.ScrollColumn = 14
ActiveWindow.ScrollColumn = 15
ActiveSheet.Range("$A$1:$V$64").AutoFilter Field:=19
Sheets("Liste des Obso").Select
ActiveWindow.ScrollRow = 94
ActiveWindow.ScrollRow = 92
ActiveWindow.ScrollRow = 90
ActiveWindow.ScrollRow = 87
ActiveWindow.ScrollRow = 85
ActiveWindow.ScrollRow = 81
ActiveWindow.ScrollRow = 79
ActiveWindow.ScrollRow = 76
ActiveWindow.ScrollRow = 73
ActiveWindow.ScrollRow = 70
ActiveWindow.ScrollRow = 68
ActiveWindow.ScrollRow = 65
ActiveWindow.ScrollRow = 62
ActiveWindow.ScrollRow = 60
ActiveWindow.ScrollRow = 57
ActiveWindow.ScrollRow = 55
ActiveWindow.ScrollRow = 53
ActiveWindow.ScrollRow = 51
ActiveWindow.ScrollRow = 49
ActiveWindow.ScrollRow = 48
ActiveWindow.ScrollRow = 45
ActiveWindow.ScrollRow = 44
ActiveWindow.ScrollRow = 42
ActiveWindow.ScrollRow = 41
ActiveWindow.ScrollRow = 39
ActiveWindow.ScrollRow = 38
ActiveWindow.ScrollRow = 36
ActiveWindow.ScrollRow = 35
ActiveWindow.ScrollRow = 34
ActiveWindow.ScrollRow = 33
ActiveWindow.ScrollRow = 32
ActiveWindow.ScrollRow = 31
ActiveWindow.ScrollRow = 30
ActiveWindow.ScrollRow = 28
ActiveWindow.ScrollRow = 27
ActiveWindow.ScrollRow = 26
ActiveWindow.ScrollRow = 25
ActiveWindow.ScrollRow = 23
ActiveWindow.ScrollRow = 22
ActiveWindow.ScrollRow = 21
ActiveWindow.ScrollRow = 20
ActiveWindow.ScrollRow = 19
ActiveWindow.ScrollRow = 18
ActiveWindow.ScrollRow = 17
ActiveWindow.ScrollRow = 16
ActiveWindow.ScrollRow = 15
ActiveWindow.ScrollRow = 14
ActiveWindow.ScrollRow = 13
ActiveWindow.ScrollRow = 12
ActiveWindow.ScrollRow = 11
ActiveWindow.ScrollRow = 10
ActiveWindow.ScrollRow = 9
ActiveWindow.ScrollRow = 8
ActiveWindow.ScrollRow = 7
ActiveWindow.ScrollRow = 6
ActiveWindow.ScrollRow = 5
Columns("A:A").Select
Application.CutCopyMode = False
Selection.Hyperlinks.Delete
Range("A2").Select
End Sub
Voici le programme mais je pense qu'il doit y avoir une solution beaucoup plus simple que celle là.
En fait j'ai enregistré une suite de réalisation manuelle dans les différentes feuilles.
J'ai essayé de faire avec la fonction filtre élaboré mais je ne dois pas faire comme il faut car il me dit qua la plage n'est pas valide....
vous verrez aussi que j'ai essayé de mettre une ligne de séparation entre chaque type de documents mais ça ne marche pas parfaitement non plus....
Merci beaucoup pour votre aide.
virginie
Autres pages sur : extraire donnees plusieurs feuilles conditions vers feuille
- nini623 a édité ce message
Lassé par la pub ? Créez un compte
Salut,
Rhoooolala !
Ca se voit que tu t'es laissée guider par l'enregistreur de macro.
C'est un très bon début. Mais il manque le reste : le nettoyage du code.
Par exemple, les scrolls sont inutiles.
Or sur 392 lignes, on en trouve 214 !
Par principe, on s'interdit d'utiliser le presse-papier comme mémoire temporaire.
C'est une zone partagée entre toutes les applications du système. Imagine que tous les programmes en fassent autant.
Bonjour la pagaille. On va voir comment faire autrement.
Tu jongles entre plusieurs feuilles, et tu comptes sur le système pour que la feuille, la cellule que tu sélectionnes restent actives.
C'est faire fort confiance à Windows et Excel. Au moindre "popeupètvousur", ta macro est plantée.
Par ailleurs, tu sélectionnes tel objet puis tu agis sur la sélection. Ben et si tu agissais directement sur l'objet ?
Exemple :
(J'ai aussi viré le Shift inutile puisque très intelligemment, tu as utilisé Rows())
Ensuite, je voudrais bien savoir pourquoi tu fais des filters et des masquages de colonnes au fur et à mesure.
Bon, je te laisse nous proposer un code un peu nettoyé.
Ensuite le programme c'est : te montrer comment ne pas passer par le presse-papier en utilisant mieux la méthode Copy() et comment désigner tes objets sans passer par des sélections.
Rhoooolala !
Ca se voit que tu t'es laissée guider par l'enregistreur de macro.
C'est un très bon début. Mais il manque le reste : le nettoyage du code.
Par exemple, les scrolls sont inutiles.
Or sur 392 lignes, on en trouve 214 !
Par principe, on s'interdit d'utiliser le presse-papier comme mémoire temporaire.
C'est une zone partagée entre toutes les applications du système. Imagine que tous les programmes en fassent autant.
Bonjour la pagaille. On va voir comment faire autrement.
Tu jongles entre plusieurs feuilles, et tu comptes sur le système pour que la feuille, la cellule que tu sélectionnes restent actives.
C'est faire fort confiance à Windows et Excel. Au moindre "popeupètvousur", ta macro est plantée.
Par ailleurs, tu sélectionnes tel objet puis tu agis sur la sélection. Ben et si tu agissais directement sur l'objet ?
Exemple :
' // Pas terrible Rows("5:500").Select Selection.Delete Shift:=xlUp ' // Plus simple, plus logique, plus petit, plus... mieux Rows("5:500").Delete
(J'ai aussi viré le Shift inutile puisque très intelligemment, tu as utilisé Rows())
Ensuite, je voudrais bien savoir pourquoi tu fais des filters et des masquages de colonnes au fur et à mesure.
Bon, je te laisse nous proposer un code un peu nettoyé.
Ensuite le programme c'est : te montrer comment ne pas passer par le presse-papier en utilisant mieux la méthode Copy() et comment désigner tes objets sans passer par des sélections.
- zeb a édité ce message
- zeb a édité ce message
- | Alerter
zeb a dit :
Salut,Rhoooolala !
Ca se voit que tu t'es laissée guider par l'enregistreur de macro.
C'est un très bon début. Mais il manque le reste : le nettoyage du code.
Par exemple, les scrolls sont inutiles.
Or sur 392 lignes, on en trouve 214 !
Par principe, on s'interdit d'utiliser le presse-papier comme mémoire temporaire.
C'est une zone partagée entre toutes les applications du système. Imagine que tous les programmes en faisaient autant.
Bonjour la pagaille. On va voir comment faire autrement.
Tu jongles entre plusieurs feuilles, et tu comptes sur le système pour que la feuille, la cellule que tu sélectionnes restent actives.
C'est faire fort confiance à Windows et Excel. Au moindre "popeupètvousur", ta macro est plantée.
Par ailleurs, tu sélectionnes tel objet puis tu agis sur la sélection. Ben et si tu agissais directement sur l'objet ?
Exemple :
// Pas terrible Rows("5:500").Select Selection.Delete Shift:=xlUp // Plus simple, plus logique, plus petit, plus... mieux Rows("5:500").Delete
(J'ai aussi viré le Shift inutile puisque très intelligemment, tu as utilisé Rows())
Ensuite, je voudrais bien savoir pourquoi tu fais des filters et des masquages de colonnes au fur et à mesure.
Bon, je te laisse nous proposer un code un peu nettoyé.
Ensuite le programme c'est : te montrer comment ne pas passer par le presse-papier en utilisant mieux la méthode Copy() et comment désigner tes objets sans passer par des sélections.
Merci zeb,
Je me mets au travail et je reviens te montrer le résultat.
Oui, je travaille avec l'enregistreur de macro car j'ai eu une formation où l'on m'a beaucoup expliqué avec ce système. Je souhaitais une formation sur le language afin de mieux s'avoir l'appréhender et l'utiliser avant mais trop cher....
merci pour l'info du presse-papier, je ne savais pas.
Mais je vois que je suis pas si nulle que je le pensais, ça fait plaisir à lire et ça donne confiance.
Pour la question des filtres, c'est que dans cette colonne, je ne veux extraire que les données des lignes où il y a écrit "OBSO" ou "FUTUR OBSO" donc les cases de la colonne "obsolète" ne sont pas vide. Mais dans ces lignes, je ne veux à nouveau que extraire certaines colonnes, pas la ligne entière.
Je vais déjà faire ce que tu me dis et je te montre ce que ça donne début de semaine prochaine.
- nini623 a édité ce message
- | Alerter
bon, comme ça me titille d'avancer sur ce sujet, j'ai essayé de "nettoyer" mon code :
J'ai aussi enlevé l'histoire de mettre une ligne entre chaque extraction d'une feuille mais je n'ai pas dû enlever tout ce qu'il faut car il me mets encore une ligne mais vide cette fois entre chaque.
Je continue de regarder pour améliorer encore tout ça
Sub Actualiser()
'
' Macro1 Macro
'
'
Rows("5:500").Delete
Range("A5").Select
Sheets("Ancien Systeme").Select
ActiveSheet.Range("$B$1:$W$10").AutoFilter Field:=18, Criteria1:="<>"
Range("R3:S10").Select
Range("R3:S10,B3:E10").Select
Range("E3").Activate
Selection.Copy
Sheets("Liste des Obso").Select
Range("B5").Select
ActiveSheet.Paste
Sheets("Ancien Systeme").Select
ActiveSheet.Range("$B$1:$W$10").AutoFilter Field:=18
Sheets("Procedure").Select
ActiveSheet.Range("$A$1:$X$293").AutoFilter Field:=20, Criteria1:="<>"
Range("S6:T267").Select
Range("A6:F267").Select
Range("F6").Activate
Range("A6:F267,S6:T267").Select
Range("S6").Activate
Selection.Copy
Sheets("Liste des Obso").Select
Cells(Range("K1"), 1).Select
ActiveSheet.Paste
Sheets("Procedure").Select
ActiveSheet.Range("$A$1:$X$293").AutoFilter Field:=20
Sheets("Instruction").Select
Columns("S:U").Select
Selection.EntireColumn.Hidden = False
ActiveSheet.Range("$A$1:$Y$224").AutoFilter Field:=20, Criteria1:="<>"
Range("S7:T168").Select
Range("S7:T168,A7:F168").Select
Range("F7").Activate
Selection.Copy
Sheets("Liste des Obso").Select
Cells(Range("K1") + 1, 1).Select
ActiveSheet.Paste
Sheets("Instruction").Select
ActiveSheet.Range("$A$1:$Y$224").AutoFilter Field:=20
Sheets("Liste des Obso").Select
Sheets("Liste").Select
Columns("R:T").Select
Selection.EntireColumn.Hidden = False
ActiveSheet.Range("$A$1:$V$64").AutoFilter Field:=19, Criteria1:="<>"
Range("R7:S49").Select
Range("R7:S49,A7:E49").Select
Range("E7").Activate
Selection.Copy
Sheets("Liste des Obso").Select
Cells(Range("K1") + 2, 1).Select
ActiveSheet.Paste
Sheets("Liste").Select
ActiveSheet.Range("$A$1:$V$64").AutoFilter Field:=19
Sheets("Liste des Obso").Select
Columns("A:A").Select
Application.CutCopyMode = False
Selection.Hyperlinks.Delete
Range("A2").Select
End Sub
J'ai aussi enlevé l'histoire de mettre une ligne entre chaque extraction d'une feuille mais je n'ai pas dû enlever tout ce qu'il faut car il me mets encore une ligne mais vide cette fois entre chaque.
Je continue de regarder pour améliorer encore tout ça
- | Alerter
Contenus similaires
- Vba copier ligne autre feuille sous conditions - Forum
- Programme extraire musique youtube - Forum
- Excel recherchev plusieurs feuilles - Forum
- Comment changer systeme d exploitation - Forum
- | Alerter
Prenons le premier block.
Comme on a plusieurs feuilles, on va explicitement les nommer.
Bon, dans ton code, le filtre te permet de faire "disparaître" des lignes.
Mais la zone R3:S10,B3:E10 est calculé par Excel en fontion du filtre quand tu joues avec ta souris. Pas par macro !!!!
Il va falloir faire nous même cette manip'.
(D'où l'intérêt de ne pas faire de filtre par macro, d'où ma surprise d'en trouver dans ton code)
Q1) Quelle est la zone susceptible de contenir tes données à copier ?
Q2) Quel critère pour choisir une ligne ?
Q3) Quelles colonnes copier ?
Bon, admettons que la réponse à Q1 soit A1:W500
Pour Q2, c'est "OBSO" ou "FUTUR OBSO", disons dans la colonne R. (Mais ce pourrait être "une valeur dans la colonne J" par exemple.)
Pour l'exemple, on peut dire A, C, E, G
Or donc, on va parcourir toute la zone, ligne par ligne.
Pour chaque ligne on va vérifier si elle nous intéresse.
Puis on va la copier dans la liste des obso'.
Là en core un peu de préparation : où copier ?
Et voilà !
Étudie bien mon exemple. Et généralise pour ton cas.
Regarde bien cette histoire de "cible".
J'attends tes commentaires, tes questions et ton code revu et corrigé.
Pour le prix de 0€, tu vas l'avoir ta formation
(Mais t'as maintenant des devoirs à faire
)
Rows("5:500").Delete ' // De quelle feuille ? Range("A5").Select ' // Pour quoi faire ? Sheets("Ancien Systeme").Select ' // zeb à dit : pas de select ActiveSheet.Range("$B$1:$W$10").AutoFilter Field:=18, Criteria1:="<>" ' // A revoir Range("R3:S10").Select ' // Pour quoi faire ? Range("R3:S10,B3:E10").Select ' // Cette zone n'est pas fixe !!!!!!! Range("E3").Activate ' // Pour quoi faire ? Selection.Copy ' // zeb à dit : mieux utiliser la fonction Copy Sheets("Liste des Obso").Select ' // zeb à dit : pas de select Range("B5").Select ' // zeb à dit : pas de select ActiveSheet.Paste ' // zeb à dit : pas de presse-papier
Comme on a plusieurs feuilles, on va explicitement les nommer.
' // Préparation Dim f_as As Worksheet ' // Feuille Ancient Système Dim f_lo As Worksheet ' // Feuille liste des obso Dim f_my As Worksheet ' // Feuille mystère ??? Set f_as = Worksheets("Ancien Systeme") Set f_lo = Worksheets("Liste des Obso") Set f_my = ActiveSheet ' // Début f_my.Rows("5:500").Delete
Bon, dans ton code, le filtre te permet de faire "disparaître" des lignes.
Mais la zone R3:S10,B3:E10 est calculé par Excel en fontion du filtre quand tu joues avec ta souris. Pas par macro !!!!
Il va falloir faire nous même cette manip'.
(D'où l'intérêt de ne pas faire de filtre par macro, d'où ma surprise d'en trouver dans ton code)
Q1) Quelle est la zone susceptible de contenir tes données à copier ?
Q2) Quel critère pour choisir une ligne ?
Q3) Quelles colonnes copier ?
Bon, admettons que la réponse à Q1 soit A1:W500
Pour Q2, c'est "OBSO" ou "FUTUR OBSO", disons dans la colonne R. (Mais ce pourrait être "une valeur dans la colonne J" par exemple.)
Pour l'exemple, on peut dire A, C, E, G
Or donc, on va parcourir toute la zone, ligne par ligne.
Pour chaque ligne on va vérifier si elle nous intéresse.
Puis on va la copier dans la liste des obso'.
Là en core un peu de préparation : où copier ?
Dim cible As Range Set cible = f_lo.Range("A1") '// Peut être voudrais-tu commencer plus bas que la première ligne ?
Dim ligne as Range ' // 1 ligne Dim acopier as Range ' // Les cellules à copier For Each ligne In f_as.Rows("1:500") ' // La 18ème cellule d'une ligne est dans la colonne R If ligne.Cells(18).Value like "*OBSO" Then ' // A C E G Set acopier = Union(ligne.Cells(1), ligne.Cells(3), ligne.Cells(5), ligne.Cells(7)) acopier.Copy Destination:=cible Set cible = cible.Offset(1) End If Next
Et voilà !
Étudie bien mon exemple. Et généralise pour ton cas.
Regarde bien cette histoire de "cible".
J'attends tes commentaires, tes questions et ton code revu et corrigé.
Pour le prix de 0€, tu vas l'avoir ta formation
(Mais t'as maintenant des devoirs à faire
) - zeb a édité ce message
- | Alerter
ok pour le code, je vais faire mieux avec mon prochain devoir à corriger!
là maintenant le plus dur sera d'attendre lundi de retourner au boulot pour me plonger dans tout ce que tu viens de m'apprendre!!!!!!
le week end va être long du coup!!!
et merci, j'apprécie vraiment le coup de main pour comprendre ce que je suis en train d'essayer d'écrire!
là maintenant le plus dur sera d'attendre lundi de retourner au boulot pour me plonger dans tout ce que tu viens de m'apprendre!!!!!!
le week end va être long du coup!!!
et merci, j'apprécie vraiment le coup de main pour comprendre ce que je suis en train d'essayer d'écrire!
- | Alerter
Bonjour Zeb,
voilà, je me retrouve bloquée par un message erreur mais je ne comprends pas ce qu'il veut exactement :
Je voulais essayer si ce début marchait mais avec ce message erreur, je n'arrive pas à aller plus loin....
Tu verras que pour le moment, j'ai laissé tomber la feuille ancien système qui de toute façon ne comporte que 5 lignes et je peux facilement les inclure en fin de tableau quand la macro marchera pour les autres feuiles.
Je vais essayer de comprendre déjà ça et je la compliquerais par la suite!
en espérant ne pas trop te décevoir....
voilà, je me retrouve bloquée par un message erreur mais je ne comprends pas ce qu'il veut exactement :
Sub Actualiser() ' ' // Préparation Dim f_pr As Worksheet ' // Feuille Procedure Dim f_in As Worksheet ' // Feuille Instruction Dim f_fr As Worksheet ' // Feuille Formulaire Dim f_li As Worksheet ' // Feuille Liste Dim f_lo As Worksheet ' // Feuille liste des obso Set f_pr = Worksheets("Procedure") Set f_in = Worksheets("Instruction") Set f_fr = Worksheets("Formulaire") Set f_li = Worksheets("Liste") Set f_lo = ActiveSheet Dim cible As Range Dim cible = f_lo.Range ("A5") ' j'ai ce message à ce niveau là :"Erreur de compilation Attendu : fin d'instruction" Dim ligne As Range Dim acopier As Range ' // Début f_lo.Rows("5:500").Delete For Each ligne In f_pr.Rows("1:500") If ligne.Cells(19).Value Like "*OBSO" Then Set acopier = Union(ligne.Cells(1), ligne.Cells(2), ligne.Cells(3), ligne.Cells(4), ligne.Cells(5), ligne.Cells(18)) acopier.Copy Destination:=cible Set cible = cible.Offset(1) End If Next End Sub
Je voulais essayer si ce début marchait mais avec ce message erreur, je n'arrive pas à aller plus loin....
Tu verras que pour le moment, j'ai laissé tomber la feuille ancien système qui de toute façon ne comporte que 5 lignes et je peux facilement les inclure en fin de tableau quand la macro marchera pour les autres feuiles.
Je vais essayer de comprendre déjà ça et je la compliquerais par la suite!
en espérant ne pas trop te décevoir....
- | Alerter
Oh, c'est dommage d'avoir été bloquée par si peu.
Remplace *évidemment* Dim par Set à la ligne 18 et continue.
Tu aurais pu le voir quand même
Pour le reste, il me semble que tu as bien compris.
Où enregistres-tu cette fonction ? Dans le code d'une feuille, du classeur, d'un module ?
Dans VBA/Excel, regarde un peu l'aide sur l'Option Explicit et si ce n'est pas encore fait, utilise-la.
A te lire.
Remplace *évidemment* Dim par Set à la ligne 18 et continue.
Tu aurais pu le voir quand même
Spoiler
(ne pas cliquer sur spoiler)Tu remarqueras que j'ai lâchement édité mon message pour ne pas qu'on voit que l'erreur venait de moi
Pour le reste, il me semble que tu as bien compris.
Où enregistres-tu cette fonction ? Dans le code d'une feuille, du classeur, d'un module ?
Dans VBA/Excel, regarde un peu l'aide sur l'Option Explicit et si ce n'est pas encore fait, utilise-la.
A te lire.
- zeb a édité ce message
- zeb a édité ce message
- | Alerter
zeb a dit :
Oh, c'est dommage d'avoir été bloquée par si peu.
Remplace *évidemment* Dim par Set à la ligne 18 et continue.
Tu aurais pu le voir quand même
Spoiler
(ne pas cliquer sur spoiler)Tu remarqueras que j'ai lâchement édité mon message pour ne pas qu'on voit que l'erreur venait de moi
Pour le reste, il me semble que tu as bien compris.
Où enregistres-tu cette fonction ? Dans le code d'une feuille, du classeur, d'un module ?
Dans VBA/Excel, regarde un peu l'aide sur l'Option Explicit et si ce n'est pas encore fait, utilise-la.
A te lire.
promis, je n'ai pas lu ton spoiler!!
J'enregistre cette fonction dans un module et j'ai créé un bouton dans la feuille "liste des obso" auquel j'ai relié la macro. C'est bien ou il y a mieux à faire?
Je ne connaissais pas l'option explicit, je m'en vais de ce pas voir ce que c'est et continuer le code!
- | Alerter
Ton code est associé à ta feuille "Liste des obso". Alors mets-le donc là !
Ou bien laisse-le là où il est, ce n'est pas plus mal
Mais par contre, la ligne 15, ce n'est pas bon !
Par principe, Il ne faut pas faire confiance à ce qui est actif à un moment donné.
Je te laisse corriger ça.
Pour info, si tu avais mis ta fonction dans le code de la feuille, tu aurais pu utiliser le mot-clef me qui se rapporte à la feuille, et ainsi te dispenser de déclarer f_lo. C'est un point de détail. Mais puisque tu es là pour apprendre...
Ou bien laisse-le là où il est, ce n'est pas plus mal
Mais par contre, la ligne 15, ce n'est pas bon !
Par principe, Il ne faut pas faire confiance à ce qui est actif à un moment donné.
Set f_lo = ActiveSheet
Je te laisse corriger ça.
Pour info, si tu avais mis ta fonction dans le code de la feuille, tu aurais pu utiliser le mot-clef me qui se rapporte à la feuille, et ainsi te dispenser de déclarer f_lo. C'est un point de détail. Mais puisque tu es là pour apprendre...
- | Alerter
Bon, je dois faire un truc qui ne va pas....
j'ai mis le code dans la feuille et j'ai donc utilisé le mot clé Me.
J'ai donc supprimé le module existant.
Mais j'ai dû supprimer quelque chose qu'il ne fallait pas....
Voici mon code :
j'ai mis le code dans la feuille et j'ai donc utilisé le mot clé Me.
J'ai donc supprimé le module existant.
Mais j'ai dû supprimer quelque chose qu'il ne fallait pas....
Voici mon code :
Sub Actualiser() ' ' // Préparation Dim f_pr As Worksheet ' // Feuille Procedure Dim f_in As Worksheet ' // Feuille Instruction Dim f_fr As Worksheet ' // Feuille Formulaire Dim f_li As Worksheet ' // Feuille Liste Set f_pr = Worksheets("Procedure") Set f_in = Worksheets("Instruction") Set f_fr = Worksheets("Formulaire") Set f_li = Worksheets("Liste") Dim cible As Range Set cible = Me.Range("A5") Dim ligne As Range Dim acopier As Range ' // Début Me.Rows("5:500").Delete For Each ligne In f_pr.Rows("1:500") If ligne.Cells(19).Value Like "*OBSO" Then Set acopier = Union(ligne.Cells(1), ligne.Cells(2), ligne.Cells(3), ligne.Cells(4), ligne.Cells(5), ligne.Cells(18)) acopier.Copy Destination:=cible Set cible = cible.Offset(1) End If Next For Each ligne In f_in.Rows("1:500") If ligne.Cells(19).Value Like "*OBSO" Then Set acopier = Union(ligne.Cells(1), ligne.Cells(2), ligne.Cells(3), ligne.Cells(4), ligne.Cells(5), ligne.Cells(18)) acopier.Copy Destination:=cible Set cible = cible.Offset(1) End If Next For Each ligne In f_fr.Rows("1:500") If ligne.Cells(19).Value Like "*OBSO" Then Set acopier = Union(ligne.Cells(1), ligne.Cells(2), ligne.Cells(3), ligne.Cells(4), ligne.Cells(5), ligne.Cells(18)) acopier.Copy Destination:=cible Set cible = cible.Offset(1) End If Next For Each ligne In f_li.Rows("1:500") If ligne.Cells(19).Value Like "*OBSO" Then Set acopier = Union(ligne.Cells(1), ligne.Cells(2), ligne.Cells(3), ligne.Cells(4), ligne.Cells(5), ligne.Cells(18)) acopier.Copy Destination:=cible Set cible = cible.Offset(1) End If Next End Sub
- | Alerter
j'ai remis le code dans un module, histoire déjà de comprendre ce qui ne va pas.
ensuite j'essaierais de simplifier.
je suis en train de chercher ce qui cloche en même temps et j'apprend les définitions de certains termes pour comprendre à quoi ils servent car j'avoue que la fonction "Set cible = cible.Offset(1)" m'étais inconnue....
ensuite j'essaierais de simplifier.
je suis en train de chercher ce qui cloche en même temps et j'apprend les définitions de certains termes pour comprendre à quoi ils servent car j'avoue que la fonction "Set cible = cible.Offset(1)" m'étais inconnue....
Option Explicit Sub Actualiser() ' ' // Préparation Dim f_pr As Worksheet ' // Feuille Procedure Dim f_in As Worksheet ' // Feuille Instruction Dim f_fr As Worksheet ' // Feuille Formulaire Dim f_li As Worksheet ' // Feuille Liste Dim f_lo As Worksheet ' // Feuille Liste des Obso Set f_pr = Worksheets("Procedure") Set f_in = Worksheets("Instruction") Set f_fr = Worksheets("Formulaire") Set f_li = Worksheets("Liste") Set f_lo = Worksheets("Liste des Obso") Dim cible As Range Set cible = f_lo.Range("A5") Dim ligne As Range Dim acopier As Range ' // Début f_lo.Rows("5:500").Delete For Each ligne In f_pr.Rows("1:500") If ligne.Cells(19).Value Like "*OBSO" Then Set acopier = Union(ligne.Cells(1), ligne.Cells(2), ligne.Cells(3), ligne.Cells(4), ligne.Cells(5), ligne.Cells(18)) acopier.Copy Destination:=cible Set cible = cible.Offset(1) End If Next For Each ligne In f_in.Rows("1:500") If ligne.Cells(19).Value Like "*OBSO" Then Set acopier = Union(ligne.Cells(1), ligne.Cells(2), ligne.Cells(3), ligne.Cells(4), ligne.Cells(5), ligne.Cells(18)) acopier.Copy Destination:=cible Set cible = cible.Offset(1) End If Next For Each ligne In f_fr.Rows("1:500") If ligne.Cells(19).Value Like "*OBSO" Then Set acopier = Union(ligne.Cells(1), ligne.Cells(2), ligne.Cells(3), ligne.Cells(4), ligne.Cells(5), ligne.Cells(18)) acopier.Copy Destination:=cible 'j'ai le message erreur d'exécution '1004' la méthode Copy de la classe Range a échoué Set cible = cible.Offset(1) End If Next For Each ligne In f_li.Rows("1:500") If ligne.Cells(19).Value Like "*OBSO" Then Set acopier = Union(ligne.Cells(1), ligne.Cells(2), ligne.Cells(3), ligne.Cells(4), ligne.Cells(5), ligne.Cells(18)) acopier.Copy Destination:=cible Set cible = cible.Offset(1) End If Next End Sub
- nini623 a édité ce message
- | Alerter
- | Alerter
salut zeb,
ça marche, mais à moitié.
Il me place bien les données de la feuille formulaire et Liste mais pas les données les données des deux premières feuilles.
ça marche, mais à moitié.
Il me place bien les données de la feuille formulaire et Liste mais pas les données les données des deux premières feuilles.
Option Explicit Sub Actualiser() ' ' // Préparation Dim f_pr As Worksheet ' // Feuille Procedure Dim f_in As Worksheet ' // Feuille Instruction Dim f_fr As Worksheet ' // Feuille Formulaire Dim f_li As Worksheet ' // Feuille Liste Dim f_lo As Worksheet ' // Feuille Liste des Obso Set f_pr = Worksheets("Procedure") Set f_in = Worksheets("Instruction") Set f_fr = Worksheets("Formulaire") Set f_li = Worksheets("Liste") Set f_lo = Worksheets("Liste des Obso") 'nettoyage de la feille f_lo.Rows("5:500").Delete ' définition de la cible Dim cible As Range Set cible = f_lo.Range("A5") Dim ligne As Range Dim acopier As Range For Each ligne In f_pr.Rows("1:500") If ligne.Cells(19).Value Like "*OBSO" Then Set acopier = Union(ligne.Cells(1), ligne.Cells(2), ligne.Cells(3), ligne.Cells(4), ligne.Cells(5), ligne.Cells(18), ligne.Cells(19)) acopier.Copy Destination:=cible Set cible = cible.Offset(1) End If Next For Each ligne In f_in.Rows("1:500") If ligne.Cells(19).Value Like "*OBSO" Then Set acopier = Union(ligne.Cells(1), ligne.Cells(2), ligne.Cells(3), ligne.Cells(4), ligne.Cells(5), ligne.Cells(18), ligne.Cells(19)) acopier.Copy Destination:=cible Set cible = cible.Offset(1) End If Next For Each ligne In f_fr.Rows("1:500") If ligne.Cells(19).Value Like "*OBSO" Then Set acopier = Union(ligne.Cells(1), ligne.Cells(2), ligne.Cells(3), ligne.Cells(4), ligne.Cells(5), ligne.Cells(18), ligne.Cells(19)) acopier.Copy Destination:=cible Set cible = cible.Offset(1) End If Next For Each ligne In f_li.Rows("1:500") If ligne.Cells(19).Value Like "*OBSO" Then Set acopier = Union(ligne.Cells(1), ligne.Cells(2), ligne.Cells(3), ligne.Cells(4), ligne.Cells(5), ligne.Cells(18), ligne.Cells(19)) acopier.Copy Destination:=cible Set cible = cible.Offset(1) End If Next End Sub
- | Alerter
Salut,
>> ça marche,
Ah...
>> mais à moitié.
Ohhh
--------
Respecte bien le principe d'indentation. Par exemple, tes lignes 33, 34, 35 doivent être tabulées une fois de plus.
Oui, je sais, c'est du pinaillage. Mais n'es-tu pas là pour apprendre :à
--------
Mets l'instruction Stop (va voir dans l'aide à quoi elle sert. Je me dis que tu peux quand même deviner
) entre les lignes 37 et 38.
Relance. Et arrête ta macro. Ceci pour se concentrer sur la première partie du code.
Vérifie que tu as bien des lignes qui contiennent "OBSO" dans la cellule 19, sans espace après, etc.
Fais-toi un classeur de test pour en être sûr. Ajoute une ligne 1 que tu rempliras à la main et apprends à déboguer toute seule (*) : http://www.presence-pc.com/forum/ppc/Programmation/tuto...
______
(*) Je reste là, hein
>> ça marche,
Ah...
>> mais à moitié.
Ohhh
--------
Respecte bien le principe d'indentation. Par exemple, tes lignes 33, 34, 35 doivent être tabulées une fois de plus.
Oui, je sais, c'est du pinaillage. Mais n'es-tu pas là pour apprendre :à
--------
Mets l'instruction Stop (va voir dans l'aide à quoi elle sert. Je me dis que tu peux quand même deviner
) entre les lignes 37 et 38.Relance. Et arrête ta macro. Ceci pour se concentrer sur la première partie du code.
Vérifie que tu as bien des lignes qui contiennent "OBSO" dans la cellule 19, sans espace après, etc.
Fais-toi un classeur de test pour en être sûr. Ajoute une ligne 1 que tu rempliras à la main et apprends à déboguer toute seule (*) : http://www.presence-pc.com/forum/ppc/Programmation/tuto...
______
(*) Je reste là, hein
- | Alerter
hello!!
voilà, tout le programme marche!
je suis super contente d'avoir réussi, merci beaucoup pour ton aide si précieuse!!!
j'ai juste une dernière question, sur un autre fichier, j'ai créé une autre macro qui marche, grâce à ce que j'ai appris ici!
mais j'ai voulu y incure un bouton "QUITTER" pour femer le fichier ouvert. Sauf que biensûr, j'ai mis "application.quit" donc il me ferme tous les fichiers excel ouvert ....
Il faut que je définisse mon fichier et ensuite que je lui dise de le fermer, c'est ça?
voilà, tout le programme marche!je suis super contente d'avoir réussi, merci beaucoup pour ton aide si précieuse!!!
j'ai juste une dernière question, sur un autre fichier, j'ai créé une autre macro qui marche, grâce à ce que j'ai appris ici!
mais j'ai voulu y incure un bouton "QUITTER" pour femer le fichier ouvert. Sauf que biensûr, j'ai mis "application.quit" donc il me ferme tous les fichiers excel ouvert ....
Il faut que je définisse mon fichier et ensuite que je lui dise de le fermer, c'est ça?
- | Alerter
finalement, j'ai autre chose à te demander.....
voilà, j'ai utilisé le code dans un autre fichier semblable mais on m'a demandé de pouvoir trier les documents par service émetteur et par condition. J'ai immédiatement pensé à inclure deux autres userform avec combobox pour utiliser une liste de choix et aller copier les réponses dans la feuille et utiliser ces réponses comme données d'entrée de mon tri en colonne L et M.
Mon soucis est le bout de code " If ligne.Cells(20).Value Like "*OBSO" Then" car j'aimerais qu'il aille chercher la valeur a un endroit donné et non pas la définir directement dans le code et lui ajouter le choix du service émetteur.
L'endroit donné étant défini grâce à mes userform 10 et 11 dans le code.
voilà, j'ai utilisé le code dans un autre fichier semblable mais on m'a demandé de pouvoir trier les documents par service émetteur et par condition. J'ai immédiatement pensé à inclure deux autres userform avec combobox pour utiliser une liste de choix et aller copier les réponses dans la feuille et utiliser ces réponses comme données d'entrée de mon tri en colonne L et M.
Mon soucis est le bout de code " If ligne.Cells(20).Value Like "*OBSO" Then" car j'aimerais qu'il aille chercher la valeur a un endroit donné et non pas la définir directement dans le code et lui ajouter le choix du service émetteur.
L'endroit donné étant défini grâce à mes userform 10 et 11 dans le code.
Private Sub CommandButton8_Click() ' ' // Préparation Dim f_pr As Worksheet ' // Feuille Procedure Dim f_in As Worksheet ' // Feuille Instruction Dim f_fr As Worksheet ' // Feuille Formulaire Dim f_li As Worksheet ' // Feuille Liste Dim f_lo As Worksheet ' // Feuille Extraction Obso Set f_pr = Worksheets("Procedure") Set f_in = Worksheets("Instruction") Set f_fr = Worksheets("Formulaire") Set f_li = Worksheets("Liste") Set f_lo = Worksheets("Extraction Obso") 'nettoyage de la feille f_lo.Rows("2:500").Delete 'définition des valeurs service et condition UserForm10.Show '// mets la valeurs de la condition en L2 de la Feuille Extraction Obso UserForm11.Show '// mets la valeurs du service émetteur en M2 de la Feuille Extraction Obso ' définition de la cible Dim cible As Range Set cible = f_lo.Range("A2") Dim ligne As Range Dim acopier As Range For Each ligne In f_pr.Rows("1:500") If ligne.Cells(20).Value Like "*OBSO" Then Set acopier = Union(ligne.Cells(1), ligne.Cells(2), ligne.Cells(3), ligne.Cells(5), ligne.Cells(6), ligne.Cells(19), ligne.Cells(20)) acopier.Copy Destination:=cible Set cible = cible.Offset(1) End If Next For Each ligne In f_in.Rows("1:500") If ligne.Cells(20).Value Like "*OBSO" Then Set acopier = Union(ligne.Cells(1), ligne.Cells(2), ligne.Cells(3), ligne.Cells(5), ligne.Cells(6), ligne.Cells(19), ligne.Cells(20)) acopier.Copy Destination:=cible Set cible = cible.Offset(1) End If Next For Each ligne In f_fr.Rows("1:500") If ligne.Cells(19).Value Like "*OBSO" Then Set acopier = Union(ligne.Cells(1), ligne.Cells(2), ligne.Cells(3), ligne.Cells(4), ligne.Cells(5), ligne.Cells(18), ligne.Cells(19)) acopier.Copy Destination:=cible Set cible = cible.Offset(1) End If Next For Each ligne In f_li.Rows("1:500") If ligne.Cells(19).Value Like "*OBSO" Then Set acopier = Union(ligne.Cells(1), ligne.Cells(2), ligne.Cells(3), ligne.Cells(4), ligne.Cells(5), ligne.Cells(18), ligne.Cells(19)) acopier.Copy Destination:=cible Set cible = cible.Offset(1) End If Next Sheets("Extraction Obso").Select Range("A1").Select UserForm1.Hide End Sub
- nini623 a édité ce message
- nini623 a édité ce message
- | Alerter
Salut,
Eh, moi aussi je suis content que ça marche
Douillou spique angliche ?
Parce que quitter, ça se dit to quit et fermer, ça se dit to close.
Or toi, tu ne veux pas quitter l'application, tu veux fermer ton classeur. Alors tu prends ton classeur (tip: c'est un workbook) et tu le fermes.
-----------------------------
Bon, je suis informaticien et je n'aime vraiment pas faire deux fois la même chose. Alors quand je vois que nous faisons 4 fois la même choses... argggh ! X_x
Regarde ça :
Bon, il y a une monstruosité dans ce code. C'est le Rows("1:500"). D'où sort ce 500 ?
(Si je lève le lièvre, c'est que j'ai des trucs à te montrer
T'es toujours là pour apprendre ?)
-----------------------------
Bon, donc attention. Le code proposé avec l'opérateur Like est encore un truc de fainéantinformaticien pour ne pas trop en écrire. LIKE "*MOT" signifie : qui se termine par "MOT". Or maintenant, ce mot est à chercher dans une cellule, ce n'est pas pareil.
Il faudra écrire : Value = "MOT"
Où est MOT ?
Dans une cellule :
Dans une variable :
Qu'est-ce que le service émetteur ?
Une autre colonne ?
Bon :
Eh, moi aussi je suis content que ça marche
Douillou spique angliche ?
Parce que quitter, ça se dit to quit et fermer, ça se dit to close.
Or toi, tu ne veux pas quitter l'application, tu veux fermer ton classeur. Alors tu prends ton classeur (tip: c'est un workbook) et tu le fermes.
-----------------------------
Bon, je suis informaticien et je n'aime vraiment pas faire deux fois la même chose. Alors quand je vois que nous faisons 4 fois la même choses... argggh ! X_x
Regarde ça :
Dim feuille As Worksheet For Each feuille In Array(f_pr, f_in, f_fr, f_li) For Each ligne In feuille.Rows("1:500") If ligne.Cells(20).Value Like "*OBSO" Then Set acopier = Nothing For Each i In Array(1, 2, 3, 5, 6, 19, 20) Set acopier = IIf(acopier Is Nothing, ligne.Cells(i), Union(acopier, ligne.Cells(i))) Next acopier.Copy Destination:=cible Set cible = cible.Offset(1) End If Next Next
Bon, il y a une monstruosité dans ce code. C'est le Rows("1:500"). D'où sort ce 500 ?
(Si je lève le lièvre, c'est que j'ai des trucs à te montrer
T'es toujours là pour apprendre ?)-----------------------------
Bon, donc attention. Le code proposé avec l'opérateur Like est encore un truc de fainéantinformaticien pour ne pas trop en écrire. LIKE "*MOT" signifie : qui se termine par "MOT". Or maintenant, ce mot est à chercher dans une cellule, ce n'est pas pareil.
Il faudra écrire : Value = "MOT"
Où est MOT ?
Dans une cellule :
Value = feuille.Range("Xn")
Dans une variable :
Dim Xn As String Value = Xn
Qu'est-ce que le service émetteur ?
Une autre colonne ?
Bon :
If ligne.Cells(20).Value = "MOT" And ligne.Cells(autre_colonne).Value = "service émetteur" Then ..
- | Alerter
yes, i speak english very well (
) but sometimes my blonde highlights stand out....
avec un close, ça va beaucoup mieux.....
"Bon, il y a une monstruosité dans ce code. C'est le Rows("1:500"). D'où sort ce 500 ?
(Si je lève le lièvre, c'est que j'ai des trucs à te montrer T'es toujours là pour apprendre ?)"
OUI OUI, je suis toujours là pour apprendre! of course!!!!
le 500, c'est juste pour sélectionner un certains nombre de ligne..... et j'ai pris large pour être sûre de tout sélectionner....
Pour une question d'estétique du fichier, je démarre ma macro d'une feuille qui s'appelle Menu dans laquelle j'ai placé un bouton relié à cette macro.
Pour la condition et le service émetteur, je les place grâce à combobox dans les cellules L2 et M2 de la feuille "Extraction Obso" ou f_lo puisse que nous l'avons définie ainsi.
Donc, quand je clique sur mon bouton d'extraction (situé dans la feuille Menu), une première fenêtre me propose de choisir entre trois conditions : OBSO, FUTUR OBSO ou *OBSO (et place celle choisie dans la case L2 de la feuille f_lo puis une deuxième fenêtre me demande de choisir le service concerné : Achats, AQ, CQ, Info, Maintenance, Logistique.....etc (et place celui choisi dans la case M2 de la feuille f_lo)
Maintenant, il faut extraire de toutes les feuilles f_pr, f_in, f_fr, f_li les colonnes voulues des lignes qui remplissent ces deux conditions et les placer les unes à la suite des autres dans la feuille "Extraction Obso".
Le service émetteur se situe dans la colonne 6 et la condition dans la colonne 20 de chaque feuille.
Voilà, ça te donne plus d'infos sur ma façon d'exécuter la macro.
) but sometimes my blonde highlights stand out....
avec un close, ça va beaucoup mieux.....
"Bon, il y a une monstruosité dans ce code. C'est le Rows("1:500"). D'où sort ce 500 ?
(Si je lève le lièvre, c'est que j'ai des trucs à te montrer T'es toujours là pour apprendre ?)"
OUI OUI, je suis toujours là pour apprendre! of course!!!!
le 500, c'est juste pour sélectionner un certains nombre de ligne..... et j'ai pris large pour être sûre de tout sélectionner....
Pour une question d'estétique du fichier, je démarre ma macro d'une feuille qui s'appelle Menu dans laquelle j'ai placé un bouton relié à cette macro.
Pour la condition et le service émetteur, je les place grâce à combobox dans les cellules L2 et M2 de la feuille "Extraction Obso" ou f_lo puisse que nous l'avons définie ainsi.
Donc, quand je clique sur mon bouton d'extraction (situé dans la feuille Menu), une première fenêtre me propose de choisir entre trois conditions : OBSO, FUTUR OBSO ou *OBSO (et place celle choisie dans la case L2 de la feuille f_lo puis une deuxième fenêtre me demande de choisir le service concerné : Achats, AQ, CQ, Info, Maintenance, Logistique.....etc (et place celui choisi dans la case M2 de la feuille f_lo)
Maintenant, il faut extraire de toutes les feuilles f_pr, f_in, f_fr, f_li les colonnes voulues des lignes qui remplissent ces deux conditions et les placer les unes à la suite des autres dans la feuille "Extraction Obso".
Le service émetteur se situe dans la colonne 6 et la condition dans la colonne 20 de chaque feuille.
Voilà, ça te donne plus d'infos sur ma façon d'exécuter la macro.
- | Alerter
500 pour faire large. Mauvaise réponse !
D'abord la leçon : http://www.presence-pc.com/forum/ppc/Programmation/tuto...
Ensuite l'exercice. Remplace dans ton code le nombre 500 par le nombre exact de lignes.
Les questions (pertinentes) sont les bienvenues.
------------------------------
"*OBSO" est-ce une valeur ou bien est-ce pour dire que seules les dernières lettres sont significatives ?
Dans le premier cas, on mettra un signe égal dans la clause If, dans l'autre on laissera le Like.
------------------------------
Je ne vois pas ce qui te bloque pour que tu le fasses toi-même.
A la rigueur, propose un truc - même s'il ne marche pas, et on en discute.
D'abord la leçon : http://www.presence-pc.com/forum/ppc/Programmation/tuto...
Ensuite l'exercice. Remplace dans ton code le nombre 500 par le nombre exact de lignes.
Les questions (pertinentes) sont les bienvenues.
------------------------------
"*OBSO" est-ce une valeur ou bien est-ce pour dire que seules les dernières lettres sont significatives ?
Dans le premier cas, on mettra un signe égal dans la clause If, dans l'autre on laissera le Like.
------------------------------
Je ne vois pas ce qui te bloque pour que tu le fasses toi-même.
A la rigueur, propose un truc - même s'il ne marche pas, et on en discute.
- | Alerter
ben c'est que mon nombre de lignes varie toujours, donc pour être sûre de prendre "tout le monde", j'ai mis 500....
merci pour le tutoriel, j'irais zieuter pour améliorer ma mauvaise réponse et essayer d'en proposer une meilleure!
pour le "*OBSO", non, c'est que dans une colonne, j'ai une condition en fonction des dates. Mes documents sont valides un certain temps donc pour pouvoir faire ressortir les documents devenu obsolète et les document arrivant a obsolescence dans les 3 prochains mois, j'ai mis une formule dans une colonne qui me donne de ce fait soit OBSO soit FUTUR OBSO. Et du coup, pour choisir les deux conditions, ben je mets "*OBSO" pour rechercher les lignes qui contiennent le mot OBSO.
Mais comme rien est simple, forcément, il faut pouvoir extraire soit OBSO, soit FUTUR OBSO, soit les deux!
et par service en plus, car chaque service veut pouvoir faire cette extraction pour son propre service et pas être pollué par les documents des autres services.
Pour répondre à ta question sur ce qui me bloque, pour l'instant, c'est le temps que je peux consacrer sans être déranger au bureau. Dans un bureau de trois avec du passage, c'est difficile de se concentrer et du coup, il y a des moments où tout se mélange et devient du chinois pour moi....
Mais je ne désespère pas
, je mets à profit les moments du midi et la fin d'après-midi quand je peux fermer la porte du bureau et ainsi m'isoler. Malheureusement, ça ne me laisse pas énormément de temps...
enfin, bref, je ne vais pas raconter ma vie, je ne suis pas ici pour ça.
J'ai essayé qlq chose ce midi mais j'ai un message erreur, je posterais mon code revu et réduit
j'espère demain ou vendredi pour voir ce que tu en penses.
Merci pour ta patience!
merci pour le tutoriel, j'irais zieuter pour améliorer ma mauvaise réponse et essayer d'en proposer une meilleure!
pour le "*OBSO", non, c'est que dans une colonne, j'ai une condition en fonction des dates. Mes documents sont valides un certain temps donc pour pouvoir faire ressortir les documents devenu obsolète et les document arrivant a obsolescence dans les 3 prochains mois, j'ai mis une formule dans une colonne qui me donne de ce fait soit OBSO soit FUTUR OBSO. Et du coup, pour choisir les deux conditions, ben je mets "*OBSO" pour rechercher les lignes qui contiennent le mot OBSO.
Mais comme rien est simple, forcément, il faut pouvoir extraire soit OBSO, soit FUTUR OBSO, soit les deux!
et par service en plus, car chaque service veut pouvoir faire cette extraction pour son propre service et pas être pollué par les documents des autres services.
Pour répondre à ta question sur ce qui me bloque, pour l'instant, c'est le temps que je peux consacrer sans être déranger au bureau. Dans un bureau de trois avec du passage, c'est difficile de se concentrer et du coup, il y a des moments où tout se mélange et devient du chinois pour moi....
Mais je ne désespère pas
, je mets à profit les moments du midi et la fin d'après-midi quand je peux fermer la porte du bureau et ainsi m'isoler. Malheureusement, ça ne me laisse pas énormément de temps...enfin, bref, je ne vais pas raconter ma vie, je ne suis pas ici pour ça.
J'ai essayé qlq chose ce midi mais j'ai un message erreur, je posterais mon code revu et réduit
j'espère demain ou vendredi pour voir ce que tu en penses.Merci pour ta patience!
- | Alerter
- | Alerter
zeb a dit :
Ma patience ?! Elle est infinie. Ici c'est un forum, pas un tchat. Aucun problème de longueur de temps.(T'as qu'à voir ma réaction quand un guguss met "URGENT !!!!!!!!!!!" dans le titre de son sujet
)A te lire.
Bonjour Zeb,
dans un premier temps, j'ai essayé de simplifier mais je dois zapper qlq chose ou j'ai pas compris....:/
J'ai noté dans le code le message erreur :
Private Sub CommandButton8_Click() ' ' // Préparation Dim f_pr As Worksheet ' // Feuille Procedure Dim f_in As Worksheet ' // Feuille Instruction Dim f_fr As Worksheet ' // Feuille Formulaire Dim f_li As Worksheet ' // Feuille Liste Dim f_lo As Worksheet ' // Feuille Extraction Obso Set f_pr = Worksheets("Procedure") Set f_in = Worksheets("Instruction") Set f_fr = Worksheets("Formulaire") Set f_li = Worksheets("Liste") Set f_lo = Worksheets("Extraction Obso") 'nettoyage de la feuille f_lo.Rows("2:500").Delete 'définition des valeurs service et condition UserForm10.Show '// mets la valeurs de la condition en L2 de la Feuille Extraction Obso UserForm11.Show '// mets la valeurs du service émetteur en M2 de la Feuille Extraction Obso ' définition de la cible Dim cible As Range Set cible = f_lo.Range("A2") Dim ligne As Range Dim acopier As Range Dim feuille As Worksheet For Each feuille In Array(f_pr, f_in, f_fr, f_li) 'message d'erreur 424 objet requis For Each ligne In feuille.Rows("1:500") If ligne.Cells(20).Value Like "*OBSO" Then Set acopier = Nothing For Each i In Array(1, 2, 3, 5, 6, 19, 20) Set acopier = IIf(acopier Is Nothing, ligne.Cells(i), Union(acopier, ligne.Cells(i))) Next acopier.Copy Destination:=cible Set cible = cible.Offset(1) End If Next Next Sheets("Extraction Obso").Select Range("A1").Select UserForm1.Hide End Sub
- | Alerter
Oups.
Ce n'est pas ta faute.
C'est la mienne - un peu - car je n'ai pas vérifié.
Et c'est celle de Microsoft - beaucoup, énormément - parce que ces sal
rds n'ont pas fini le modèle objet de leur langage.
Bref.
De façon assez dégueulasse pas jolie, remplace la ligne 34 par :
Ce n'est pas ta faute.
C'est la mienne - un peu - car je n'ai pas vérifié.
Et c'est celle de Microsoft - beaucoup, énormément - parce que ces sal
rds n'ont pas fini le modèle objet de leur langage.
Bref.
De façon assez dégueulasse pas jolie, remplace la ligne 34 par :
Dim feuille As Worksheet ' <-- Pas bon :( Dim feuille As Variant ' <-- Bon --- :( Quoi que
- zeb a édité ce message
- | Alerter
yes, j'ai trouvé aussi! en cherchant bien, des fois on trouve!!
maintenant, je cherche la solution au nouveau message erreur.... lol
je suis en train de regarder dans l'aide
maintenant, je cherche la solution au nouveau message erreur.... lol
je suis en train de regarder dans l'aide
Private Sub CommandButton8_Click() ' ' // Préparation Dim f_pr As Worksheet ' // Feuille Procedure Dim f_in As Worksheet ' // Feuille Instruction Dim f_fr As Worksheet ' // Feuille Formulaire Dim f_li As Worksheet ' // Feuille Liste Dim f_lo As Worksheet ' // Feuille Extraction Obso Set f_pr = Worksheets("Procedure") Set f_in = Worksheets("Instruction") Set f_fr = Worksheets("Formulaire") Set f_li = Worksheets("Liste") Set f_lo = Worksheets("Extraction Obso") 'nettoyage de la feuille f_lo.Rows("2:500").Delete 'définition des valeurs service et condition UserForm10.Show '// mets la valeurs de la condition en L2 de la Feuille Extraction Obso UserForm11.Show '// mets la valeurs du service émetteur en M2 de la Feuille Extraction Obso ' définition de la cible Dim cible As Range Set cible = f_lo.Range("A2") Dim ligne As Range Dim acopier As Range Dim feuille As Variant For Each feuille In Array(f_pr, f_in, f_fr, f_li) For Each ligne In feuille.Rows("1:500") If ligne.Cells(20).Value Like "*OBSO" Then Set acopier = Nothing For Each i In Array(1, 2, 3, 5, 6, 19, 20) Set acopier = IIf(acopier Is Nothing, ligne.Cells(i), Union(acopier, ligne.Cells(i))) 'message d'erreur 5 argument ou appel incorrect Next acopier.Copy Destination:=cible Set cible = cible.Offset(1) End If Next Next Sheets("Extraction Obso").Select Range("A1").Select UserForm1.Hide End Sub
- | Alerter
Et Zut ! Là, c'est ma faute à ma tout seul
En fait, Union() est assez mal fichu.
A la ligne 41, j'aurai voulu écrire :
Pour ajouter une cellule à une plage.
Bon, en VB, ça s'écrit avec un Set et un Union().
Sauf que si acopier est vide, ça plante.
Donc j'ai voulu écrire :
Comme il commençait à y avoir beaucoup de choses imbriquées, j'ai voulu jouer au plus malin en transformant le If .. Then .. Else en Iif().
Sauf que Iif() est une fonction et que tous les paramètres sont évalués avant que ne commence la fonction. Et donc le code plante sur le troisière paramètre quand acopier est vide, ce que justement je voulais éviter.
:honte:
Bon, dans ces cas-là, il faut soit accepter d'imbriquer beaucoup de choses, soit il faut créer une sous-fonction.
Je choisis la seconde solution pour rester cohérent avec moi-même.
Et je crée ma propre fonction Union(). Elle s'appelle zUnion()
Et maintenant, la ligne 41 :
Et voilou !
En fait, Union() est assez mal fichu.
A la ligne 41, j'aurai voulu écrire :
acopier = acopier + ligne.Cells(i)
Pour ajouter une cellule à une plage.
Bon, en VB, ça s'écrit avec un Set et un Union().
Set acopier = Union(acopier, ligne.Cells(i))
Sauf que si acopier est vide, ça plante.
Donc j'ai voulu écrire :
If acopier Is Nothing Then Set acopier = ligne.Cells(i) Else Set acopier = Union(acopier, ligne.Cells(i)) End If
Comme il commençait à y avoir beaucoup de choses imbriquées, j'ai voulu jouer au plus malin en transformant le If .. Then .. Else en Iif().
Sauf que Iif() est une fonction et que tous les paramètres sont évalués avant que ne commence la fonction. Et donc le code plante sur le troisière paramètre quand acopier est vide, ce que justement je voulais éviter.
:honte:
Bon, dans ces cas-là, il faut soit accepter d'imbriquer beaucoup de choses, soit il faut créer une sous-fonction.
Je choisis la seconde solution pour rester cohérent avec moi-même.
Et je crée ma propre fonction Union(). Elle s'appelle zUnion()
Private Function zUnion(ParamArray range1()) As Range Dim result As Range Dim r As Variant For Each r In range1 If Not r Is Nothing Then If result Is Nothing Then Set result = r Else Set result = Union(result, r) End If End If Next Set zUnion = result End Function
Et maintenant, la ligne 41 :
Set acopier = Union(acopier, ligne.Cells(i))
Et voilou !
- | Alerter
impec, ça marche! Je te remercie énormément!
maintenant, je vais m'atteler à regarder ce que tu me disais sur un message précédent pour l'extraction avec une valeur se situant dans une cellule et aussi l'énormité que tu as relevé avec mes lignes (500)....
euh, petite question con d'une non informaticienne : l'envirronement (windows 7, xp...) peut jouer sur l'éxécution des macros?
- | Alerter
Citation :
[..] ça marche! Je te remercie [..]Ahhhh !Ça fait plaisir.
Les macro-commandes sont associées à un logiciel - en l'occurrence Excel - pas à un système d'exploitation.
Attention cependant, il peut y avoir des différences entre les versions d'Excel.
Mais c'est très rare et la rétrocompatibilité est très importante pour les éditeurs comme Microsoft, quitte à reconduire exprès des bogues.
De Bill Gates cette maxime : It's not a bug, it's a feature.
En attendant la suite ...
- | Alerter
ok, merci! je demandais ça car je rencontre beaucoup de problème de compatibilité entre les versions d'excel sur le parc informatique.
Les macros créées avec un excel 2000 ou 2003 ne marchent pas forcément sous 2010....
et je dois aussi gérer plusieurs versions d'un même fichier afin que toutes le monde puisse utiliser ces fichiers suivant leur versions d'excel!
pour la suite, se sera fin de semaine car là, je suis malade...
Les macros créées avec un excel 2000 ou 2003 ne marchent pas forcément sous 2010....
et je dois aussi gérer plusieurs versions d'un même fichier afin que toutes le monde puisse utiliser ces fichiers suivant leur versions d'excel!
pour la suite, se sera fin de semaine car là, je suis malade...
- | Alerter
- | Alerter
hello!
bon, me revoilà reparti dans les macros!!!
après plus d'un mois sans y avoir touché une seule fois....
faut que je me remette dedans!
je suis, du coup, toujours au même point qu'avant, je cherche comment lui dire d'extraire les données non pas directement en lui mettant la condition mais qu'il aille la chercher dans une case la contenant.
mes conditions se trouve dans la feuille "Extraction Obso" avec la condition en "L2" et le service en "M2" qui y sont placé grâce à deux combobox.
voilà, je me replonge dans ce monde afin de finaliser enfin cette partie de programme!
il faut que je modifie donc la ligne 38 du code avec ce que tu m'avais donné comme info :
Value = "MOT"
Où est MOT ?
Dans une cellule :
1.Value = feuille.Range("Xn")
Qu'est-ce que le service émetteur ?
Une autre colonne ?
Bon :
1.If ligne.Cells(20).Value = "MOT" And ligne.Cells(autre_colonne).Value = "service émetteur" Then ..
nini
bon, me revoilà reparti dans les macros!!!
après plus d'un mois sans y avoir touché une seule fois....faut que je me remette dedans!
je suis, du coup, toujours au même point qu'avant, je cherche comment lui dire d'extraire les données non pas directement en lui mettant la condition mais qu'il aille la chercher dans une case la contenant.
mes conditions se trouve dans la feuille "Extraction Obso" avec la condition en "L2" et le service en "M2" qui y sont placé grâce à deux combobox.
Private Sub CommandButton8_Click() ' ' // Préparation Dim f_pr As Worksheet ' // Feuille Procedure Dim f_in As Worksheet ' // Feuille Instruction Dim f_fr As Worksheet ' // Feuille Formulaire Dim f_li As Worksheet ' // Feuille Liste Dim f_lo As Worksheet ' // Feuille Extraction Obso Set f_pr = Worksheets("Procedure") Set f_in = Worksheets("Instruction") Set f_fr = Worksheets("Formulaire") Set f_li = Worksheets("Liste") Set f_lo = Worksheets("Extraction Obso") 'nettoyage de la feuille f_lo.Rows("2:500").Delete 'définition des valeurs service et condition UserForm10.Show '// mets la valeurs de la condition en L2 de la Feuille Extraction Obso UserForm11.Show '// mets la valeurs du service émetteur en M2 de la Feuille Extraction Obso ' définition de la cible Dim cible As Range Set cible = f_lo.Range("A2") Dim ligne As Range Dim acopier As Range Dim feuille As Variant For Each feuille In Array(f_pr, f_in, f_fr, f_li) For Each ligne In feuille.Rows("1:500") If ligne.Cells(20).Value Like "*OBSO" Then Set acopier = Nothing For Each i In Array(1, 2, 3, 5, 6, 19, 20) Set acopier = zUnion(acopier, ligne.Cells(i)) Next acopier.Copy Destination:=cible Set cible = cible.Offset(1) End If Next Next Sheets("Extraction Obso").Select Range("A1").Select UserForm1.Hide End Sub
voilà, je me replonge dans ce monde afin de finaliser enfin cette partie de programme!
il faut que je modifie donc la ligne 38 du code avec ce que tu m'avais donné comme info :
Value = "MOT"
Où est MOT ?
Dans une cellule :
1.Value = feuille.Range("Xn")
Qu'est-ce que le service émetteur ?
Une autre colonne ?
Bon :
1.If ligne.Cells(20).Value = "MOT" And ligne.Cells(autre_colonne).Value = "service émetteur" Then ..
nini
- | Alerter
Salut Nini, ça va mieux ?
C'est ça qu'on cherche depuis 50 jours ?
Comprends pas ce qui n'est pas compréhensible.
C'est d'ailleurs toute la difficulté d'aider les autres !
Dim f_eo As Worksheet Set f_eo = Worksheets("Extraction Obso") ... If ligne.Cells(20).Value = f_eo.Range("L2").Value And _ ligne.Cells(autre_colonne).Value = f_eo.Range("M2").Value Then ..
C'est ça qu'on cherche depuis 50 jours ?
Comprends pas ce qui n'est pas compréhensible.
C'est d'ailleurs toute la difficulté d'aider les autres !
- | Alerter
50 jours? euh, nan, juste depuis hier en fait et un peu avant que je sois malade mais je ne me souvenais plus du tout de ce que j'avais fait....
merci, je vais beaucoup mieux!
Mais tu es le meilleur, tu as compris parfaitement ce que je voulais faire!
c'est vrai que c'est pas facile de s'exprimer par écrit sur ce genre de problème...désolée si je n'ai pas toujours été très claire!
j'avais fait ce que tu as mis mais j'avais un message erreur que je ne comprenais pas avant de voir le "_" derrière le And de ta ligne 6, tu peux me dire à quoi il sert?
merci, je vais beaucoup mieux!
Mais tu es le meilleur, tu as compris parfaitement ce que je voulais faire!
c'est vrai que c'est pas facile de s'exprimer par écrit sur ce genre de problème...désolée si je n'ai pas toujours été très claire!
j'avais fait ce que tu as mis mais j'avais un message erreur que je ne comprenais pas avant de voir le "_" derrière le And de ta ligne 6, tu peux me dire à quoi il sert?
- nini623 a édité ce message
- nini623 a édité ce message
- nini623 a édité ce message
- nini623 a édité ce message
- | Alerter
- | Alerter
Salut Nini,
A moi de t'abandonner pour cause de convalescence : 20 jours de repos forcé (ne joue jamais au Rugby, c'est un sport de brute !)
Mais me revoici !!!!
Le petit souligné [_] à la fin d'une ligne permet de passer à la ligne.
Le VBA est basé sur le BASIC, un langage archaïque dont il garde certains défauts.
Quant à l'utilisation de l'astérisque, il faut utiliser le comparateur Like et non pas l'habituel signe égal [=]
Et bien vérifier que l'expression est bien déterminante.
A moi de t'abandonner pour cause de convalescence : 20 jours de repos forcé (ne joue jamais au Rugby, c'est un sport de brute !)
Mais me revoici !!!!
Le petit souligné [_] à la fin d'une ligne permet de passer à la ligne.
Le VBA est basé sur le BASIC, un langage archaïque dont il garde certains défauts.
Quant à l'utilisation de l'astérisque
Et bien vérifier que l'expression est bien déterminante.
- | Alerter
Lassé par la pub ? Créez un compte