Macro
Bonjour,
J'ai besoin d'une marco qui copie dans la feuille "Base" la ligne de A à H si dans la colonne F il y a un nombre et ensuite la colle dans la feuille "Commande" à partir de la ligne 2. (Bouton sur lequel on clique une fois la liste remplie)
C'est une base de données.
Ce qui serait le top c'est que la ligne soit protégée et si on clique sur n'importe qu'elle cellule ça nous renvoie à la colonne F et quelle ce surligne en couleur pour voir quel article on a sélectionné.
Merci d'avance pour votre aide et votre temps je suis vraiment un novice en macro donc si qqn peut me faire le code avec qqes explications je prends volontiers.
Bon weekend Johan Marcon
PS: La Liste en copie
Bonjour,
Colles tout ce code dans le module de la feuille "Base" (clic droit sur l'onglet puis sur "Visualiser le code" et le coller dans la partie droite) :
Dim Plage As Range
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Fe As Worksheet
Dim Lig As Long
With Target
'contrôles...
If .Count > 1 Then Exit Sub
If .Column <> 6 Then Exit Sub
If .Row < 3 Then Exit Sub
If .Value = "" Then Exit Sub
If Not IsNumeric(.Value) Then
MsgBox "Seulement numérique !"
Exit Sub
End If
'feuille recevant les valeurs
Set Fe = Worksheets("Commande")
'inscription des valeurs, attention, le nombre de colonnes
'ne correspond pas entre les deux feuilles, à voir si c'est normal !
Lig = Fe.Cells(Rows.Count, 1).End(xlUp).Row + 1
Fe.Range(Fe.Cells(Lig, 1), Fe.Cells(Lig, 10)).Value = Range(Cells(.Row, 1), Cells(.Row, 10)).Value
End With
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'si une plage (plage précédente) a été initialisée, supprime le fond des cellules
If Not Plage Is Nothing Then Plage.Interior.ColorIndex = 0
If Target.Column <> 6 And Target.Row > 2 Then
'évite le rappel de la proc
Application.EnableEvents = False
'sélectionne la cellule en colonne F
Cells(Target.Row, 6).Select
'défini la plage de A à J
Set Plage = Range(Cells(Target.Row, 1), Cells(Target.Row, 10))
'la colore
Plage.Interior.ColorIndex = 43
'rétabli les évènements
Application.EnableEvents = True
End If
End SubBonjour,
Merci pour ce code cela fonctionne très bien !
Juste qqes améliorations:
Feuille de base:
1. Colorer aussi la cellule de la colonne "F" quand on clique dans celle-ci.
2. Copier seulement les colonnes de "A" à "H" car les colonnes "I" et "J" sont simplement des indications pas besoin de les avoir sur la liste de commande.
3. Si j'ajoute d'autre modèle de vis à la suite de la liste est-ce que ca va poser problèmes ?
4. Sur le même modèle de vis on écrit 12 et ensuite on le remplace par 21 parce que on s'est trompé, ne pas avoir 2 lignes sur la feuille de commande mais qu'une ligne avec le nombre écrit en dernier.
Merci bcp de votre aide et votre temps.
Bonne journée Johan Marcon
Bonjour,
Question 1, c'est fait !
Question 2, c'est fait !
Question 3, une fois que tu as remplacé le code existant par le code ci-dessous, il te faut ajouter sur ta feuille de base un bouton issu de la barre d'outils "Formulaire" de l'onglet "Développeur" et lui affecter la macro "Feuil1.MarcheArret" (la boite s'ouvre automatiquement) afin de suspendre le fonctionnement des macros pour que tu puisses ajouter de nouveaux produits. Un clic sur le bouton suspend, et un autre clic rétabli !
Question 4, c'est fait mais par contre les références sont sensées être uniques alors que je vois la même référence pour deux produits différents (lignes 31 et 32 de ton classeur exemple), probablement une erreur ?
Dim Plage As Range
Dim Arret As Boolean
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Fe As Worksheet
Dim Cel As Range
Dim Lig As Long
Dim I As Integer
Dim Concat1 As String
Dim Concat2 As String
'permet d'entrer en mode édition pour ajouter des vis et autres
If Arret = True Then Exit Sub
With Target
'contrôles...
If .Count > 1 Then Exit Sub
If .Column <> 6 Then Exit Sub
If .Row < 3 Then Exit Sub
If .Value = "" Then Exit Sub
If Not IsNumeric(.Value) Then
MsgBox "Seulement numérique !"
Exit Sub
End If
'feuille recevant les valeurs
Set Fe = Worksheets("Commande")
Set Cel = Fe.Range("D:D").Find(Cells(.Row, 4).Value, , xlValues, xlWhole)
'si la référence de pièce a déjà été entrée en commande, change la quantité
If Not Cel Is Nothing Then
Cel.Offset(, 2).Value = Cells(.Row, 6).Value
Else
'sinon, inscription des valeurs
Lig = Fe.Cells(Rows.Count, 1).End(xlUp).Row + 1
Fe.Range(Fe.Cells(Lig, 1), Fe.Cells(Lig, 8)).Value = Range(Cells(.Row, 1), Cells(.Row, 8)).Value
End If
End With
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'permet d'entrer en mode édition pour ajouter des vis et autres
If Arret = True Then Exit Sub
'si une plage (plage précédente) a été initialisée, supprime le fond des cellules
If Not Plage Is Nothing Then Plage.Interior.ColorIndex = 0
If Target.Row > 2 Then
'évite le rappel de la proc
Application.EnableEvents = False
'sélectionne la cellule en colonne F
Cells(Target.Row, 6).Select
'défini la plage de A à J
Set Plage = Range(Cells(Target.Row, 1), Cells(Target.Row, 10))
'la colore
Plage.Interior.ColorIndex = 43
'rétabli les évènements
Application.EnableEvents = True
End If
End Sub
Sub MarcheArret()
'permet d'entrer en mode édition pour ajouter des vis et autres
Arret = Not Arret
End SubRe,
Merci pour votre réponse rapide.
Parfait pour les corrections et oui en ligne 32 il y avait une erreur de numéro...
Encore une amélioration est-il possible que si je supprime une "Qté à Com." donc 12 par exemple que cela supprime aussi la ligne de commande dans la feuille "Commande" ?
Et ensuite pour que ma "Base" soit plus lisible comme je vais lui entrer bcp d'articles, serait-il possible d'avoir seulement l'image et en cliquant dessus cela nous redirige vers la liste des articles correspondant à l'image ?
Sous forme d'un catalogue seulement avec des images qui nous renvoie vers une base à la bonne ligne d'article selon l'image sur laquelle on clique.
Merci d'avance.
Re,
Encore une amélioration est-il possible que si je supprime une "Qté à Com." donc 12 par exemple que cela supprime aussi la ligne de commande dans la feuille "Commande" ?
remplace la proc "Worksheet_Change" par celle-ci :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Fe As Worksheet
Dim Cel As Range
Dim Lig As Long
Dim I As Integer
Dim Concat1 As String
Dim Concat2 As String
'permet d'entrer en mode édition pour ajouter des vis et autres
If Arret = True Then Exit Sub
With Target
'contrôles...
If .Count > 1 Then Exit Sub
If .Column <> 6 Then Exit Sub
If .Row < 3 Then Exit Sub
If Not IsNumeric(.Value) Then
MsgBox "Seulement numérique !"
Exit Sub
End If
'feuille recevant les valeurs
Set Fe = Worksheets("Commande")
Set Cel = Fe.Range("D:D").Find(Cells(.Row, 4).Value, , xlValues, xlWhole)
'si la référence de pièce a déjà été entrée en commande...
If Not Cel Is Nothing Then
'si pas de quantité, suppression de la ligne
If Cells(.Row, 6).Value = "" Then
Cel.EntireRow.Delete
'sinon, modif de la quantité
Else
Cel.Offset(, 2).Value = Cells(.Row, 6).Value
End If
Else
'sinon, inscription des valeurs
Lig = Fe.Cells(Rows.Count, 1).End(xlUp).Row + 1
Fe.Range(Fe.Cells(Lig, 1), Fe.Cells(Lig, 8)).Value = Range(Cells(.Row, 1), Cells(.Row, 8)).Value
End If
End With
End SubEt ensuite pour que ma "Base" soit plus lisible comme je vais lui entrer bcp d'articles, serait-il possible d'avoir seulement l'image et en cliquant dessus cela nous redirige vers la liste des articles correspondant à l'image ?
Sous forme d'un catalogue seulement avec des images qui nous renvoie vers une base à la bonne ligne d'article selon l'image sur laquelle on clique.
Tu peux par exemple coller toutes tes images sur une feuille particulière nommée par exemple "Images" et créer des liens hypertextes pour chacune d'elles qui renvoi sur ta feuille "Base" à la première cellule concernée. Par exemple, pour ta première image, clic droit sur celle-ci (une fois qu'elle est sur la nouvelle feuille) puis "Lien hypertexte" et dans la boite qui s'ouvre, bouton de gauche "Emplacement dans ce document" tu entre l'adresse de la cellule (disons A2) et tu double-cliques sur "Base" dans le cadre central. Une fois ceci fait, quand tu clique sur ton image, tu auras la ligne 2 en vert et F2 sélectionnée. Tu fais de même pour tes autres images.
re,
Merci c'est exactement ce qu'il fallait.
1. Est-ce que je peux rajouter un bouton du genre Purger la Colonne "F" pour éviter de les effacer un à un ?
2. Dans mon fichier il y des lignes griser parce que il n'y a rien dedans mais quand je clique par mégarde dessus elle se colore en vert et ensuite elles redeviennent vide peut-on les verrouiller ?
3. Pour le cas des images je vais créer une feuille "Catalogue" pour pourvoir avoir toutes les images qui me renvoie à la base mais est-il possible que en cliquant sur l'image ça me renvoie sur l'autre image de la "Base" mais que ça affiche que la partie de la feuille de l'article concerné par exemple image en A2 et qui affiche la ligne 2 à 48.
4. Création d'un bouton "retour au catalogue" qui s'affiche chaque fois qu'on arrive sur la "base" triée selon le point 3. pour pouvoir retourner au catalogue sans cliquer sur l'onglet catalogue ?
Merci pour ton aide.
Bonjour,
Question 1, oui, pose un bouton "Formulaire" sur la feuille "Base" et attache lui la macro "Feuil1.Vider" (tout en bas du code). Cette macro vide la colonne F à partir de F2 et la feuille "Commande" en conservant la première ligne
Question 2, c'est fait
Question 3, une image ne peut pas être la cible d'un lien hypertexte et surtout, trop d'images dans le classeur va l'alourdir et le ralentir. Pour la seconde partie, là, ça devient compliqué car il faut trouver la fin des articles concernés (ce qui peux éventuellement être fait par rapport aux lignes grisées) mais ça va devenir une usine à gaz et je ne vois pas vraiment l'intérêt de cette manip car le lien hypertexte te mène, si il est bien paramétré, au début de la liste.
Question 4, quelle différence de cliquer sur un bouton ou sur l'onglet ?
Je te re-poste le code complet :
Dim Plage As Range
Dim Arret As Boolean
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Fe As Worksheet
Dim Cel As Range
Dim Lig As Long
Dim I As Integer
Dim Concat1 As String
Dim Concat2 As String
'permet d'entrer en mode édition pour ajouter des vis et autres
If Arret = True Then Exit Sub
With Target
'contrôles...
If .Count > 1 Then Exit Sub
If .Column <> 6 Then Exit Sub
If .Row < 3 Then Exit Sub
If Not IsNumeric(.Value) Then
MsgBox "Seulement numérique !"
Exit Sub
End If
'feuille recevant les valeurs
Set Fe = Worksheets("Commande")
Set Cel = Fe.Range("D:D").Find(Cells(.Row, 4).Value, , xlValues, xlWhole)
'si la référence de pièce a déjà été entrée en commande...
If Not Cel Is Nothing Then
'si pas de quantité, suppression de la ligne
If Cells(.Row, 6).Value = "" Then
Cel.EntireRow.Delete
'sinon, modif de la quantité
Else
Cel.Offset(, 2).Value = Cells(.Row, 6).Value
End If
Else
'sinon, inscription des valeurs
Lig = Fe.Cells(Rows.Count, 1).End(xlUp).Row + 1
Fe.Range(Fe.Cells(Lig, 1), Fe.Cells(Lig, 8)).Value = Range(Cells(.Row, 1), Cells(.Row, 8)).Value
End If
End With
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'permet d'entrer en mode édition pour ajouter des vis et autres
If Arret = True Then Exit Sub
If Target.Interior.ColorIndex = 15 Then Exit Sub
'si une plage (plage précédente) a été initialisée, supprime le fond des cellules
If Not Plage Is Nothing Then Plage.Interior.ColorIndex = 0
If Target.Row > 2 Then
'évite le rappel de la proc
Application.EnableEvents = False
'sélectionne la cellule en colonne F
Cells(Target.Row, 6).Select
'défini la plage de A à J
Set Plage = Range(Cells(Target.Row, 1), Cells(Target.Row, 10))
'la colore
Plage.Interior.ColorIndex = 43
'rétabli les évènements
Application.EnableEvents = True
End If
End Sub
Sub MarcheArret()
'permet d'entrer en mode édition pour ajouter des vis et autres
Arret = Not Arret
End Sub
Sub Vider()
'vide la colonne F à partir de F2
Range(Cells(2, 6), Cells(Rows.Count, 6)).ClearContents
'vide la feuille "Commande" en concervant la première ligne
With Worksheets("Commande")
.Range(.Cells(2, 1), _
.Cells(.Cells.Find("*", .[A1], -4123, , _
1, 2).Row, .Cells.Find("*", .[A1], -4123, , _
2, 2).Column)).ClearContents
End With
End SubMerci pour la modif du code il marche très bien comme ça et le bouton purger également.
1. Pour les lignes griser qui ne disparaisse plus dans la "Base" cela fonctionne très bien mais par contre quand je suis dans le "Catalogue" si je clique sur l'image cela m'envoie sur l'image de la "Base" mais ça efface la cellule griser de la ligne concernée..?!
2. (3.) Oui je verrai quand j'aurais fini ma "Base si ça fonctionne bien ou si il faudra une amélioration pour l'instant on laisse comme ça.
3. (4.) Tu as raison cliquer sur l'onglet va très bien
4. Dans la Feuille "Commande" j'aurais besoin d'un bouton sur lequel une fois ma liste de commande terminée je puisse la transférer dans un autre classeur qui se nomme "Liste V5.5" dans l'onglet "commande_visserie" à l'emplacement "C12".
Je t'ai mis la feuille concernée en copie.
Re,
Pour le transfert, tu colles le code ci-dessous dans le module de la feuille "Commande", puis tu poses un bouton sur cette feuille et tu lui affectes la proc "Transfert" :
Sub Transfert()
Dim Cls As Workbook
Dim Plage As Range
'évite l'erreur due au classeur fermé
On Error Resume Next
Set Cls = Workbooks("Liste V5.5.xlsx")
'si erreur, ouvre le classeur (il doit se trouver dans le même dossier que le classeur "Liste visserie Hilti")
If Err.Number <> 0 Then Set Cls = Workbooks.Open(ThisWorkbook.Path & "\Liste V5.5.xlsx")
'supprime le gestionnaire
On Error GoTo 0
'récup de la plage
With ThisWorkbook.Worksheets("Commande")
Set Plage = .Range(.Cells(2, 1), _
.Cells(.Cells.Find("*", .[A1], -4123, , _
1, 2).Row, .Cells.Find("*", .[A1], -4123, , _
2, 2).Column))
End With
'puis colle les valeurs dans la feuille
With Cls.Worksheets("commande_visserie")
.Range(.Cells(12, 3), .Cells(Plage.Rows.Count + 11, Plage.Columns.Count + 2)).Value = Plage.Value
End With
End Sub...mais ça efface la cellule griser de la ligne concernée..?!
Je ne vois pas ce que tu veux dire ?
Re,
1. Pour les cellules griser je t'ai mis la liste en copie, si tu clique sur la cellule A49 cela colore la ligne en vert et ensuite quand tu clique ailleurs la ligne reste vide et non plus griser. Ce qui arrive aussi quand tu passes du "Catalogue" à la "Base".
2. La Macro "Transfert" marche très bien quand la feuille se trouve seule dans un classeur mais elle est dans un autre classeur .xls avec bcp d'autres macros et au lieu de transférer sur cette liste il m'ouvre la même liste en lecture seule par contre j'arrive pas à te la transmettre car trop volumineuse...
Merci pour ton aide
Bonjour,
C'est normal, il te faut colorer la cellule A49 et similaire en gris car si tu les laisses sans couleur, elles ne seront pas évitées par la proc car considérées comme des cellules "normales"
Bonjour,
Merci ça fonctionne très bien.
Et pour la question du transfert ?
Merci bonne journée
Bonjour,
La Macro "Transfert" marche très bien quand la feuille se trouve seule dans un classeur mais elle est dans un autre classeur .xls avec bcp d'autres macros et au lieu de transférer sur cette liste il m'ouvre la même liste en lecture seule...
Quelle feuille se trouve seule dans un classeur et quel classeur, la feuille "commande_visserie" du classeur "Liste V5.5.xls" ?
Pour la macro "Transfert" :
Set Cls = Workbooks("Liste V5.5.xls")Set... fait en sorte que la variable "Cls" fasse référence au classeur "Liste V5.5.xls" (si il n'est pas ouvert, l'ouvre à condition qu'il soit dans le même dossier que le classeur "Liste visserie Hilti.xls") et pour :
With Cls.Worksheets("commande_visserie")With... fait en sorte que tous les enfants (Range, Cells, etc...) précédés d'un point fasse référence à la feuille "commande_visserie" du classeur "Liste V5.5.xls" donc que ce dernier possède une seule feuille ou 100, du moment qu'il y est une feuille qui se nomme "commande_visserie", c'est elle et elle seule qui sera la cible donc, il n'y a pas de raison que ça ne marche pas !
Bonjour,
C'est bon si je les mets dans le même dossier cela fonctionne très bien ! Surement une mauvaise manipulation de ma part.
1. Dans la liste "Commande" les articles sont copier selon la "Base" et coller selon l'ordre de remplissage de la colonne "F", est-ce possible de les tirer selon le nom en colonne "A" et par dimensions en colonne "B" sur la feuille "Commande" ?
2. Dans la liste "commande_visserie" il y une colonne supplémentaire "Pos" est-ce qu'il y a une macro pour numéroter les lignes du moment qu'il y a qqch dedans ou le plus simple est peut-être de la faire dans la feuille "Commande" ?
Merci beaucoup pour votre aide on arrive vraiment a qqch de bien !!
Bonjour,
1. Dans la liste "Commande" les articles sont copier selon la "Base" et coller selon l'ordre de remplissage de la colonne "F", est-ce possible de les tirer selon le nom en colonne "A" et par dimensions en colonne "B" sur la feuille "Commande" ?
Dans le module de la feuille "Base", remplaces la proc "Worksheet_Change" par celle-ci :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Fe As Worksheet
Dim PlgTri As Range
Dim Cel As Range
Dim Lig As Long
Dim I As Integer
Dim Concat1 As String
Dim Concat2 As String
'permet d'entrer en mode édition pour ajouter des vis et autres
If Arret = True Then Exit Sub
With Target
'contrôles...
If .Count > 1 Then Exit Sub
If .Column <> 6 Then Exit Sub
If .Row < 3 Then Exit Sub
If Not IsNumeric(.Value) Then
MsgBox "Seulement numérique !"
Exit Sub
End If
'feuille recevant les valeurs
Set Fe = Worksheets("Commande")
Set Cel = Fe.Range("D:D").Find(Cells(.Row, 4).Value, , xlValues, xlWhole)
'si la référence de pièce a déjà été entrée en commande...
If Not Cel Is Nothing Then
'si pas de quantité, suppression de la ligne
If Cells(.Row, 6).Value = "" Then
Cel.EntireRow.Delete
'sinon, modif de la quantité
Else
Cel.Offset(, 2).Value = Cells(.Row, 6).Value
End If
Else
'sinon, inscription des valeurs
Lig = Fe.Cells(Rows.Count, 1).End(xlUp).Row + 1
Fe.Range(Fe.Cells(Lig, 1), Fe.Cells(Lig, 8)).Value = Range(Cells(.Row, 1), Cells(.Row, 8)).Value
End If
End With
With Fe
Set PlgTri = .Range(.Cells(2, 1), _
.Cells(.Cells.Find("*", .[A1], -4123, , _
1, 2).Row, .Cells.Find("*", .[A1], -4123, , _
2, 2).Column))
End With
PlgTri.Sort PlgTri.Range("A1"), xlAscending, PlgTri.Range("B1"), , xlAscending, , , xlYes
End Sub2. Dans la liste "commande_visserie" il y une colonne supplémentaire "Pos" est-ce qu'il y a une macro pour numéroter les lignes du moment qu'il y a qqch dedans ou le plus simple est peut-être de la faire dans la feuille "Commande" ?
Remplaces la proc "Transfert" par celle-ci :
Sub Transfert()
Dim Cls As Workbook
Dim Plage As Range
'évite l'erreur due au classeur fermé
On Error Resume Next
Set Cls = Workbooks("Liste V5.5.xlsx")
'si erreur, ouvre le classeur (il doit se trouver dans le même dossier que le classeur "Liste visserie Hilti")
If Err.Number <> 0 Then Set Cls = Workbooks.Open(ThisWorkbook.Path & "\Liste V5.5.xls")
'supprime le gestionnaire
On Error GoTo 0
'récup de la plage
With ThisWorkbook.Worksheets("Commande")
Set Plage = .Range(.Cells(2, 1), _
.Cells(.Cells.Find("*", .[A1], -4123, , _
1, 2).Row, .Cells.Find("*", .[A1], -4123, , _
2, 2).Column))
End With
'puis colle les valeurs dans la feuille
With Cls.Worksheets("commande_visserie")
.Range(.Cells(12, 3), .Cells(Plage.Rows.Count + 11, Plage.Columns.Count + 2)).Value = Plage.Value
If Plage.Rows.Count > 1 Then
.Cells(12, 2).Value = 1: .Cells(13, 2).Value = 2
.Range(.Cells(12, 2), .Cells(13, 2)).AutoFill .Range(.Cells(12, 2), .Cells(12 + Plage.Rows.Count - 1, 2))
Else
.Cells(12, 2).Value = 1
End If
End With
End SubBonjour,
Question 2. tout est ok. Merci bcp
Question 1. cela marche pour le nom en colonne "A" mais pas pour les dimensions en colonne "B" je vous ai mis la liste remplie en copie.
Merci de votre aide.
Bonne journée
Bonjour,
Qqes jours ont passé et je n'ai plus de nouvelles Est-ce que vous pouvez toujours m'aider ?
Merci pour votre réponse et votre aide.
Bonne journée Johan Marcon
Bonjour,
Dans la proc "Worksheet_Change()", remplace :
PlgTri.Sort PlgTri.Range("A1"), xlAscending, PlgTri.Range("B1"), , xlAscending, , , xlYesPar :
PlgTri.Sort PlgTri.Range("A2"), xlAscending, PlgTri.Range("B2"), , xlAscending, , , xlNopour voir si le résultat te convient
Bonjour,
Merci pour votre réponse.
Oui c'est ça mais il y a encore un détail un article de dimensions "6x100" vient se placer avant un article de "6x20" due à l'unité "1" je présume pouvez-vous améliorer ça ?
Merci bonne journée