Bonjour,
Modifier un code vba de façon à pouvoir utiliser ce code sur plusieurs plages ou colonnes? explication dans la pièce jointe
Cordialement
Bonjour,
Modifier un code vba de façon à pouvoir utiliser ce code sur plusieurs plages ou colonnes? explication dans la pièce jointe
Cordialement
Bonjour,
modidie avec cette ligne
If Target.Column = 2 Or Target.Column = 4 Or Target.Column = 6 Or Target.Column = 8 And Target.Count = 1 Then 'colonne 2 ou 4 ou 6 ou 8
Bonsoir,
Excellent!! merci beaucoup à toi pour ce coup de main, j'ai testé et adopté ton code qui est fonctionnel à 100% merci, merci.
Bonne continuation
Cordialement
Bonsoir tontonbox, le fil,
ton fichier en retour : https://www.cjoint.com/c/MAqsQAHdtK0
* ta macro était dans ThisWorkbook ; c'est utile uniquement si tu veux que cette macro
soit exécutée sur toutes les feuilles d'un classeur Excel ➯ si ta macro est seulement
pour Feuil1, c'est mieux de mettre la macro dans le module de Feuil1.
* tu avais utilisé la macro Workbook_SheetChange() ; donc l'événement déclencheur
est : "si on change de feuille dans le classeur" ; pour ce que tu veux faire, c'est mieux
d'utiliser l'événement Worksheet_Change() : "si on change le contenu d'une cellule".
code du Module de Feuil1 :
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim chn$, lig&, col%
With Target
If .CountLarge > 1 Then Exit Sub
chn = .Value: If chn = "" Then Exit Sub
lig = .Row: If lig < 11 Or lig > 26 Then Exit Sub
col = .Column: If col <> 2 And col <> 4 And col <> 6 And col <> 8 Then Exit Sub
End With
If Not IsError(Application.Match(chn, [liste], 0)) Then Exit Sub
If MsgBox("On ajoute ?", 4) = 7 Then Application.Undo: Exit Sub
[liste].End(xlDown).Offset(1) = chn: [liste].Sort [K5]
End Sub
rhodo
Bonjour Rhodo
Merci pour ton code qui est fonctionnel et je t'en remercie beaucoup, par contre..... par rapport à mon code que j'avais mis en ligne lors de ma première demande que je comprenais à peu près, sur ton code à toi j'ai deux ligne de code qu'il faudrait que tu m'explique puisque je n'arrive pas trop à comprendre
If .CountLarge > 1 Then Exit Sub
et
If MsgBox("On ajoute ?", 4) = 7 Then Application.Undo: Exit Sub
En te remerciant par avance
Par contre j'ai voulu tester un truc par rapport à ton code, voir PJ mais je ne suis pas arrivé, peux tu m'expliquer pourquoi?
Cordialement
Bonsoir tontonbox,
If .CountLarge > 1 Then Exit Sub
Target.CountLarge retourne le nombre de cellules de Target ; donc si la sélection en cours
est de plus d'une cellule, on quitte la sub ; si on n'a pas sélectionné plusieurs cellules :
la sélection en cours est la cellule active et .CountLarge retourne 1.
avec Target.Count : si par exemple toute la feuille est sélectionnée, il y a trop de cellules
dans la sélection ➯ erreur d'exécution ; j'utilise donc Target.CountLarge ; sur ce lien,
lis attentivement la rubrique "Remarques" :
https://learn.microsoft.com/fr-fr/office/vba/api/excel.range.countlarge
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If MsgBox("On ajoute ?", 4) = 7 Then Application.Undo: Exit Sub
4 est la constante numérique de vbYesNo
7 est la constante numérique de vbNo
c'est donc idem que :
If MsgBox("On ajoute ?", vbYesNo) = vbNo Then Application.Undo: Exit Sub
c'est juste un peu plus court. ;)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ton fichier avec 2 listes en retour : https://www.cjoint.com/c/MArr3YekTn0
code du Module de Feuil1 :
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cel As Range, chn$, lig&, col%, k As Byte, d&
With Target
If .CountLarge > 1 Then Exit Sub
chn = .Value: If chn = "" Then Exit Sub
lig = .Row: If lig < 11 Or lig > 26 Then Exit Sub
col = .Column
End With
If col = 2 Or col = 4 Or col = 6 Or col = 8 Then k = 11: GoTo 1
If col = 16 Or col = 18 Or col = 20 Or col = 22 Then k = 13: GoTo 1
Exit Sub
1 d = Cells(Rows.Count, k).End(3).Row: If d = 4 Then GoTo 2
Set cel = Cells(5, k).Resize(d - 4).Find(chn, , -4163, 1, 1)
If Not cel Is Nothing Then Exit Sub
2 If MsgBox("On ajoute ?", 4) = 7 Then
Application.EnableEvents = 0: Target.ClearContents
Application.EnableEvents = -1: Exit Sub
End If
Application.ScreenUpdating = 0: Cells(d + 1, k) = chn
Cells(5, k).Resize(d - 3).Sort Cells(5, k)
End Sub
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Remarques
d = Cells(Rows.Count, k).End(3).Row : idem que : d = Cells(Rows.Count, k).End(xlUp).Row
.Find(chn, , -4163, 1, 1) : idem que : .Find(chn, , xlValues, xlWhole, xlByRows)
dans le code VBA, je n'ai pas utilisé [liste] ni [liste2] ➯ tu peux supprimer ces 2 noms
dans le Gestionnaire de noms, sauf si dans ton fichier réel, tu utilises ces 2 noms
pour autre chose.
rhodo
Bonsoir Rhodo
Merci beaucoup pour tes explications bien détaillées des deux lignes de code qui étaient un peu dans le flou pour moi. En fait tout parait simple voir logique quand c'est bien expliqué, merci.
Pour le deuxième fichier que je t'avais demandé de voir pourquoi qu'il ne fonctionnait pas, je m'étais imaginé qu'en copiant le code complet et en supprimant quelques lignes puis en modifiant d'autres lignes du code on pouvait le faire fonctionner comme ça en claquant des doigts, mais je vois que j'ai fait fausse route étant donné toutes les modifications que tu as faites pour y parvenir du coup trop compliqué pour moi surtout..... si l'on ne connait pas la programmation, bref, je me console quand je trouve de l'aide auprès d'intervenant comme toi très avenant et sympathique toujours présent pour aider merci merci.
Cordialement
Bonsoir tontonbox,
merci pour ton retour ; je suis content que tu as vu que j'ai préféré choisir une autre
méthode ; c'était préférable pour plus d'une seule liste ; ce post est un complément
pour tes 2 listes, mais c'est valable aussi pour 1 seule liste.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
à propos du tri des listes des colonnes K et M : si tu ajoutes "maison 1", ça sera bien
entre "maison 0" et "maison 2" ; mais si tu ajoutes ensuite "maison 10", ça ne sera
pas bon car se sera entre "maison 1" et "maison 2" au lieu d'être après "maison 5" ;
solution simple : mettre tous les nombres sur 2 chiffres ; tu auras alors cette liste :
maison 00
maison 01
maison 02
maison 03
maison 05
maison 10
si le nombre maximum dépasse 99, alors mettre tous les nombres sur 3 chiffres :
maison 000
maison 001
maison 002
maison 003
maison 005
maison 010
maison 011
maison 012
maison 020
maison 050
maison 099
maison 100
maison 101
maison 102
maison 200
maison 500
maison 999
si le nombre maximum dépasse 999, mettre tous les nombres sur 4 chiffres.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
dans mon post précédent du 17 janvier, je t'avais proposé de supprimer dans
le Gestionnaire de noms les 2 noms "liste" et "liste2" ; j'avais oublié que tu les
utilises sur ta feuille de calcul pour des validations de données en tant que
Liste ; c'est "Autoriser : Liste" ; "Source : =liste" ; "Source : =liste2" ; il ne faut
donc pas les supprimer ; cependant :
* je ne comprends pas bien l'intérêt de mettre une validation de données si
finalement tu autorises l'ajout d'une nouvelle donnée qui n'est pas dans la
liste initiale (même si c'est après une confirmation via "On ajoute ?").
* dans le fichier exemple, les données sont toutes avec "maison" suivi d'un
chiffre ; si c'est pour faire ça, une validation de données est inutile ; il vaut
mieux utiliser ce format de nombre personnalisé : "maison "0 ; ainsi, il te
suffira de saisir un nombre : 5 ➯ maison 5 ; 12 ➯ maison 12 ; etc... ; les
2 listes des colonnes K et M seront alors inutiles, et mon code VBA aussi
➯ tu pourras supprimer toutes les validations de données des plages de
cellules sur fond jaune ou brun clair, et cette fois, tu pourras effectivement
supprimer dans le Gestionnaire de noms les 2 noms "liste" et "liste2".
* bien sûr, il faudrait pouvoir décider en fonction de tes données réelles,
alors si ce n'est pas confidentiel ni des données personnelles, peux-tu
nous les indiquer ? selon ces données réelles, il se peut aussi que la
saisie semi-automatique soit suffisante (elle est déjà de base dans
Excel, sans rien devoir programmer).
rhodo