Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Problème de contrôle de saisies qui ne fonctionne que pour les saisies numériques

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Magic_Doctor

XLDnaute Barbatruc
Supporter XLD
Bonjour,

Depuis un moment, avec l'aide incontournable du forum, j'essaie de mettre au point un contrôle de saisies pour une feuille. Il est un peu complexe car il fait beaucoup de choses. Il marche, ma foi, très bien, sauf quand il s'agit se saisies erronées non numériques.
J'ai réalisé un résumé le plus clair possible de cette feuille où tout y est expliqué en détail.

Un grand merci à qui me tirera d'affaire !
 

Pièces jointes

Re : Problème de contrôle de saisies qui ne fonctionne que pour les saisies numérique

Bonjour

Pour vérifier si on ne saisit pas une valeur numérique il suffit de tester le code ascii du caractère

Il est facile de connaitre le code
les chiffres de 0 à 9 donne en hexadécimal 30 à 39 soit en décimal
3*16=48 à 3*16 + 9= 57

Code:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Select Case KeyAscii
    Case Is < 48, Is > 57
        KeyAscii = 0
    End Select
End Sub

JP
 
Re : Problème de contrôle de saisies qui ne fonctionne que pour les saisies numérique

Magic_Doctor,
J'ai bien évidemment ouvert votre classeur.
Je ne vous ai posté ma réponse que dans l'idée de vous rendre service avec mes (trop ?)maigres connaissances. Si cela ne vous convenai pas, il suffisait de le dire...
Veuillez m'excuser de m'être mélé de votre demande , on ne m'y reprendra plus.
Au revoir
Cordialement
 
Re : Problème de contrôle de saisies qui ne fonctionne que pour les saisies numérique

Bonjour jp14,

Les saisies sont contrôlées par la fonction suivante :

Public Function ControleSaisie(saisie As Range, dilemme As Byte) As Byte
'Magic_Doctor/Hasco

If saisie = "" Then
ControleSaisie = 0 'la cellule vide est autorisée
ElseIf dilemme = 1 And saisie <= 0 Or Not IsNumeric(saisie) Or TypeName(saisie.Value) = "String" Or TypeName(saisie.Value) = "Error" Then
ControleSaisie = 1 'cellule avec contenu non numérique ou <= 0 pas autorisée
ElseIf dilemme = 0 And saisie < 0 Or Not IsNumeric(saisie) Or TypeName(saisie.Value) = "String" Or TypeName(saisie.Value) = "Error" Then
ControleSaisie = 1 'cellule avec contenu non numérique ou < 0 pas autorisée
Else
ControleSaisie = 0 'tout le reste est autorisé
End If

End Function

Hasco m'avait conseillé, et à raison, de rajouter : TypeName(saisie.Value) = "String", car dans certaines saisies erronées comme, par ex. : "6+", ça boguait. Mais, le problème de la gestion de TOUTES les saisies erronées n'est pas encore réglé. J'en avais parlé sur un autre fil, mais ça n'avait pas passionné grand monde... Quoi qu'il en soit, cette fonction (à part certains détails non résolus) fait bien la part des saisies. Faites l'essai et vous vous en rendrez compte.
En revanche, dans la procédure (qui ne se peut deviner) il en va tout autrement. Toutes les conditions du numérique sont satisfaites (on met une valeur négative par ex., apparaissent les "? ? ?" dans la cellule). Par contre pour le non numérique, je n'arrive pas à comprendre ce qui se passe et les "? ? ?" n'apparaissent pas.
Je ne pense pas qu'intuitivement on puisse régler ce problème ; il faut aller dans les "entrailles" de la macro.
 
Re : Problème de contrôle de saisies qui ne fonctionne que pour les saisies numérique

Veuillez, je vous prie, m'excuser Efgé. Loin de moi l'intention d'être hautain ou impoli.
Puisque vous avez ouvert le classeur, vous auriez donc dû voir que le "Not IsNumeric" y figurait. D'où ma réponse laconique, pensant que vous n'aviez pas ouvert le classeur.

Buenas tardes.
 
Re : Problème de contrôle de saisies qui ne fonctionne que pour les saisies numérique

Bonjour

On ne peut mettre dans un même test
And saisie < 0 Or Not IsNumeric(saisie)

car saisie<0 est testé et renvoie un erreur avant que not isnumeric règle le problème.

Il faut donc faire un test sur "not isnumeric" puis, le cas non échéant, un second test pour le contrôle des valeurs numériques

Je sais cela alourdit le code mais c'est ainsi : il peut alors être plus lisible de traiter les cas avec un select case.
 
Re : Problème de contrôle de saisies qui ne fonctionne que pour les saisies numérique

Bonjour

Pour être sur de ces contrôles, il faut utiliser les fonctions les plus basiques.


si cellule non vide vérifier son contenu en tenant compte des codes ascii
Code:
For i =1 to len(valeur)
  ok= false
  if asc(mid(valeur,i,1)> 47 and asc(mid(valeur,i,1)< 58 then ok = true
  if asc(mid(valeur,i,1)= asc(",") then ok= true ' si on autorise une virgule
 if ok = false then exit for ' on a détecté une erreur
next i

En écrivant ce programme on revient à la base de la programmation, on est sur des réponses.


JP
 
Re : Problème de contrôle de saisies qui ne fonctionne que pour les saisies numérique

Bonjour jp14,

J'ai suivi votre conseil en commençant tout simplement par réaliser les 2 tests suivants :

Public Function ControleSaisie(saisie As Range, dilemme As Byte) As Byte
'Magic_Doctor/Hasco

----------
1er test
----------
Public Function ControleSaisie (saisie As Range, dilemme As Byte) As Byte

If saisie = "" Then
ControleSaisie = 0 'la cellule vide est autorisée
ElseIf dilemme = 1 And saisie <= 0 Then
ControleSaisie = 1 'cellule avec contenu non numérique ou <= 0 pas autorisée
ElseIf dilemme = 0 And saisie < 0 Then
ControleSaisie = 1 'cellule avec contenu non numérique ou < 0 pas autorisée
Else
ControleSaisie = 0 'tout le reste est autorisé
End If

End Function

Comme prévu, avec les valeurs numériques ça marche.

----------
2ème test
----------
Public Function ControleSaisie4 (saisie As Range, dilemme As Byte) As Byte

If saisie = "" Then
ControleSaisie = 0 'la cellule vide est autorisée
ElseIf dilemme = 1 And Not IsNumeric(saisie) Then
ControleSaisie = 1 'cellule avec contenu non numérique ou <= 0 pas autorisée
ElseIf dilemme = 0 And Not IsNumeric(saisie) Then
ControleSaisie = 1 'cellule avec contenu non numérique ou < 0 pas autorisée
Else
ControleSaisie = 0 'tout le reste est autorisé
End If

End Function

Ça ne marche évidemment pas avec les valeurs numériques, mais ça ne marche pas non plus (malheureusement comme prévu...) avec les valeurs non numériques.

Ce qu'il y a de bizarre, c'est que la fonction initiale, individuellement, marche dans TOUS les cas de figure (sauf pour certaines saisies "tordues"). Il faut l'essayer pour s'en convaincre.
Le problème m'a l'air plus alambiqué...
 
Re : Problème de contrôle de saisies qui ne fonctionne que pour les saisies numérique

Pardon, j'ai confondu jp14 avec Chris. Ce doit être la chaleur (on étouffe ici !). Je viens de m'en rendre compte après le déjeuner.

Je vais étudier la solution de jp14, mais j'ai l'intuition que si elle règle TOUTES les possibilités de contrôles de saisies, elle ne résoudra pas pour autant le problème des maudites valeurs non numériques dans cette satanée macro. Il faut essayer la feuille pour mieux comprendre et se rendre compte que lorsqu'une valeur non numérique est introduite, la boucle qui analyse toutes les cellules nommées de la feuille dont le nom commence par "Dil" a un sérieux problème et s'arrête au 1er tour !?! : rien ne se passe et c'est la cellule dont le nom est en tête de liste des noms des cellules nommées qui est toujours sélectionnée.

¡Este maldito problema me está hinchando las pelotas!
 
Re : Problème de contrôle de saisies qui ne fonctionne que pour les saisies numérique

Merci pierrejean pour ta tentative, mais chez moi ça ne marche pas fort.
Je suis persuadé que la solution est infiniment plus simple. Il faut à un moment donné court-circuiter la macro qui est responsable, quand la valeur est non numérique, du problème.
Certains prétendent que le problème est dans le contrôle de saisies, mais je l'ai testé quantités de fois et il fonctionne très bien. Le hic est certainement bien plus simple et subtil. Comme on dit ici "debe ser una pavada" ou en bon français "ce doit être une connerie".
 
Re : Problème de contrôle de saisies qui ne fonctionne que pour les saisies numérique

Re

Ca ne marche pas fort ,l'expression est jolie mais pas très explicite !!!
Mais passons
Ta macro ControleCellules bute en fait sur cette ligne
Code:
If Left(Names(i).Name, Len(prefixe)) = prefixe And Range(Names(i).Value) = "? ? ?" Then
qu'il serait preferable d'ailleurs d'ecrire:
Code:
If Left(Names(i).Name, Len(prefixe)) = prefixe And [COLOR=blue]Range(Names(i).Name).Value[/COLOR] = "? ? ?" Then

En effet une valeur alpha entraine en L4 une erreur et même Range(Names(i).Name).Value n'est pas accepté (erreur 2005)

Sans savoir si le resultat en sera correct voila la macro qui tourne
Code:
Sub ControleCellules(Target As Range, prefixe As String, RememberCell As Variant)
'Magic_Doctor/mromain/Hervé
'Blocage de toutes les cellules s'il en existe une avec "? ? ?"
Dim i As Byte, NomCelda As String, celda As Range, NbLgn As Byte, NbCol As Byte
Dim MergeCelda As Byte
Bourde = 0
MergeCelda = 0
'On Error Resume Next
Dim x As Boolean
For i = 1 To Names.Count
If IsError(Range(Names(i).Name).Value) Then
  x = True
Else
  x = Range(Names(i).Name).Value = "? ? ?"
End If
    'Si le nom de la cellule commence par "prefixe" & que la cellule contient "? ? ?"
    If Left(Names(i).Name, Len(prefixe)) = prefixe And x Then
        'Récupère le nom de la cellule ("NomCelda") qui contient "? ? ?"
        NomCelda = Names(i).Name: Bourde = 1
        'Défusionne les cellules fusionnées
        Set celda = Range(NomCelda)
        If IsMerge(celda) = -1 Then  'Si la cellule contenant "? ? ?" est fusionnée
            'Renvoie & mémorise le nombre de lignes et/ou de colonnes
            'de la cellule fusionnée contenant "? ? ?"
            NbLgn = NbLignes(celda): NbCol = NbColonnes(celda)
            celda.UnMerge: MergeCelda = 1
        End If
        Exit For
    End If
Next i
'Si on a trouvé "? ? ?" dans une des cellule, remettre l'ancienne valeur dans la
'cellule active, sélectionner la cellule qui contient "? ? ?" et quitter la macro
If Bourde = 1 Then  'S'il existe une cellule avec "? ? ?"
    Target.Value = RememberCell
    'Refusionne la cellule défusionnée qui contient "? ? ?"
    If MergeCelda = 1 Then Range(celda, celda.Offset(NbLgn - 1, NbCol - 1)).Merge
    celda.Select
End If
End Sub

PS: Je crois que l'on ne dira jamais assez que le on resume next est a utiliser avec d'infinies precautions
 
Re : Problème de contrôle de saisies qui ne fonctionne que pour les saisies numérique

Bonjour pierrejean,

Je n'ai pu répondre avant, étant absent de toute la journée.
Merci infiniment pour ta réponse qui m'a aidé à enfin en venir à bout de ce contrôle de saisies.

J'ai bien fait la modification :
If Left(Names(i).Name, Len(prefixe)) = prefixe And Range(Names(i).Name).Value = "? ? ?" Then

En revanche, concernant la variable x que tu déclares "As Boolean" :
Dim x As Boolean
For i = 1 To Names.Count
If IsError(Range(Names(i).Name).Value) Then
x = True
Else
x = Range(Names(i).Name).Value = "? ? ?"
End If

Je n'ai pas compris pourquoi x = Range(Names(i).Name).Value = "? ? ?"
étant donné que x ne peut, à ma connaissance, prendre que les valeurs "True" ou "False".
D'autre part, ça boguait...

Sur tes conseils, j'ai bien viré On "Error Resume Next".

Enfin, m'inspirant de ta démarche, j'ai commencé la boucle tout simplement par :
If IsError(Range(Names(i).Name).Value) Then Exit For

Et, ¡caramba! ça marche !!

Encore merci pour ton aide et une très bonne journée.
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

N
Réponses
5
Affichages
3 K
Nicocotte125
N
P
Réponses
1
Affichages
2 K
PierreJeanPierre
P
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…