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 :

Valeurs inputbox annulée ou validée / Valeur Null en VBA


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut Valeurs inputbox annulée ou validée / Valeur Null en VBA
    Bonjour à tous,

    Cette discussion est basée sur ma lecture de ce sujet.

    Suite à la découverte (merci Jacques) des fonctions cachées (StrPtr entres autres), je m'interroge sur les "retours" de l'InputBox et sur l'existence de la valeur Null en VBA.

    1. Que renvoie une InputBox validée sans saisie?
    2. Que renvoie une InputBox annulée?


    Selon ce test, on se rend bien compte qu'une annulation et une validation de saisie vide n'est pas la même chose :
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    Sub test()
    Dim c As String, entree As String, b1 As Boolean, b2 As Boolean, b3 As Boolean
    'comparaison entre c (String vide) et InputBox annulée
    entree = InputBox("Annulez SVP !!!")
    b1 = (StrPtr(c) = StrPtr(entree))
    b2 = (StrPtr(c) = 0)
    b3 = StrPtr(entree) = 0
    MsgBox "comparaison entre c (String vide) et InputBox annulée" & vbCrLf & _
        "StrPtr(c) = StrPtr(entree) : " & b1 & vbCrLf & _
        "StrPtr(c) = 0 : " & b2 & vbCrLf & _
        "StrPtr(entree) = 0 : " & b3
     
    'comparaison entre c (String vide) et InputBox validée sans saisie
    entree = InputBox("Validez sans saisie !!!")
    b1 = (StrPtr(c) = StrPtr(entree))
    b2 = (StrPtr(c) = 0)
    b3 = StrPtr(entree) = 0
    MsgBox "comparaison entre c (String vide) et InputBox validée sans saisie" & vbCrLf & _
        "StrPtr(c) = StrPtr(entree) : " & b1 & vbCrLf & _
        "StrPtr(c) = 0 : " & b2 & vbCrLf & _
        "StrPtr(entree) = 0 : " & b3
     
    c = ""
    'comparaison entre c = "" et InputBox annulée
    entree = InputBox("Annulez SVP !!!")
    b1 = (StrPtr(c) = StrPtr(entree))
    b2 = (StrPtr(c) = 0)
    b3 = StrPtr(entree) = 0
    MsgBox "comparaison entre c = """" et InputBox annulée" & vbCrLf & _
        "StrPtr(c) = StrPtr(entree) : " & b1 & vbCrLf & _
        "StrPtr(c) = 0 : " & b2 & vbCrLf & _
        "StrPtr(entree) = 0 : " & b3
     
    'comparaison entre c = "" et InputBox validée sans saisie
    entree = InputBox("Validez sans saisie !!!")
    b1 = (StrPtr(c) = StrPtr(entree))
    b2 = (StrPtr(c) = 0)
    b3 = StrPtr(entree) = 0
    MsgBox "comparaison entre c = """" et InputBox validée sans saisie" & vbCrLf & _
        "StrPtr(c) = StrPtr(entree) : " & b1 & vbCrLf & _
        "StrPtr(c) = 0 : " & b2 & vbCrLf & _
        "StrPtr(entree) = 0 : " & b3
    End Sub
    Quid également de la valeur Null? Existe t'elle en VBA???
    Oui, Non, pas vraiment...
    Testons donc...

    Test de comparaison entre la saisie vide (ou l'annulation) d'une inputbox et la constante VbNullString :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub essai()
    Dim bon As Boolean, entree As String, L As Integer
      Do While Not bon
        entree = InputBox("veuillez entrer un nombre entier entre 1 et 20")
        Select Case entree
            Case vbNullString: Exit Do
            Case Else: Bon = True
        End Select
      Loop
      ' voyons ce que nous avons saisi
      MsgBox IIf(bon, "vous avez saisi " & entree, "vous avez annulé")
    End Sub
    Test de comparaison entre la saisie vide (ou l'annulation) d'une inputbox et un String non rempli :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test2()
    Dim bon As Boolean, entree As String, L As Integer, strTest As String
      Do While Not bon
        entree = InputBox("veuillez entrer un nombre entier entre 1 et 20")
        Select Case entree
            Case strTest: Exit Do
            Case Else: Bon = True
        End Select
      Loop
      ' voyons ce que nous avons saisi
      MsgBox IIf(bon, "vous avez saisi " & entree, "vous avez annulé")
    End Sub

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour Franck
    l'utilisation de sptr est en fait tout simplement (je n'en connais aucune autre, dans passer par beaucoup de tremplins non VB) la seule manière de distinguer vbEmpty (ou "") de vbNullstring *****.
    Et ceci : qu'il s'agisse ou non de ce qui a été saisi dans une inputbox ou dans n'importe quoi d'autre.
    ***** ne pas confondre Null et VbnULLsTRING;
    J'utilise personnellement assez souvent cette fonction (créée à l'origine surtout pour passer un paramètre acceptable à certaines fonctions de l'Api de Windows, dont - et entre autres - la fonction MyUnicodeCall de la librairie "MyUnicodeDll.Dll" de l'Api de Windows) à divers tests (variable initialisée ou non ? Matrice initialisée ou non ? ) etc ...
    Je veux dès lors bien que l'on ouvre une discussion sur cette fonction, mais à une seule condition : qu'elle ne soit pas "liée" uniquement à l'analyse du résultat de l'utilisation de la fonction InputBox.
    Amitié.

  3. #3
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Merci Jacques de ta réponse.

    Je verrais ultérieurement s'il convient d'ouvrir une autre discussion sur strPtr. Je viens de découvrir, donc je teste au préalable ;-)

    Revenons en, si tu le veux bien, à ma question.
    Une InputBox annulée renvoie l'équivalant d'un String non remplit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim c As String, entree As String, b1 As Boolean, b2 As Boolean, b3 As Boolean
    'comparaison entre c (String vide) et InputBox annulée
    entree = InputBox("Annulez SVP !!!")
    b1 = (StrPtr(c) = StrPtr(entree))
    b2 = (StrPtr(c) = 0)
    b3 = StrPtr(entree) = 0
    MsgBox "comparaison entre c (String vide) et InputBox annulée" & vbCrLf & _
        "StrPtr(c) = StrPtr(entree) : " & b1 & vbCrLf & _
        "StrPtr(c) = 0 : " & b2 & vbCrLf & _
        "StrPtr(entree) = 0 : " & b3
    ça c'est OK, ça marche pour moi.
    Mais...
    Que renvoie une InputBox validée sans saisie?
    Elle ne renvoie ni un String non remplit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim c As String, entree As String, b1 As Boolean, b2 As Boolean, b3 As Boolean
    'comparaison entre c (String vide) et InputBox validée sans saisie
    entree = InputBox("Validez sans saisie !!!")
    b1 = (StrPtr(c) = StrPtr(entree))
    b2 = (StrPtr(c) = 0)
    b3 = StrPtr(entree) = 0
    MsgBox "comparaison entre c (String vide) et InputBox validée sans saisie" & vbCrLf & _
        "StrPtr(c) = StrPtr(entree) : " & b1 & vbCrLf & _
        "StrPtr(c) = 0 : " & b2 & vbCrLf & _
        "StrPtr(entree) = 0 : " & b3
    Ni la "chaine" : ""
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim c As String, entree As String, b1 As Boolean, b2 As Boolean, b3 As Boolean
    'comparaison entre c = "" et InputBox validée sans saisie
    c = ""
    entree = InputBox("Validez sans saisie !!!")
    b1 = (StrPtr(c) = StrPtr(entree))
    b2 = (StrPtr(c) = 0)
    b3 = StrPtr(entree) = 0
    MsgBox "comparaison entre c = """" et InputBox validée sans saisie" & vbCrLf & _
        "StrPtr(c) = StrPtr(entree) : " & b1 & vbCrLf & _
        "StrPtr(c) = 0 : " & b2 & vbCrLf & _
        "StrPtr(entree) = 0 : " & b3
    EDIT :
    @dysorthographie :
    Bonjour,
    Ton code répond à l'autre discussion, pas à ma question de ce jour.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub test()Dim entree
    Do While entree < 1 Or entree > 20
     entree = Application.InputBox("veuillez entrer un nombre entier entre 1 et 20", Type:=1)
     If TypeName(entree) = "Boolean" Then MsgBox "Vous allez sortir de programme", vbCritical: Exit Sub
     If entree < 1 Or entree > 20 Then MsgBox "Vous devez choisi un valeur entre 1 et 20", vbExclamation
    Loop
    End Sub

  5. #5
    Invité
    Invité(e)
    Par défaut
    regardes ce que j'ai proposé!

    Valeurs inputbox annulée ou validée / Valeur Null en V
    tu ne peux pas avoir de valeur null, soit tu annule soit tu entre un numérique!

  6. #6
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Salut Robert,

    Oui, j'ai bien vu.
    Par ailleurs je suis d'accord avec toi.
    Si l'utilisateur, en voyant :
    "veuillez entrer un nombre entier entre 1 et 20",
    saisi n'importe quoi, il faut l'expulser à grand coups de pied dans le derrière : "Vous allez sortir du programme", vbCritical: Exit Sub
    (ce que d'ailleurs il faudrait traduire directement par : "Trop c*n pour saisir une bonne valeur...", vbCritical: Exit Sub)

    Mais ma question porte essentiellement sur le retour d'une inputbox validée sans aucune saisie.
    Voir mes tests... Peut être ne sont-ils pas adéquats par ailleurs...

  7. #7
    Invité
    Invité(e)
    Par défaut
    tu veux pouvoir ne rien saisir dans ton InputBox?

    je t’avouai que je n'ai rien compris!

  8. #8
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    En fait, je ne travaille sur rien de précis, je ne veux rien.

    Juste savoir ce que renvoie exactement une InputBox validée sans saisie.
    A priori (d'après mes tests), elle ne revoie pas "" ni de String vide.
    D’où ma question sur la valeur Null en VBA...

  9. #9
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Ok.
    Mea culpa.
    Mes tests étaient foireux.
    Une inputbox renvoie bien un VbNullString...

    Désolé.

  10. #10
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bon
    Lorsque le temps me le permettra, je rédigerai tout un petit laïus que je déposerai en contributions pour exposer plus longuement ce qu'est la fonction strptr et ses utilisations ici et/ou là :
    Voici déjà, pour les moins patients, de quoi satisfaire un peu leur soif. Les plus vifs commenceront déjà à extrapoler suffisamment.
    Test --->>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim a As String, b As String
      a = vbNullString
      b = ""
      MsgBox ("la chaîne a est-elle """"égale"""" à la chaîne b ? ---> ") & (a = b) & vbCrLf & _
      "car a = " & """" & a & """" & " et que b = également " & """" & b & """"
      MsgBox ("strptr(a) est-il égal à strptr(b) ? ----> ") & (StrPtr(a) = StrPtr(b)) & vbCrLf & _
      "car strptr(a) retourne " & StrPtr(a) & " tandis que strptr(b) retourne " & StrPtr(b)
    Amitiés

  11. #11
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par unparia Voir le message
    Voici déjà, pour les moins patients, de quoi satisfaire un peu leur soif. Les plus vifs commenceront déjà à extrapoler suffisamment.
    C'est exactement ce que je testais précédemment.
    Donc... +1 !


    A suivre...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/05/2014, 20h02
  2. Réponses: 3
    Dernier message: 14/05/2007, 14h21
  3. SQL et GUID : Valeur de caractère non valide pour la ....
    Par jackfirst72 dans le forum Bases de données
    Réponses: 5
    Dernier message: 06/03/2007, 10h46
  4. Réponses: 2
    Dernier message: 08/02/2006, 12h29
  5. Problème de récupération valeur inputbox
    Par markintell dans le forum Access
    Réponses: 3
    Dernier message: 10/01/2006, 14h25

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