Cellule sans caractère interdit

Résolu
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 - 9 janv. 2013 à 18:47
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 - 10 janv. 2013 à 22:43
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

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
10 janv. 2013 à 07:37
Oui mais, de cette manière, ta procédure Caractères va se trouver lancée 3 fois à chaque modif d'une cellule (n'importe laquelle) su ta feuille ! C'est plutôt lourd ...
Je vais essayer de te fabriquer un autre petit truc pour éviter cela. Je m'y mettrai dans la journée.


________________________
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
10 janv. 2013 à 08:21
Je viens de relire ton code ===>
J'y vois d'emblée quelques erreurs (ton parcours des caractères avec j !, entre autres) et des maladresses (autres que ce que j'ai signalé plus haut).
La pire est que tout ne sera pas mis en rouge
Je reviens dans 10 minutes (te temps de faire du propre)


________________________
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
10 janv. 2013 à 08:26
Voilà ===>>

Private qui As Range, cellules_a_controler  As Range, interdits
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
     interdits = Array("", "/", ":", "*", "?", """", ">", "<", "|")
  End If
  If Not Intersect(Target, cellules_a_controler) Is Nothing Then
    Set qui = Target
  Else
    If Not qui Is Nothing Then
      Caractères qui
    Else
      Set qui = Nothing
    End If
  End If
End Sub
Private Sub Caractères(cellule As Range)
   Dim i As Integer, j As Integer, CarInc As String, CarInt As String, attention As Boolean
   For i = 1 To Len(cellule.Text)
      CarInc = Mid(cellule.Text, i, 1)
      For j = 0 To UBound(interdits)
         CarInt = interdits(j)
         If CarInc = CarInt Then
            attention = True
            With cellule.Characters(Start:=i, Length:=1).Font
              .FontStyle = "Gras"
              .ColorIndex = 3
              .Size = 12
          End With
          cellule.Activate
        End If
      Next j
    Next i
    If attention Then MsgBox "les caractères ici mis en rouge sont interdits !"
 End Sub

- Ta procédure ne sera appelée que si nécessaire et pour une seule cellule, chaque fois
- un seul message
- tous les caractères indus mis en rouge
- l'utilisateur ne pourra esquiver en aucun cas

Tu dis...

________________________
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
10 janv. 2013 à 08:34
Lorsque tu auras essayé et approuvera, j'apporterai encore une petite modif qui pourrait être dans certains cas nécessaire (une petite modif facile).


________________________
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 1
10 janv. 2013 à 11:07
Bonjour Ucfoutu,

... "cellules_a_controler" erreur 2042 ...

Probablement à cause de ces cellules fusionnées...

Effectivement, tu as raison, je "balaye" trois fois... pour chaque Worksheet_Change -ou Selection_Change si j'y déplace mes 3 lignes Caractères Range("...")-.

Ce n'est certes pas élégant, mais en attendant de trouver mieux, j'ai opté pour inclure chacune des 3 plages (3 fois mon code de Caratcères) directement dans Selection_Change avec un Exit Sub ajouté. Résultat: Le focus revient toujours sur la plage où il y a un caractère interdit, ce qui "fige" la saisie tant que le problème n'est pas corrigé.



Rataxes64
0
Rejoignez-nous