Cellule sans caractère interdit [Résolu]

Signaler
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018
-
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018
-
Bonjour à tous,

Dans une cellule, je souhaite interdire (et donc annuler) la frappe des caractères interdits de Windows pour créer un nom de fichier.

Je sais faire pour un objet (avec "KeyPress"), mais je n'ai pas su trouver comment faire pour une cellule précise.

Voila le code que j'utilise, mais qui ne me convient pas complètement puisque je passe par un warning final déclenché par l'évènement "change" et que donc la frappe n'est pas annulée...

    'Caratctères interdits
    '============================================
        If Not Intersect(Target, Range("C96")) Is Nothing Then
            If InStr(1, ActiveCell.Value, "", 1) <> 0 _
            And InStr(1, ActiveCell.Value, "/", 1) <> 0 _
            And InStr(1, ActiveCell.Value, ":", 1) <> 0 _
            And InStr(1, ActiveCell.Value, "*", 1) <> 0 _
            And InStr(1, ActiveCell.Value, "?", 1) <> 0 _
            And InStr(1, ActiveCell.Value, """", 1) <> 0 _
            And InStr(1, ActiveCell.Value, ">", 1) <> 0 _
            And InStr(1, ActiveCell.Value, "<", 1) <> 0 _
            And InStr(1, ActiveCell.Value, "|", 1) <> 0 _
            Then
            Else
                Range("C96").Select
                MsgBox "Caratère interdit!"
            End If
        End If


Merci pour toute aide (Excel 2003)

Cordialement
Rataxes64

25 réponses

Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Voila ce que j'ai avec WorkSheet_SelectionChange(...)

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Vérifie s'il y a des caratères interdits par Windows pour
'les noms de Répertoire et de Fichier pour son Exportation

    If Sheets("Units").Range("E62").Value = 1 Then Exit Sub     'Blocage nécessaire à certains calculs
    'Déclarations
    Dim i As Integer, j As Integer, interdits, CarInc As String, CarInt As String, Plage As Range
    'Déprotège
    ActiveSheet.Unprotect
    'Boutons activés
    FoldButton.Enabled = True                   'Noms de(s) Répertoire(s)
    FileButton.Enabled = True                   'Nom du Fichier
    ButtonExporter.Enabled = True               'Exportation
    'Caractères interdits
    interdits = Array("", "/", ":", "*", "?", """", ">", "<", "|")
    'Pour chacune des 4 Plages concernées
    For q = 1 To 4
        'Seting
        If q 1 Then Set Plage Range("D95")  'Répertoire 1 Ville
        If q 2 Then Set Plage Range("C94")  'Répertoire 2 Client
        If q 3 Then Set Plage Range("C96")  'Répertoire 3 Bâtiment
        If q 4 Then Set Plage Range("C97")  'Fichier Salle
        'nombre de caractères de la syntaxe de la cellule concernée
        i = Len(Plage.Value)
        'pour chaque caractère de la syntaxe de la cellule concernée
        For i = 1 To Len(Plage)
            CarInc = Mid(Plage.Value, i, 1)
                'pour chaque type de caratère interdit
                For j = 0 To UBound(interdits)
                    CarInt = interdits(j)
                    If CarInc = CarInt Then
                        'Police Gras, Rouge et 12
                        With Plage.Characters(Start:=i, Length:=1).Font
                            .FontStyle = "Gras"
                            .ColorIndex = 3
                            .Size = 12
                        End With
                        'Warning
                        MsgBox "Le Caratère " & CarInt & " est interdit!"
                        'Désactive les boutons
                        FoldButton.Enabled = False
                        FileButton.Enabled = False
                        ButtonExporter.Enabled = False
                        'Bloque la Sub
                        Application.EnableEvents = False
                        'Active la Plage avec un Caratère Interdit
                        Plage.Activate
                        'Débloque la Sub
                        Application.EnableEvents = True
                        'Unseting
                        Set Plage = Nothing
                        'Reprotège
                        ActiveSheet.Protect
                        'Quitte
                        Exit Sub
                    End If
            Next j
        Next i
    Next q
    'Unseting
    Set Plage = Nothing
    'Reprotège
    ActiveSheet.Protect

End Sub


Cellule Units!E62=1 blocage lors des calculs faits par les macros dans la feuille Data.

Boutons de création de la syntaxe du chemin et enregistrement du Fichier neutralisés si caractère interdit.

Par rapport à la solution WorkSheet_Change précédente, on n'a que les premiers des types de caractères interdits qui passent eu rouge, mais on revient sur la plage erronée à chaque sélection.


C'est pas terrible, mais on va faire avec...

Amicalement
Rataxes64
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Il n'est pas possible de contrôler, en cours de saisie, la saisie du contenu d'une cellule. Tu ne peux donc en effet le faire qu'en quittant la cellule concernée.
Mécanisme : variable générale (valeur cellule) si au selection_change, la cellule est concernée par cette restriction. Au sortir (au change, donc) : vérifier et si pas bon ===>> remettre le contenu de la variable.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Reviens avec ton essai sur ces bases et nous :
1) corrigerons au besoin
2) allègerons ton code


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Voila le code attendu, sachant que puisque je ne veux pas supprimer ce qui a été tapé, je vais mettre en gras et rouge les caractères interdits relevés sur une seule "passe" (seule le premier d'un même caractère interdit répété sera en gras-rouge).
    'Caratctères interdits
    '============================================
        If Range("C96").Value <> "" Then
            If InStr(1, Range("C96").Value, "") <> 0 Then
                Range("C96").Activate
                With Selection.Characters(Start:=InStr(1, ActiveCell.Value, ""), Length:=1).Font
                    .FontStyle = "Gras"
                    .ColorIndex = 3
                End With
            End If
            If InStr(1, Range("C96").Value, "/", 1) <> 0 Then
                Range("C96").Activate
                With Selection.Characters(Start:=InStr(1, ActiveCell.Value, "/"), Length:=1).Font
                    .FontStyle = "Gras"
                    .ColorIndex = 3
                End With
            End If
            If InStr(1, Range("C96").Value, ":", 1) <> 0 Then
                Range("C96").Activate
                With Selection.Characters(Start:=InStr(1, ActiveCell.Value, ":"), Length:=1).Font
                    .FontStyle = "Gras"
                    .ColorIndex = 3
                End With
            End If
            If InStr(1, Range("C96").Value, "*", 1) <> 0 Then
                Range("C96").Activate
                With Selection.Characters(Start:=InStr(1, ActiveCell.Value, "*"), Length:=1).Font
                    .FontStyle = "Gras"
                    .ColorIndex = 3
                End With
            End If
            If InStr(1, Range("C96").Value, "?", 1) <> 0 Then
                Range("C96").Activate
                With Selection.Characters(Start:=InStr(1, ActiveCell.Value, "?"), Length:=1).Font
                    .FontStyle = "Gras"
                    .ColorIndex = 3
                End With
            End If
            If InStr(1, Range("C96").Value, """", 1) <> 0 Then
                Range("C96").Activate
                With Selection.Characters(Start:=InStr(1, ActiveCell.Value, """"), Length:=1).Font
                    .FontStyle = "Gras"
                    .ColorIndex = 3
                End With
            End If
            If InStr(1, Range("C96").Value, ">", 1) <> 0 Then
                Range("C96").Activate
                With Selection.Characters(Start:=InStr(1, ActiveCell.Value, ">"), Length:=1).Font
                    .FontStyle = "Gras"
                    .ColorIndex = 3
                End With
            End If
            If InStr(1, Range("C96").Value, "<", 1) <> 0 Then
                Range("C96").Activate
                With Selection.Characters(Start:=InStr(1, ActiveCell.Value, "<"), Length:=1).Font
                    .FontStyle = "Gras"
                    .ColorIndex = 3
                End With
            End If
            If InStr(1, Range("C96").Value, "|", 1) <> 0 Then
                Range("C96").Activate
                With Selection.Characters(Start:=InStr(1, ActiveCell.Value, "|"), Length:=1).Font
                    .FontStyle = "Gras"
                    .ColorIndex = 3
                End With
            End If
            If InStr(1, Range("C96").Value, "") = 0 _
            And InStr(1, Range("C96").Value, "/") = 0 _
            And InStr(1, Range("C96").Value, ":") = 0 _
            And InStr(1, Range("C96").Value, "*") = 0 _
            And InStr(1, Range("C96").Value, "?") = 0 _
            And InStr(1, Range("C96").Value, """") = 0 _
            And InStr(1, Range("C96").Value, ">") = 0 _
            And InStr(1, Range("C96").Value, "<") = 0 _
            And InStr(1, Range("C96").Value, "|") = 0 _
            Then
            Else
                guil = """"
                MsgBox "Caratères interdits!" & vbNewLine & vbNewLine & _
                " \ / : * ? " & guil & " > < | ", vbCritical
            End If
        End If


Pas terrible, n'est-ce pas?
Surtout qu'il va falloir que je fasse ça sur une dizaine d'autres cellules éparpillées sur la même feuille

Rataxes64
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Mais en plus, je viens de jeter un coup d'oeil rapide à ton code !
La seule saisie qui serait acceptée par un tel code serait ... celle qui réunirait tous les caractères que tu dis apparemment vouloir interdire !
Qu'en est-il donc, finalement ?


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Oui, mauvais placement dans le If final au premier message.
Mais le If final est corrigé dans le dernier.



Rataxes64
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Regarde du vite fait bien fait qui me parait plus raisonnable :

Private anc As String ' ============IMPORTANT

Private Sub Worksheet_Change(ByVal Target As Range)
   If Not Intersect(Target, Range("C96")) Is Nothing Then
   Dim i As Integer, interdits, boudiou As String
      interdits = Array("", "/", ":", "*", "?", """", ">", "<", "|")
      For i = 0 To UBound(interdits)
        If InStr(Target.Text, interdits(i)) Then
          Application.EnableEvents = False '===>> pour ne pas recommencer en corrigeant
          Target.Value anc: boudiou interdits(i)
          MsgBox "le Caratère " & boudiou & " est interdit!"
          Target.Select
          Application.EnableEvents = True '===>> on rétablit
          Exit Sub
        End If
      Next
   End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Not Intersect(Target, Range("C6")) Is Nothing Then
    anc = Target.Text
  End If
End Sub





________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Passer par "Worksheet_Change(ByVal Target As Range)" se révèle très lourd, car on ne peut pas utiliser "If Not Intersect(Target, As Range)) Is Nothing"...

Je vais essayer de bâtir quelque chose avec une Fonction appelée par une cellule de report
"=CaratèreInterdit(cellule_à_analyser)" et récupérer son résultat.

Est-ce une meilleure idée ?



Rataxes64
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Est-ce une meilleure idée ?

Non
Passer par "Worksheet_Change(ByVal Target As Range)" se révèle très lourd, car on ne peut pas utiliser "If Not Intersect(Target, As Range)) Is Nothing"...

Gné ?
As-tu essayé mon code ? (moi oui).

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Chapeau bas...

Je suppose que c'est :
If Not Intersect(Target, Range("C96")) Is Nothing Then

Je souhaite que le(s) caratères(s) interdit(s) soi(en)t passé(s) en gras rouge, et non pas d'effacer tout le texte saisi par Application.EnableEvents = True

Rataxes64
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Oui, bien sûr que j'ai AUSSITÔT essayé ton code, nos messages se sont seulement croisés : tu vas bien trop vite pour moi!

Rataxes64
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Regarde maintenant ce que ferait ceci :
Private anc As String, cellules_a_controler As Range

Private Sub Worksheet_Change(ByVal Target As Range)
   If Not Intersect(Target, cellules_a_controler) Is Nothing Then
     ahlala Target
   End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If cellules_a_controler Is Nothing Then
    Set cellules_a_controler = Union(Range("A3"), Range("B5")) '====>> tes cellules a vérifier
  End If
  If Not Intersect(Target, cellules_a_controler) Is Nothing Then
    anc = Target.Text
  End If
End Sub

Private Sub ahlala(cellule As Range)
   Dim i As Integer, interdits, boudiou As String
      interdits = Array("", "/", ":", "*", "?", """", ">", "<", "|")
      For i = 0 To UBound(interdits)
        If InStr(cellule.Text, interdits(i)) Then
          Application.EnableEvents = False '===>> pour ne pas recommencer en corrigeant
          cellule.Value anc: boudiou interdits(i)
          MsgBox "le Caratère " & boudiou & " est interdit!"
          cellule.Select
          Application.EnableEvents = True '===>> on rétablit
          Exit Sub
        End If
      Next
End Sub


sont par ce biais vérifiées les cellules A3 et B5. Tu en aurais plus ==>> tu les ajoutes !
Oublie tes bébelles en rouge car cela, oui alors, alourdirait énormément le code et poserait problème si l'utilisateur ne corrige pas (car alors : pas d'évènement change au 2ème coup !).


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Euh,

ici :
anc = Target.Text

erreur 94 : Utilisation incorrecte de Null

cela semble avoir un rapport avec le fait que la cellule a surveiller soit vide ou pas avant qu'on ne la clique.

Rataxes64
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Le fait que la cellule soit vide n'a rien à voir.

Cela veut dire que tu as fait une selection multiple ===>> parade ===>> on ajoute une condition ===>>>

Private anc As String, cellules_a_controler As Range

Private Sub Worksheet_Change(ByVal Target As Range)
   If Target.Count = 1 And Not Intersect(Target, cellules_a_controler) Is Nothing Then
     ahlala Target
   End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If cellules_a_controler Is Nothing And Target.Count = 1 Then
    Set cellules_a_controler = Union(Range("A3"), Range("B5")) '====>> tes cellules a vérifier
  End If
  If Target.Count = 1 And Not Intersect(Target, cellules_a_controler) Is Nothing Then
    anc = Target.Text
  End If
End Sub

Private Sub ahlala(cellule As Range)
   Dim i As Integer, interdits, boudiou As String
      interdits = Array("", "/", ":", "*", "?", """", ">", "<", "|")
      For i = 0 To UBound(interdits)
        If InStr(cellule.Text, interdits(i)) Then
          Application.EnableEvents = False '===>> pour ne pas recommencer en corrigeant
          cellule.Value anc: boudiou interdits(i)
          MsgBox "le Caratère " & boudiou & " est interdit!"
          cellule.Select
          Application.EnableEvents = True '===>> on rétablit
          Exit Sub
        End If
      Next
End Sub




________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Dis-moi (je commence à prendre de l'âge). Ne serait-ce pas toi qui, il y environ un an, m'avait fait faire une sacré gymnastique qui, précisément, aboutissait à ce genre systématique de sélections multiples (toute une ligne) ?
Si oui, je ne me rappelle plus avec précision le contexte et tes raisons d'agir ainsi, mais la solution est peut-être alors encore plus simple :
Dans mon code (avant la dernière modif) : dans l'évènement SelectionChange ===>>
remploace donc, pour voir :
anc = Target.Cells.Text
par
anc = Target.Cells(1, 1).Text
et laisse tout le reste tel quel.
Et dis-nous
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

La feuille de travail comprend un grand nombre de cellules fusionnées, dont 3 cibles à contrôler
D95:E95 , C96:J96 et C97:J97.

J'ai fait la modif, mais, bien sûr, j'ai toujours une erreur puisque Target.count # 1 pour ces 3 cibles (comme pour toute sélection sur des cellules fusionnées à ne pas contrôler).

Seule Solution: défusionner/refusionner par le code pour ces 3 plages ?


Rataxes64
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Ouais : ne peut fonctionner avec cellules fusionnées.
Essaye quand-même ce que je t'ai dit dans mon dernier message, pour voir


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Target.Cells.Text
ou
Target.Cells(1, 1).Text

Rien à faire, anc=Null et Null aime pas ça

C'est clair, Target ne reprend pas de cellules fusionnées...

J'ai bien posé un Target.merge avant, et bien sûr, là ça marche, mais quand et comment "refusionner" les cellules initialement fusionnées ?

Rataxes64
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Voilà, j'ai fait autrement, en utilisant une bonne part du code de Ucfoutu.

Private Sub Worksheet_Change(ByVal Target As Range)

    'Warning Caractères interdits
    '============================
        Caractères Range("D95")     'cellules fusionnées D95:E95
        Caractères Range("C96")     'cellules fusionnées C96:J96
        Caractères Range("C97")     'cellules fusionnées C97:J97

End sub


Private Sub Caractères(cellule As Range)

    'Déclarations
    Dim i As Integer, j As Integer, interdits, CarInc As String, CarInt As String
    'Caractères interdits
    interdits = Array("", "/", ":", "*", "?", """", ">", "<", "|")
    'nombre de caractères de la cellule concernée
    i = Len(cellule.Text)
    'pour chaque caractère
    For i = 1 To Len(cellule.Text)
        CarInc = Mid(cellule.Text, i, j)
            'pour chaque caratère interdit
            For j = 0 To UBound(interdits)
                CarInt = interdits(j)
                If CarInc = CarInt Then
                    'Warning
                    MsgBox "le Caratère " & CarInt & " est interdit!"
                    'Police Gras, Rouge et 12
                    cellule.Select
                    With Selection.Characters(Start:=i, Length:=1).Font
                        .FontStyle = "Gras"
                        .ColorIndex = 3
                        .Size = 12
                    End With
                End If
        Next j
    Next i
    
End Sub


A chaque action de saisie dans la feuille, le contrôle s'effectue (incitation à corriger), et il est également lancé par la macro de compilation du chemin du fichier à sauvegarder (non présentée ici)

Perso, je ne sais pas faire mieux... grâce à Codes-Sources !

milechker Ucfoutu
Amicalement à tous

Rataxes64
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Oups!

Une faute de frappe...
CarInc = Mid(cellule.Text, i, j)


correction
CarInc = Mid(cellule.Text, i, 1)


Il est tard...!

Amicalement
Rataxes64