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

VBA Access Discussion :

Tester si une variable n'est pas un entier [AC-2003]


Sujet :

VBA Access

  1. #1
    Débutant
    Inscrit en
    Décembre 2007
    Messages
    1 235
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 1 235
    Points : 269
    Points
    269
    Par défaut Tester si une variable n'est pas un entier
    Bonjour, je voudrais savoir comment tester si une variable n'est pas un entier?

    Je sais tester :

    Si ce n'est pas numérique alors...

    Mais je ne sais pas comment tester:

    Si ce n'est pas un entier alors...

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2008
    Messages : 191
    Points : 200
    Points
    200
    Par défaut
    Bonjour,

    une solution possible réside ici. Il s'agit de tester afin de voir si la partie décimale du nombre est nulle ou non.

    Bonne journée!

  3. #3
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonjour,

    l'instruction VBA TypeName(..) renvoie la chaine de caractère du type de la variable passée en paramètre.

    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sub PorteNawak (j as variant)
     
     If TypeName(j)<>"Integer" Then
      .....
     End if
    End sub

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Août 2009
    Messages : 2
    Points : 3
    Points
    3
    Par défaut RE
    normalement cela suffit

    if not int (variable) then
    ...
    end if

  5. #5
    Débutant
    Inscrit en
    Décembre 2007
    Messages
    1 235
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 1 235
    Points : 269
    Points
    269
    Par défaut
    RE,

    Cette solution ne fonctionne pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If Not Int(Me.txtStockMinimum) Then
    MsgBox ("Le Stock Minimum doit être un nombre entier")
    Exit Sub
    Else
    End If

  6. #6
    Débutant
    Inscrit en
    Décembre 2007
    Messages
    1 235
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 1 235
    Points : 269
    Points
    269
    Par défaut
    Pour cette solution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sub PorteNawak (j as variant)
     
     If TypeName(j)<>"Integer" Then
      .....
     End if
    End sub
    Je fais comment sima sub est tu type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Private Sub cmdModiferRéférence_Click()
    End sub

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonsoir,

    En fait le plus simple c'est de traiter la saisie pendant qu'elle se déroule.
    Le code suivant permet de ne prendre en compte que les chiffres saisies au clavier dans la zone de texte txtStockMinimum. Il s'agît de l'événement ToucheActivée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub txtStockMinimum_KeyPress(KeyAscii as Integer)
     If (KeyAscii<48 Or KeyAscii>57) Then KeyAscii=0
    End sub

  8. #8
    Débutant
    Inscrit en
    Décembre 2007
    Messages
    1 235
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 1 235
    Points : 269
    Points
    269
    Par défaut
    RE,

    En fait ton code perùet juste de ne pas inserer de virgules, dans ma txtBox.
    Le soucis c'est que je ne peux plus me servir de la touche effacer (au dessus de la touche entrer).

    Il n'existe pas un test possible avec un IF au moment de la validation afin de retourner une msgBox ("Le stock doit être un nombre entier").

  9. #9
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonjour,

    oui il s'agît du backspace,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private sub txtStockMinimum_KeyPress(KeyAscii as Integer)
     If KeyAscii<>8 And (KeyAscii<48 Or KeyAscii>57) Then KeyAscii=0
    End sub
    Le code permet de ne pas tenir compte de tous les caractères autres que les 10 chiffres et le backspace.

  10. #10
    Débutant
    Inscrit en
    Décembre 2007
    Messages
    1 235
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 1 235
    Points : 269
    Points
    269
    Par défaut
    Très bien je te remercie.

    Si toutefois quelqu'un connais le code qui permet de tester avec un If si c'est un entier then MsgBox....

  11. #11
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonjour,

    essaie ceci sur l'événement Avant MAJ de la zone de texte

    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub txtStockMinimum_BeforeUpdate(Cancel As Integer)
     Dim i 
     i=Me.txtStockMinimum
     If (Not IsNumeric(i)) Or (IsNumeric(i) And Int(i)<CDbl(i)) Then
      Msgbox "Le stock minmum doit être un nombre entier"
      Cancel=True
     End if
    End sub

  12. #12
    Membre du Club
    Homme Profil pro
    Ingénieur Électromécanicien
    Inscrit en
    Mars 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur Électromécanicien
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2008
    Messages : 60
    Points : 59
    Points
    59
    Par défaut
    bonjour,
    regarde ceci
    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
     
    Option Compare Database
    Option Explicit
    Private Const Stockmaxi As Integer = 1000
     
    Public Function testerNum(vDonnéeAtester As Variant) As Boolean
     
    Dim i As Integer ' c'est l'indexe qui nous permeterait de parcourir la vDonnéeAtester
     
    testerNum = True 'initialiser la fonction à true
    i = 1
    Do While i <= Len(CStr(vDonnéeAtester)) And testerNum 'je cherche tant que je n'ai pas terminé tous les caractères et que je suis toujours sur true
    Debug.Print "i== " & i & "   " & Mid(CStr(vDonnéeAtester), i, 1)
    If (Not IsNumeric(Mid(CStr(vDonnéeAtester), i, 1))) Then testerNum = False ' si c'est false je sors de la boucle
    i = i + 1
    Loop
    'reste un autre truc, integer est compris est entre -32 768 et 32 767
    'tu ne voudrais certainement pas que ton stock maxi soit négatif ou supérieur à une certaine valeur
    ' c'est pour cela que j'ai défini en tête de module : Private Const Stockmaxi As Integer = 1000
    'Un nombre négatif est considéré comme texte donc pas de problème
    'c'est un autre if qu'il te faudrait ajouter, aller je te le donne pour la dernière fois.
     
     
    If (testerNum) Then If vDonnéeAtester > Stockmaxi Then testerNum = False
    ' je ne fais ce test que si la valeur est numérique
     
    End Function
    tu peux utiliser cette fonction comme ça par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    If (testerNum) then
    ' c'est bon je continue
    else
    'c'est pas bon je l'annonce et je sors
    end if
    A+

  13. #13
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    salut petitbison, ilank, galaktikx, al_bert et moilou2

    en considèrant que -1 ou 1,00 sont aussi des entiers:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function IsInt(txt As String) As Boolean
    IsInt = IsNumeric(txt) And (Val(Replace(txt, ",", ".")) = CInt(Val(txt)))
    End Function

  14. #14
    Membre du Club
    Homme Profil pro
    Ingénieur Électromécanicien
    Inscrit en
    Mars 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur Électromécanicien
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2008
    Messages : 60
    Points : 59
    Points
    59
    Par défaut
    bonjour,
    oui, mais je crois que moilou2 voudrait un truc sans virgule pour son stock.
    merci pour votre remarque.
    A+

  15. #15
    Membre chevronné
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Points : 2 178
    Points
    2 178
    Par défaut
    Je propose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     IF cint(Me!Saisie) <> cdbl(Me!Saisie) Then Msgbox(Me!saisie & "  n'est pas un entier")
    cela fonctionne avec 132,00 aussi

  16. #16
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    petitbison > comme cela il aura le choix.

    salut helas,
    comme ilank il y aura erreur avec "132.00"

  17. #17
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonsoir,

    Quelle erreur vodiem ? "132.00" n'est pas une valeur numérique en français.
    Maintenant, personnellement je préfère utiliser l'événement KeyPress pour gérer la saisie surtout pour une valeur entière, la gestion des valeurs décimales est un poil plus compliqué.

  18. #18
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    bonsoit ilank,

    Citation Envoyé par ilank
    Quelle erreur vodiem ? "132.00" n'est pas une valeur numérique en français.
    tu as raison.
    je voulais dire que cint() ou int() génère une erreur dessus comme "a12" ou autre erreur de saisie (incompatibilité de type).

    Citation Envoyé par ilank
    Maintenant, personnellement je préfère utiliser l'événement KeyPress pour gérer la saisie surtout pour une valeur entière, la gestion des valeurs décimales est un poil plus compliqué.
    je comprends mais personnellement je n'aime pas intellectuellement l'idée que mon pc m'oblige à faire ce qu'il veut. ;p
    je lui donne à manger je vais pas lui mâcher le travaille.

    cela dit ma préférence intellectuellement serait d'utiliser un regexp bien que ce soit plus long.
    j'en ai donc profité pour potasser le sujet pour trouver un pattern:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Function isIntRegExp(txt As String)
    Dim reg As VBScript_RegExp_55.RegExp
    Set reg = New VBScript_RegExp_55.RegExp
    reg.Pattern = "^[ ]*-?(\d)*,?[0]*[ ]*$"
    isIntRegExp = reg.test(txt)
    End Function
    avec référencement préalable de "Microsoft VBScript Regular Expressions 5.5"


  19. #19
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonsoir,

    Bonne foi quand tu nous tiens !!
    Citation Envoyé par Vodiem
    je comprends mais personnellement je n'aime pas intellectuellement l'idée que mon pc m'oblige à faire ce qu'il veut.
    Hé beh, c'est bien l'idée en utilisant l'événement ToucheActivée; c'est l'utilisateur qui dicte la conduite du PC et non l'inverse; pas de message du genre : "Vous devez marcher dans les clous, recommencez." Avec le KeyPress, le PC attend les actions provoquées par l'utilisateur et agit en fonction.

  20. #20
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    KeyPress je ne l'utilise pas pour du contrôle sur le contenu saisie.
    le pc réagit à chaque action ca fait vraiment flicage...
    comme "le chemin le plus court n'est pas la ligne droite" j'aime marcher en dehors de clous, revenir sur mes pas, marcher en arrière, sauter à cloche pied... avant de reprendre le droit chemin. :p

    cela dit un mask de saisie ca pourrait aussi le faire.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Débutant] Tester si une valeur n'est PAS un NaN
    Par Anna76 dans le forum MATLAB
    Réponses: 1
    Dernier message: 03/09/2014, 11h20
  2. Réponses: 10
    Dernier message: 15/01/2008, 12h03
  3. Tester si une variable est vide
    Par christel1982 dans le forum ASP
    Réponses: 13
    Dernier message: 13/09/2006, 11h01
  4. comment tester si une variable est de type indifined
    Par amelhog dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 10/08/2005, 09h32
  5. Tester qu'une variable varchar est un nombre
    Par Oluha dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/06/2005, 13h29

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