Modifier un code VBA

0

Bonjour,

Modifier un code vba de façon à pouvoir utiliser ce code sur plusieurs plages ou colonnes? explication dans la pièce jointe 

Voir ICI

Cordialement

    tontonbox Posté le 16 janvier 2023, 13:14
    par tontonbox
    Répondre
    0

    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

    Posté le 16 janvier 2023, 15:51
    0

    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

    tontonbox Posté le 16 janvier 2023, 19:10
    par tontonbox
    0

    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

    rhodo Posté le 16 janvier 2023, 19:55
    par rhodo
    0

    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?

    Voir ICI

    Cordialement

    tontonbox Posté le 17 janvier 2023, 12:54
    par tontonbox
    0

    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

    rhodo Posté le 17 janvier 2023, 18:42
    par rhodo
    0

    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    

    tontonbox Posté le 17 janvier 2023, 21:14
    par tontonbox
    0

    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 512 ➯ 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

    rhodo Posté le 20 janvier 2023, 22:20
    par rhodo

    Si vous n'êtes pas inscrit sur le site, vous pouvez poster librement (en tant qu'invité).
    Pour cela, indiquez un pseudonyme (nom d'utilisateur) et une adresse email :