Variable VBA recherche de caratères spéciaux

Résolu
pou pouille Messages postés 212 Statut Membre -  
pou pouille Messages postés 212 Statut Membre -
Bonjour,
je souhaiterai faire un teste d'une variable VBA (enregistrement)
j'ai déja écrit ma boucle pour que ma variable ne soit pas vide
mais je souhaiterai que la variable ENREGISTREMENT ne comporte pas les simboles qui sont interdits pour crée un fichier.
(donc ici c'est ma première boucle DO à modifier ... (de plus j'ai un soucis je ne sais pas afficher le caractère : ")
Do
    Do
        Enregistrement = InputBox("Nom du programme", "Nom Programme", Left(NomFichier, Len(NomFichier) - 4))
        If Enregistrement = "" Then MsgBox "rentrer un nom de programme", vbExclamation
    Loop While Enregistrement = ""
    If Enregistrement ="\" or "/" or ":" or "*" or "?" or """ or "<" or ">" or "|"
    then msgbox"attention le nom du fichier ne peut comporter de caratères tels que " & chr(13) & "\ / : * ? < > |"
    end if
loop while Enregistrement ="****"

Par avance merci ( je pense qu'il faut faire une recherche et non pas un If , mais je laisse les expert s'exprimmer)
--
la théorie et la pratique c'est la même chose...enfin en théorie
Configuration: win Xp Sp2 , office 2003

12 réponses

  1. pilas31 Messages postés 1878 Statut Contributeur 648
     
    Bonjour,

    Voila une proposition :

    Do
            Enregistrement = InputBox("Nom du programme", "Nom Programme", Left(Nomfichier, Len(Nomfichier) - 4))
            If Enregistrement = "" Then MsgBox "rentrer un nom de programme", vbExclamation
        Loop While Enregistrement = ""
        For Icar = 1 To Len(Enregistrement)
        Car = Mid(Enregistrement, Icar, 1)
        If Car = "/" Or Car = ":" Or Car = "*" Or Car = "?" Or Car = "<" Or Car = """" Or Car = ">" Or Car = "|" Then
            MsgBox ("attention le nom du fichier ne peut comporter de caratères tels que " & Chr(13) & "\ / : * "" ? < > |")
            Exit For
        End If
        Next Icar


    On teste caractère par caratère.
    Pour les guillemets il faut les doubler pour qu'ils soient pris en compte.

    A+
    0
  2. pou pouille Messages postés 212 Statut Membre 31
     
    Un grand merci , cela fonctionne très bien en effet ,cependant je souhaiterai que si un caractère incorecte soit détecté , le message d'erreur s'affiche et que l'on revienne à la première étape qui est le Do enregistrement= ...
    0
  3. pilas31 Messages postés 1878 Statut Contributeur 648
     
    Oui tu peux utiliser la boucle par exemple :

    Do
            Enregistrement = ...        
            If Enregistrement = "" Then MsgBox "rentrer un nom de programme", vbExclamation
        
        For Icar = 1 To Len(Enregistrement)
        Car = Mid(Enregistrement, Icar, 1)
        If Car = ...
             MsgBox ("attention le nom du fichier ne peut comporter de caratères tels que " ...        
            Enregistrement = ""
            Exit For
        End If
        Next Icar
        Loop While Enregistrement = ""

    A+
    0
  4. pou pouille Messages postés 212 Statut Membre 31
     
    cela fonctionne parfaitement merci
    (j'avai en tete d'affecter une variable =0 ou 1 et de sortir du loop tant que il y a 1 ou 0, mais c'est bien plus simple comme cela, une seule boucle )
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    bonjour,

    a la bourre comme d'hab mais j'y vas quand m^

    avec une fonction réutilisable partout ailleurs qui renvoie vrai ou faux (vrai: il y a un caractère interdit mais on peut choisir l'inverse)

    Function detecter_car_interdit(nom_fichier As String) As Boolean
     Dim interdit
     Dim cptr As Long
         interdit = Array("""", "/", "?", ":", "|", "*", "<", ">", "[", "]")
         For cptr = LBound(interdit) To UBound(interdit)
             If InStr(nom_fichier, interdit(cptr)) Then
             detecter_car_interdit = True
             Exit Function
             End If
         Next cptr
         detecter_car_interdit = False
     End Function
    
    0
  7. pou pouille Messages postés 212 Statut Membre 31
     
    Merci pour ta participation michel_m , peut tu me dire comment intégrer cette fonction ( ou simplement l'appelle de la fonction) à ma boucle .
    (je souhaite comprendre un peut mieux l'utilisation et l'appelle de fonction) Merci.
    0
  8. pilas31 Messages postés 1878 Statut Contributeur 648
     
    Salut michel_m

    Solution trés élégante (comme d'hab !).

    Pour pou pouille voila un exemple d'utilisation de la fonction de Michel.

    Dim Enregistrement As String    
        Do
            Enregistrement = InputBox("Nom du programme", "Nom Programme", Left(Nomfichier, Len(Nomfichier) - 4))
            If Enregistrement = "" Then MsgBox "rentrer un nom de programme", vbExclamation
        If detecter_car_interdit(Enregistrement) Then
            MsgBox ("attention le nom du fichier ne peut comporter de caratères tels que " & Chr(13) & "\ / : * "" ? < > |")
            Enregistrement = ""
        End If
        Loop While Enregistrement = ""


    A+
    0
  9. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Pou pouille: pour s'initier en douce aux sub paramétrées et aux fonctions:
    http://www.info-3000.com/vbvba/subfunction.php
    l'intérêt d'une fonction est que tu fait ça une bonne fois pour toutes sans avoir à tout réinventer à chaque procédure: tu te constitue ainsi un grenier dans lequel tu puises tranquillement en économisant de la matière grise!

    Bon!
    J'allais m'y mettre mais heureusement l'ami Pilas l'a fait, donc merci! -merci aussi pour ton appréciation: i am tout colorindex=3-

    il y a une petite vach... où je me suis fait piéger: si l'utilisateur tape par ex: "aze.ty.bmp", il faut donc ajouter dans l'array le point.
    d'autre part, une extension peut comporter 4 lettres (.jpeg) mais...

    je vais regarder ce truc; quand, je sais pas
    0
  10. pou pouille Messages postés 212 Statut Membre 31
     
    merci beaucoup,
    j'intègrerais cette fonction lundi quand je retournerai bosser ^^.
    ce n'est pas la peine de se préoccuper de la terminaison puisque derrière enregistrement (enfin bien plus loin dans ma macro je rajoute l'extension Enregistrement & ".SMD" . ( et j'ai deja essayé sur mon ordi si je fait un truc du genre : toto.doc , il me le prend bien en toto.doc.smd donc aucun problème avec le point)
    0
  11. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    re,re,
    je sursaute quand je vois un nom de fichier style "toto.doc.smd" car c'est assez typique d'un virus (avec notamment "toto.doc.vbs") mais... '
    ci dessous fonction + générale interdisant les 2 points dans le nom du fichier et avec des extensions à n caractères

    Function detecter_car_interdit(nom_fichier) As Boolean
     Dim interdit
     Dim cptr As Long
        'teste si 2 points dans le nom de fichier
        If Len(nom_fichier) - Len(Replace(nom_fichier, ".", "")) > 1 Then GoTo erreur
        'teste si nom de fichier comporte une extension
        If InStr(nom_fichier, ".") = 0 Then
            MsgBox " nom de fichier sans extension", vbCritical
            GoTo erreur
        End If
        ' travaille sur la partie gauche avant l'extension
        nom_fichier = Left(nom_fichier, InStr(nom_fichier, ".") - 1)
         interdit = Array("""", "/", "?", ":", "|", "*", "<", ">", "[", "]", ".")
         For cptr = LBound(interdit) To UBound(interdit)
             If InStr(nom_fichier, interdit(cptr)) Then GoTo erreur
         Next cptr
         
    detecter_car_interdit = False
    Exit Function
    erreur:
    detecter_car_interdit = True
     End Function
    
    ----------------------------------
    
    Sub test()
    Dim fichier As String
    fichier = "az.ertY.jpeg"
    MsgBox detecter_car_interdit(fichier)
    End Sub
    0
    1. pou pouille Messages postés 212 Statut Membre 31
       
      bonjour,
      je suis désolé mais je ne savais pas que "toto.doc.vbs" était un virus.
      pour moi toto c'est juste histoire de donner un nom bidon à mes fichiers de test.
      j'ai donc réutilisé une partie du code pour faire ce que je souhaite (les deux points dans un meme nom de fichier n'étant pas génant pour moi puisque je crée le fichier nommé nom_fichier et que je l'enregistre au format .doc)
      Merci comme meme pour ce code que je réutiliserai sans doute un peut plus tard.
      de meme pour l'erreur 0 et 75, je pense qu'elles peuvent m'etre utile seulement dans le cas ou le fichier éxiste déja. je post le code donc que j'utilise.
      Function detecter_car_interdit(nom_fichier) As Boolean
       Dim interdit
       Dim cptr As Long
          'teste si 2 points dans le nom de fichier
          If Len(nom_fichier) - Len(Replace(nom_fichier, ".", "")) > 1 Then GoTo erreur
          'teste si nom de fichier comporte une extension
          If nom_fichier = "" Then
              MsgBox "rentrer un nom programme", vbExclamation
              GoTo erreur1
          End If
           interdit = Array("""", "\","/", "?", ":", "|", "*", "<", ">", "[", "]", ".")
           For cptr = LBound(interdit) To UBound(interdit)
               If InStr(nom_fichier, interdit(cptr)) Then GoTo erreur
           Next cptr     
      detecter_car_interdit = False
      Exit Function
      erreur:
      MsgBox ("Attention le nom du fichier ne peut comporter de caratères tels que :" & vbCrLf & vbTab & vbTab & vbTab & "\ / : * "" ? < > | .")
      erreur1:
      detecter_car_interdit = True
      End Function
      ---------------------------------
      Do
              Enregistrement = InputBox("Nom du programme", "Nom Programme", Left(NomFichier, Len(NomFichier) - 4))
      Loop While detecter_car_interdit(Enregistrement) = True
      
      0
      1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320 > pou pouille Messages postés 212 Statut Membre
         
        Bonjour
        je ne savais pas que "toto.doc.vbs" était un virus.

        Ca veut dire que ca ressemble à un virus mais ca ne l'est pas forcément...la double extension est d'ailleurs repérée par tout anti-virus (m^me Avast...).

        Extrait du site de de JC Bellamy sur le virus " I love you"
        http://www6.bellamyjc.org/?tdfs=1&kw=Computer+Software+Blog&term=Computer%20Knowledge%20Base%20Software&term=Windows%20Server%20Patch%20Management%20Software&term=Windows%20Server%20Backup%20Software&backfill=0

        Le virus est contenu dans un fichier, nommé LOVE-LETTER-FOR-YOU.TXT.vbs, et figure en pièce-jointe dans un courrier électronique. Cette double extension, qui peut sembler étrange, permet au virus de se déguiser aux yeux d'un utilisateur de Windows n'ayant pas reconfiguré l'explorateur. En effet, par défaut, l'explorateur n'affiche pas les extensions "connues", c'est à dire qui sont associées à une application. Or si on dispose de WSH, les fichiers ayant l'extension .vbs sont associés à l'application wscript.exe (par défaut).

        Si bien que le virus sera affiché sous le nom LOVE-LETTER-FOR-YOU.TXT , et sera donc pris pour un simple fichier texte (sauf si l'utilisateur remarque l'icône et le type associés).
        0
      2. pou pouille Messages postés 212 Statut Membre 31 > michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention  
         
        ok je comprend mieux.
        j'ai modifier les parametres d'affichage de mon ordi c'est pour cela que j'ai parfois les doubles extentions (car le format *.smd n'est pas connu par windows).
        je devrai pas tarder à poster un nouveau sujet parce que ma macro fonctionne bien mais sous 2007 j'ai des problèmes... affaire à suivre.
        merci pour les explications
        0
  12. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour tout le monde,

    Une autre façon de faire serait de tenter d'ouvrir le fichier et laisser faire windows pour rejeter les mauvais noms.
    Dans ton cas l'err 75 t'interesse : le chemin et le nom du fichier sont corrects et il n'existe pas.
    Et éventuellement l'err 0 : fichier existant, pour accepter ou refuser.

    ex :
    Sub test()
        fich = FreeFile
        On Error Resume Next
        Open "c:\" & "te|st.txt" For Output As #fich
        MsgBox ("Err " & Err.Number & " : " & Err.Description)
        Close #fich
        if err= 0 or err=75 then 
            ok=true  ' ecrire fichier
        endif
        On Error GoTo 0
    End Sub


    Ca peut être fait sous forme de fonction aussi
    eric
    0
  13. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    bonjour,
    Eric: ta démo est très intéressante!!
    merci
    0