IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Remplacer des If par un Select Case


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien de laboratoire
    Inscrit en
    Mai 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Technicien de laboratoire
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2021
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Remplacer des If par un Select Case
    Bonjour tout le monde,

    Je travaille actuellement sur un formulaire de création de projet sous Excel: les utilisateurs le remplisse puis avec une macro on exporte toute les infos sous un format csv qui sera importé dans un logiciel. Sauf que le logiciel en question n'aime pas trop certains caractères:
    : ? " # ' / \ * > < |
    Je voudrais donc que les utilisateurs ne puissent pas utiliser ces caractères dans le titre du projet (en cellule B1).

    Après quelques recherches j'ai découvert les procèdures évènementielles et j'ai trouvé/bidouillé ce code que j'ai integré dans la feuille de mon formulaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Private Sub Worksheet_Change(ByVal Target As Range)
        Application.EnableEvents = False 'Pour éviter la mise en boucle de l'événement
        Set isect = Application.Intersect(Target, Range("B1"))
     
        If Not isect Is Nothing Then
          If InStr(1, Target, ":") Then MsgBox "Please don't use any of the caracters below:" & Chr(13) & Chr(10) & ": ? # ' \ / * < > |"
          If InStr(1, Target, "?") Then MsgBox "Please don't use any of the caracters below:" & Chr(13) & Chr(10) & ": ? # ' \ / * < > |"
          If InStr(1, Target, "#") Then MsgBox "Please don't use any of the caracters below:" & Chr(13) & Chr(10) & ": ? # ' \ / * < > |"
          If InStr(1, Target, "'") Then MsgBox "Please don't use any of the caracters below:" & Chr(13) & Chr(10) & ": ? # ' \ / * < > |"
          If InStr(1, Target, "\") Then MsgBox "Please don't use any of the caracters below:" & Chr(13) & Chr(10) & ": ? # ' \ / * < > |"
          If InStr(1, Target, "*") Then MsgBox "Please don't use any of the caracters below:" & Chr(13) & Chr(10) & ": ? # ' \ / * < > |"
          If InStr(1, Target, ">") Then MsgBox "Please don't use any of the caracters below:" & Chr(13) & Chr(10) & ": ? # ' \ / * < > |"
          If InStr(1, Target, "<") Then MsgBox "Please don't use any of the caracters below:" & Chr(13) & Chr(10) & ": ? # ' \ / * < > |"
          If InStr(1, Target, "/") Then MsgBox "Please don't use any of the caracters below:" & Chr(13) & Chr(10) & ": ? # ' \ / * < > |"
          If InStr(1, Target, "|") Then MsgBox "Please don't use any of the caracters below:" & Chr(13) & Chr(10) & ": ? # ' \ / * < > |"
        End If
    Application.EnableEvents = True
    End Sub
    On remarque 2 choses:
    - d'une part je n'arrive pas à traiter le cas où le caractère est " (message d'erreur dans le code)
    - d'autre part ce n'est pas très élégant cette succession de "If".
    J'ai donc pensé à utiliser Select Case mais j'avoue que j'ai un peu de mal à comprendre sa syntaxe d'utilisation et surtout je ne vois pas du tout laquelle utiliser dans mon cas. Est-ce que vous pourriez m'aider ?
    Et si vous savez comment traiter le cas du caractère " je suis également preneur.

    Dans un second temps, je verrai si je ne remplacerai pas directement le caractère interdit par un autre, autorisé, comme un _ par exemple mais j'aimerai déjà comprendre comment traiter la partie "détection" du/des caractères et améliorer mes connaissances sur des fonctions "de base"

    Bonne journée

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2013
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2013
    Messages : 118
    Points : 183
    Points
    183
    Par défaut
    Bonjour, votre routine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub Worksheet_Change(ByVal Target As Range)
    Devrait faire appel à deux fonctions bien connues sur le web IsValidFilename et NormalizeFilename
    Je vous laisse chercher
    Bonne journée

  3. #3
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Remarques préliminaires:
    1 - L'écriture de conditions If n'entre pas dans une architecture rigoureuse de code.
    Pas plus que la multiplication des cas dans un bloc Select Case
    2 - Par prudence, et c'est une règle à mon sens absolue, il vaut mieux rendre la déclaration des variables obligatoire (Menu Outils \ Options dans l'éditeur VBE)
    Cette obligation fera placer en entête de module de l'instruction "Option Explicit"
    3 - L'utilisation d'une quotte dans une chaîne de caractères entraîne le dédoublement des double quottes en VBA

    Tu comprends et adaptes (notamment pour l'array liste).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Option Explicit
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    Dim array_interdit As Variant
    array_interdit = VBA.Array(":", """", "?")
     
    Dim n As Byte
    n = LBound(array_interdit)
     
    Dim lerreur As Boolean
    lerreur = False
     
    If Target.Address = Range("B1").Address Then
     
            Do While lerreur = False And n <= UBound(array_interdit)
                 If InStr(Target.Value, array_interdit(n)) > 0 Then
                         lerreur = True
                         MsgBox _
                                 Prompt:="Le caractère " & array_interdit(n) & " est intedit à la saisie.", _
                                 Buttons:=vbCritical, _
                                 Title:="Erreur de saisie"
                         Target.Select
                 Else
                         n = n + 1
                 End If
             Loop
     
     End If
     
    End Sub
    Nota:
    On aurait pu également lister les saisies interdites dans une colonne de tableau structuré pour en balayer les index.

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien de laboratoire
    Inscrit en
    Mai 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Technicien de laboratoire
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2021
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour la réponse @fraflt69.

    En attendant j'avais continué mes recherches et était parti sur l'utilisation de la fonction "like". En combinant avec mon InStr initial pour gérer le cas du " (qui a le code chr(34)) j'étais arrivé à ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Worksheet_Change(ByVal Target As Range)
        Application.EnableEvents = False 'Pour éviter la mise en boucle de l'événement
        Set isect = Application.Intersect(Target, Range("B1"))
     
        If Not isect Is Nothing Then
            If Target Like "*[#,',*,/,:,<,>,?,\,|]*" Or InStr(1, Target, Chr(34)) Then
                MsgBox "Please don't use any of the caracters below:" & Chr(13) & Chr(10) & ": ? # ' \ / * < > |"
           End If
        End If
     
    Application.EnableEvents = True
    End Sub
    Ca a déjà une meilleure tête, ça fonctionnait très bien mais par contre le message apparaissait également quand on utilisait la virgule, peut-être dû à une erreur de syntaxe dans "*[#,',*,/,:,<,>,?,\,|]*".

    Du coup j'ai fait une recherche sur ce que vous avez proposé avec IsValidFilename et NormalizeFilename. Je n'ai pas trouvé de fonction intégrée dans VBA qui fasse ça. Par contre j'ai trouvé une fonction qui remplace les caractères illégaux que je veux par un caractère au choix, ici: https://stackoverflow.com/questions/...book-excel-vba
    Je suis donc parti là-dessus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Private Sub Worksheet_Change(ByVal Target As Range)
        Application.EnableEvents = False 'Pour éviter la mise en boucle de l'événement
        Set isect = Application.Intersect(Target, Range("B1"))
     
        If Not isect Is Nothing Then
            If Target.Value <> ReplaceIllegalCharacters(Target.Value, "_") Then
            Target.Value = ReplaceIllegalCharacters(Target.Value, "_")
            MsgBox "Please don't use any of the caracters below:" & Chr(13) & Chr(10) & ": ? # ' \ / * < > |" & Chr(13) & Chr(10) & _
                    "They have been replaced by an underscore " & Chr(34) & "_" & Chr(34) & Chr(13) & Chr(10) & "Please verify and correct your entrie"
            End If
        End If
     
    Application.EnableEvents = True
    End Sub
    ----------------------------------------------------------------------------------------------------------
    Private Function ReplaceIllegalCharacters(strIn As String, strChar As String) As String
        'strIn = la valeur dans laquelle faire la recherche
        'strChar = la valeur qui va remplacer les caractères illégaux
        Dim strSpecialChars As String
        Dim i As Long
        strSpecialChars = "~""#*:<>?|/\" & Chr(10) & Chr(13)
     
        For i = 1 To Len(strSpecialChars)
            strIn = Replace(strIn, Mid$(strSpecialChars, i, 1), strChar)
        Next
     
        ReplaceIllegalCharacters = strIn
    End Function
    Et ça répond plutôt bien à ma demande. Je garde précieusement cette fonction car elle est bien pratique et je pourrai sans doute l'utiliser plus tard sur d'autres projets.

    Le dernier point qui me chagrine un peu c'est que si je veux "vider" ma cellule B1 en appuyant sur la touche Suppr ça me met un message d'erreur VB :
    Nom : Sans titre2.png
Affichages : 120
Taille : 9,4 Ko
    Pour la vider je dois utiliser la touche RetourArrière.
    J'imagine que c'est dû à l'utilisation de la procédure évènementielle. Si vous avez une solution à m'apporter je suis preneur. Sinon tant pis, ça sera une habitude à prendre.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien de laboratoire
    Inscrit en
    Mai 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Technicien de laboratoire
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2021
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par MarcelG Voir le message
    Bonjour,

    Remarques préliminaires:
    1 - L'écriture de conditions If n'entre pas dans une architecture rigoureuse de code.
    Pas plus que la multiplication des cas dans un bloc Select Case
    2 - Par prudence, et c'est une règle à mon sens absolue, il vaut mieux rendre la déclaration des variables obligatoire (Menu Outils \ Options dans l'éditeur VBE)
    Cette obligation fera placer en entête de module de l'instruction "Option Explicit"
    3 - L'utilisation d'une quotte dans une chaîne de caractères entraîne le dédoublement des double quottes en VBA

    Tu comprends et adaptes (notamment pour l'array liste).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Option Explicit
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    Dim array_interdit As Variant
    array_interdit = VBA.Array(":", """", "?")
     
    Dim n As Byte
    n = LBound(array_interdit)
     
    Dim lerreur As Boolean
    lerreur = False
     
    If Target.Address = Range("B1").Address Then
     
            Do While lerreur = False And n <= UBound(array_interdit)
                 If InStr(Target.Value, array_interdit(n)) > 0 Then
                         lerreur = True
                         MsgBox _
                                 Prompt:="Le caractère " & array_interdit(n) & " est intedit à la saisie.", _
                                 Buttons:=vbCritical, _
                                 Title:="Erreur de saisie"
                         Target.Select
                 Else
                         n = n + 1
                 End If
             Loop
     
     End If
     
    End Sub
    Nota:
    On aurait pu également lister les saisies interdites dans une colonne de tableau structuré pour en balayer les index.
    Merci pour la réponse également MarcelG, je vais regarder ça.

  6. #6
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 925
    Points
    55 925
    Billets dans le blog
    131
    Par défaut
    Salut.

    Avec like (et donc +/- les expressions régulières à la sauce VBA), tu dois échapper certains caractères avec le \ (c'est-à-dire faire précéder le caractère de contrôle de \, et plutôt que de tester char(34), je préfère personnellement doubler le guillemet pour réaliser une seule opération: not FileName like "*[:?""#'/\\\*><\|]*"

Discussions similaires

  1. [PHP][HTML] remplacer des RC par des <br>
    Par Arnard dans le forum Langage
    Réponses: 2
    Dernier message: 26/06/2006, 21h21
  2. [Conception] Remplacer des frames par du code PHP !!!!
    Par dragonfly dans le forum PHP & Base de données
    Réponses: 20
    Dernier message: 07/04/2006, 08h54
  3. changement des couleurs par appuis sur case à cocher
    Par Wormus dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 10/10/2005, 23h05
  4. Remplacer des boutons par des menus déroulants?
    Par drthodt dans le forum Access
    Réponses: 3
    Dernier message: 20/09/2005, 17h37
  5. Réponses: 5
    Dernier message: 30/05/2005, 16h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo