je voudrais que lorsque je clique sur une case à cocher, la ligne soit
copiée dans une autre feuille, si je décoche la case la ligne suppr dans
mon autre feuille.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
abcd
Il est étrange de ne pas tout mettre dans une seule feuille (au lieu de cocher, mettre la quantité voulue, puis grâce au filtres automatiques , n'afficher que les quantités non nulles pour afficher le panier d'achat s)
Enfin bon, pour répondre à ta question, si tu veux absolument deux feuilles il te faut entrer cette macro dans le code de la première feuille (celle qui contient la liste de choix)
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) ' constantes: Const LignesEnTete& = 1 ' dernière ligne de libellé (non cochable) sur feuille de choix Const CocheColonne& = 1 'Numéro de la colonne à cocher Const OffsetNomArticle& = 1 '+1 = le nom de l'article est +1 colonne à droite de la case cochable
Dim FeuilPanier As Worksheet, PremierNomPanier As Range Set FeuilPanier = Feuil2 'nom VBA de la feuille du Panier Set PremierNomPanier = FeuilPanier.Range("B2") 'case du premier article dans le panier
If (Target.Column = CocheColonne) And (Target.Row > LignesEnTete) Then 'on est bien dans la colonen à cocher 'et sous la dernière ligne de libellés Cancel = True 'on annule l'action normale du double clic
If IsEmpty(Target) Then 'la case est décochée Target.Value = "X" 'on coche ' insertion dans l'autre feuille (utiliser son nom VBA) If IsEmpty(PremierNomPanier) Then 'la panier est vide Target.EntireRow.Copy PremierNomPanier.End(xlToLeft) 'on écrit la première ligne du panier ElseIf IsEmpty(PremierNomPanier.Offset(1, 0)) Then 'le panier n'a qu'une seule ligne Target.EntireRow.Copy PremierNomPanier.Offset(1, 0).End(xlToLeft) 'on écrit la première ligne du panier Else 'Déjà plusieurs lignes, on ajoute à la suite; erreur si feuille pleine Target.EntireRow.Copy PremierNomPanier.End(xlDown).Offset(1, 0).End(xlToLeft) 'on ajoute une ligne à la suite End If
Else 'la case est déjà cochée Target.ClearContents 'on décoche l'article 'recherche de l'intitulé en Feuil2 (nom VBA) Dim i& i = 0 On Error Resume Next 'pas d'erreur si la ligne n'existe pas 'possible si le libellé a été modifié entre temps pa r exemple i = Application.WorksheetFunction.Match( _ Target.Offset(0, OffsetNomArticle), _ Intersect(FeuilPanier.UsedRange, PremierNomPanier.EntireColumn), _ 0) If i = 0 Then 'ligne absente MsgBox "Des modifications ont peut être été faites manuellement, l'article coché était absent du panier; veuillez véri fier la validité des données.", _ vbCritical + vbOKOnly, _ "ERREUR !" Else 'ligne présente, supprimons-là du panier Intersect(FeuilPanier.UsedRange, PremierNomPanier.EntireColumn).Cells(i).EntireRow.Delete End If End If 'FIN IF case pas encore cochée ? End If 'FIN IF double clic au bon endroit ? End Sub
Il est étrange de ne pas tout mettre dans une seule feuille (au lieu de
cocher, mettre la quantité voulue, puis grâce au filtres automatiques ,
n'afficher que les quantités non nulles pour afficher le panier d'achat s)
Enfin bon, pour répondre à ta question, si tu veux absolument deux
feuilles il te faut entrer cette macro dans le code de la première
feuille (celle qui contient la liste de choix)
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As
Boolean)
' constantes:
Const LignesEnTete& = 1 ' dernière ligne de libellé (non cochable) sur
feuille de choix
Const CocheColonne& = 1 'Numéro de la colonne à cocher
Const OffsetNomArticle& = 1 '+1 = le nom de l'article est +1 colonne à
droite de la case cochable
Dim FeuilPanier As Worksheet, PremierNomPanier As Range
Set FeuilPanier = Feuil2 'nom VBA de la feuille du Panier
Set PremierNomPanier = FeuilPanier.Range("B2") 'case du premier article
dans le panier
If (Target.Column = CocheColonne) And (Target.Row > LignesEnTete) Then
'on est bien dans la colonen à cocher
'et sous la dernière ligne de libellés
Cancel = True 'on annule l'action normale du double clic
If IsEmpty(Target) Then 'la case est décochée
Target.Value = "X" 'on coche
' insertion dans l'autre feuille (utiliser son nom VBA)
If IsEmpty(PremierNomPanier) Then 'la panier est vide
Target.EntireRow.Copy PremierNomPanier.End(xlToLeft) 'on
écrit la première ligne du panier
ElseIf IsEmpty(PremierNomPanier.Offset(1, 0)) Then 'le panier
n'a qu'une seule ligne
Target.EntireRow.Copy PremierNomPanier.Offset(1,
0).End(xlToLeft) 'on écrit la première ligne du panier
Else 'Déjà plusieurs lignes, on ajoute à la suite; erreur si
feuille pleine
Target.EntireRow.Copy
PremierNomPanier.End(xlDown).Offset(1, 0).End(xlToLeft) 'on ajoute une
ligne à la suite
End If
Else 'la case est déjà cochée
Target.ClearContents 'on décoche l'article
'recherche de l'intitulé en Feuil2 (nom VBA)
Dim i&
i = 0
On Error Resume Next 'pas d'erreur si la ligne n'existe pas
'possible si le libellé a été modifié entre temps pa r exemple
i = Application.WorksheetFunction.Match( _
Target.Offset(0, OffsetNomArticle), _
Intersect(FeuilPanier.UsedRange,
PremierNomPanier.EntireColumn), _
0)
If i = 0 Then 'ligne absente
MsgBox "Des modifications ont peut être été faites
manuellement, l'article coché était absent du panier; veuillez véri fier
la validité des données.", _
vbCritical + vbOKOnly, _
"ERREUR !"
Else 'ligne présente, supprimons-là du panier
Intersect(FeuilPanier.UsedRange,
PremierNomPanier.EntireColumn).Cells(i).EntireRow.Delete
End If
End If 'FIN IF case pas encore cochée ?
End If 'FIN IF double clic au bon endroit ?
End Sub
Il est étrange de ne pas tout mettre dans une seule feuille (au lieu de cocher, mettre la quantité voulue, puis grâce au filtres automatiques , n'afficher que les quantités non nulles pour afficher le panier d'achat s)
Enfin bon, pour répondre à ta question, si tu veux absolument deux feuilles il te faut entrer cette macro dans le code de la première feuille (celle qui contient la liste de choix)
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) ' constantes: Const LignesEnTete& = 1 ' dernière ligne de libellé (non cochable) sur feuille de choix Const CocheColonne& = 1 'Numéro de la colonne à cocher Const OffsetNomArticle& = 1 '+1 = le nom de l'article est +1 colonne à droite de la case cochable
Dim FeuilPanier As Worksheet, PremierNomPanier As Range Set FeuilPanier = Feuil2 'nom VBA de la feuille du Panier Set PremierNomPanier = FeuilPanier.Range("B2") 'case du premier article dans le panier
If (Target.Column = CocheColonne) And (Target.Row > LignesEnTete) Then 'on est bien dans la colonen à cocher 'et sous la dernière ligne de libellés Cancel = True 'on annule l'action normale du double clic
If IsEmpty(Target) Then 'la case est décochée Target.Value = "X" 'on coche ' insertion dans l'autre feuille (utiliser son nom VBA) If IsEmpty(PremierNomPanier) Then 'la panier est vide Target.EntireRow.Copy PremierNomPanier.End(xlToLeft) 'on écrit la première ligne du panier ElseIf IsEmpty(PremierNomPanier.Offset(1, 0)) Then 'le panier n'a qu'une seule ligne Target.EntireRow.Copy PremierNomPanier.Offset(1, 0).End(xlToLeft) 'on écrit la première ligne du panier Else 'Déjà plusieurs lignes, on ajoute à la suite; erreur si feuille pleine Target.EntireRow.Copy PremierNomPanier.End(xlDown).Offset(1, 0).End(xlToLeft) 'on ajoute une ligne à la suite End If
Else 'la case est déjà cochée Target.ClearContents 'on décoche l'article 'recherche de l'intitulé en Feuil2 (nom VBA) Dim i& i = 0 On Error Resume Next 'pas d'erreur si la ligne n'existe pas 'possible si le libellé a été modifié entre temps pa r exemple i = Application.WorksheetFunction.Match( _ Target.Offset(0, OffsetNomArticle), _ Intersect(FeuilPanier.UsedRange, PremierNomPanier.EntireColumn), _ 0) If i = 0 Then 'ligne absente MsgBox "Des modifications ont peut être été faites manuellement, l'article coché était absent du panier; veuillez véri fier la validité des données.", _ vbCritical + vbOKOnly, _ "ERREUR !" Else 'ligne présente, supprimons-là du panier Intersect(FeuilPanier.UsedRange, PremierNomPanier.EntireColumn).Cells(i).EntireRow.Delete End If End If 'FIN IF case pas encore cochée ? End If 'FIN IF double clic au bon endroit ? End Sub
abcd
Je précise que j'ai fait le plus complexe pour te montrer, mais que si tu veux insérer chaque achat en haut de la liste il y a moins de tests à faire:
Target.Value = "X" 'on coche ' insertion dans l'autre feuille (utiliser son nom VBA) Target.EntireRow.Copy PremierNomPanier.End(xlToLeft).Insert Application.CutCopyMode = False
Je précise que j'ai fait le plus complexe pour te montrer, mais que si
tu veux insérer chaque achat en haut de la liste il y a moins de tests à
faire:
Target.Value = "X" 'on coche
' insertion dans l'autre feuille (utiliser son nom VBA)
Target.EntireRow.Copy
PremierNomPanier.End(xlToLeft).Insert
Application.CutCopyMode = False
Je précise que j'ai fait le plus complexe pour te montrer, mais que si tu veux insérer chaque achat en haut de la liste il y a moins de tests à faire:
Target.Value = "X" 'on coche ' insertion dans l'autre feuille (utiliser son nom VBA) Target.EntireRow.Copy PremierNomPanier.End(xlToLeft).Insert Application.CutCopyMode = False
point
Je précise que j'ai fait le plus complexe pour te montrer, mais que si tu veux insérer chaque achat en haut de la liste il y a moins de tests à faire:
Target.Value = "X" 'on coche ' insertion dans l'autre feuille (utiliser son nom VBA) Target.EntireRow.Copy PremierNomPanier.End(xlToLeft).Insert Application.CutCopyMode = False
Super, merci pour tout
Ppoint
Je précise que j'ai fait le plus complexe pour te montrer, mais que si
tu veux insérer chaque achat en haut de la liste il y a moins de tests à
faire:
Target.Value = "X" 'on coche
' insertion dans l'autre feuille (utiliser son nom VBA)
Target.EntireRow.Copy
PremierNomPanier.End(xlToLeft).Insert
Application.CutCopyMode = False
Je précise que j'ai fait le plus complexe pour te montrer, mais que si tu veux insérer chaque achat en haut de la liste il y a moins de tests à faire:
Target.Value = "X" 'on coche ' insertion dans l'autre feuille (utiliser son nom VBA) Target.EntireRow.Copy PremierNomPanier.End(xlToLeft).Insert Application.CutCopyMode = False