Problème avec un entier pas reconnu comme entier [Résolu]

Signaler
Messages postés
25
Date d'inscription
jeudi 24 mars 2011
Statut
Membre
Dernière intervention
6 avril 2011
-
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
-
bonjour,

j'ai une macro qui parcoure les cellules d'une colonne et teste si la valeur y est un entier ou non.
le test marche très bien quand je teste des chaines de caractères, mais pas pour l'entier.
j'ai entré des nombres dans les cellules (1, 5, 9 etc), mais le test échoue et la cellule devient rouge (je fais colorer la cellule en rouge si ca échoue)

vous savez pourquoi ?

Merci !

14 réponses

Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
8
Bonjour,

Sauf erreur, le contenu des cellules Excel est toujours un double.


Alors, erreur ! Les types sont Double pour un nombre, String pour du texte, Empty si vide...
La fonction qui permet de connaitre le type de données réels utilisée est "TypeName"

Ensuite, pour tester si le nombre dans une cellule est entier ou pas, voici un programme exemple raccourci :

Sub es()

For a = 1 To 10
    If TypeName(Range("a" & a).Value) = "Double" Then
        If Int((Range("a" & a).Value)) = Range("a" & a).Value Then
            MsgBox "Cellule A" & a & " est entier"
        Else
            MsgBox "Cellule A" & a & " n'est pas entier"
        End If
    End If
Next a

End Sub


Bien mettre quel que chose dans la plage A1 à A10.

Amicalement,
Us.
Messages postés
25
Date d'inscription
jeudi 24 mars 2011
Statut
Membre
Dernière intervention
6 avril 2011

je progresse. en fait Excel reconnait la cellule comme "double"
alors que j'ai bien écrit "1" ou "5" bref, un entier dans la cellule que je scanne avec la macro.

le format de la cellule est "général"
c'est le format par défaut.

avez vous une idée pourquoi excel voit la cellule comme double alors que c'est bien un entier que j'ai entré ?
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
36
peut-être parce que ton chiffre est suivi (ou précédé) d'un point ou d'une virgule!

[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Messages postés
25
Date d'inscription
jeudi 24 mars 2011
Statut
Membre
Dernière intervention
6 avril 2011

non, je tape juste : "1" par exemple dans la cellule
Messages postés
25
Date d'inscription
jeudi 24 mars 2011
Statut
Membre
Dernière intervention
6 avril 2011

et si je change le format de la cellule a la main (bouton droit, format>number, et que je dis "sans décimale"), excel devrait bien comprendre qu'on a à faire a des nombres entiers dans les cellules ici. mais le test vba montre que excel voit un double.

pour info je fais le test avec un : VbInteger.

ou alors je devrais faire le test avec autre chose comme fonction excel ds VBA
vous auriez des suggestions ?
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
68
Salut

Sauf erreur, le contenu des cellules Excel est toujours un double.
Le formatage n'influence que l'affichage et pas la donnée qui restera donc un double, même après n'importe quel triturage (Voir différences significatives entre .Value, .Value2 et .Text d'une cellule)

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
25
Date d'inscription
jeudi 24 mars 2011
Statut
Membre
Dernière intervention
6 avril 2011

ah ok j'ai compris l'astuce. merci us30 !
un peu lourd pour le coup comme procédure, en terme de temps de traitement :-\

je faisais ca : If Not VarType(Cells(j, 1)) = vbInteger Then

du coup, ca veut dire que VbInteger, ca sert a rien non ?
pour mon info, tu as un exemple ou utiliser le VbInteger ?
(il me plaisait pas mal)
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
8
Lourd, peut-être, mais dépends aussi de la façon dont tu utilises le code. Pour accélérer l'exécution il existe de nombreuses "astuces" ou façon de faire. Je suis resté sur la lancer sur le type de donnée utilisé par Excel suite au propos de jack national... Tu peux aussi utiliser "Isnumeric" au lieu de "Typename", par exemple. Ou encore désactivé l'affichage si tu ne sais pas bien coder et garde la sélection des cellules, etc.

En ce qui concerne ta demande d'exemple avec vbInteger, je mesure ton niveau... Il y a tellement à dire pour que tu comprennes alors, qu'il faudrait que j'écrive un roman... J'vas essayer de faire rapide, mais sûrement incomplet...

VbInteger, veut dire quoi pour toi ? Le sais-tu ?
- Je pense que tu penses (bonjour le style!) que tu crois que (je m'améliore!) tu penses que c'est (enfin!) un truc qui veut dire "Entier" (ouf!). Et bien, donc tu as une idée, certes, mais bien trop vague. Aller j'arrête d'écrire des longueurs ^^
- Déjà, l'écriture ! Si tu commences par écrire "vb" quelque chose, par exemple (vbInteger, vbLong, vbSingle, vbCurrency, etc...), tu écris en réalité une constante ! un chiffre quoi.
Tu peux tester avec : Msgbox vbinteger qui te renvoi quoi ? Et bien : 2
- 2ième point : A quoi ca sert d'écrire vbInteger plutôt que "2". A rien pour l'exécution ! Mais pour le programmateur (toi) cela te permet de te rappeler ce que cela signifie ce "2" dans le contexte du programme.
- 3ième point : Que veut dire Integer ? Un nombre entier ? Pas tout à fait... C'est bien pour désigner un entier, mais dans une plage précise. Ici allant de -32 768 à 32 767. Mais, il existe aussi (par exemple) les "Long" pour une plage plus grande de -2 147 483 648 à 2 147 483 647. Etc. La raison pour laquelle il existe plusieurs plages, vient du codage interne des variables, par exemple pour les integer il sont codés sur 2 octets, les Long sur 4 octets... Et plus, ils sont codés sur de nombreux octets, plus cela demande de manipulation pour le processeur, et plus c'est long en temps de calcul... Ouais, je simplifie la réalité, et les pros (jack et casy) vont sauter au plafond... La performances n'est pas tout à fait proportionnelle, mais si j'explique ça, je vais me tirer une balle avant de poster avant la fin de ce message... Continuons...

Maintenant, ton code : If Not VarType(Cells(j, 1)) = vbInteger Then.....
- La cata ! VarType renvoi le type de variable utilisé. J'espère que tu compris qu'avec seulement vbInteger, tu ne saura pas dire si ton nombre est entier s'il dépasse 32767, par exemple. Il faudra alors que tu rajoutes un complément pour tester un Long... Et puis, pour continuer dans ton sens, si le nombre dépasse 2 147 483 647 ? Tu fais quoi ? Tu continues jusqu'à épuiser tous les types de variables ? Non, bien sur !
- Il faut bien faire la différence enter tester un type de variable et tester le contenu d'une variable !
- Tu utilises donc à mauvais escient VarType...

Et plus fondamentale... Pourquoi tu as utilisé VarType ?
- Tu as cru que VarType pouvait te renseigner sur la nature d'une cellule Excel. Hélas, ce n'est pas le cas. Pourquoi ?
- Est-ce qu'il y a une différence fondamentale entre Excel et VBA ? C'est peut-être la confusion la plus courante qu'on retrouve chez les débutants.
- Ce qu'il faut savoir, c'est que VBA est en réalité du 'VB A'ppliqué à une application. Excel (le tableau quoi) est une Application auquel les gens de microsoft on rajouté une couche supplémentaire avec un langage de programmation Visual Basic6. Et le VB6 utilise c'est propre variable et fonction, tout en pouvant accéder aux objets d'Excel. Parmi c'est propre fonction tu retrouves tout ce qui concerne les boucles (DO, FOR) les test (IF, IIF, etc), mais aussi la parfaite panoplie des fonctions exotériques (tout le monde ne le dira pas comme ça^^) comme VarType qui en fait partie.
- Les objets d'Excel sont par exemple, les cellules (Range, Cells, etc), les feuilles (Sheets, etc) la barre de formule, les menus d'Excels, etc..

Donc il y a bien une différence entre VBA et Excel, mais comme on peut manipuler les objets d'Excel dans la programmation aussi facilement que tout autre fonction de VB, on peut avoir du mal à avoir les idées claires... pourtant c'est important pour bien programmer.

Pour finir, avec VarType, si tu veux un exemple, tu dois programmer qu'en VB (au sein du VBA, j'espère que tu as compris). Par exemple :
Sub es()

Dim A As Variant
Dim B As Double
Dim C As Integer

MsgBox VarType(A) ' renvoit 0 (vbVariant)
MsgBox VarType(B) ' renvoit 5 (vbDouble)
MsgBox VarType(C) ' renvoit 2 (vbInteger)

End Sub 


Voilà, c'est un premier discours. (Déjà épuisant à écrire^^, et surement à lire)

Amicalement,
Us.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
68
Double : Oui, pour les chiffres et dates bien sûr, c'était sous-entendu.

J'insiste malgré tout sur les différences entre .Value, .Value2 et .Text (à étudier)

Bel exposé, US_30, bravo.
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
8
c'était sous-entendu.

Bon, alors, j'espère avoir apporté ma pierre...

Quant aux différences entre .Value, .Value2 et .Text... Bon, je ne crois pas que cela soit si fondamentale.
Ces 3 propriétés agissent uniquement sur le type de données renvoyées.

En clair si dans A1 on a 123, alors si on a besoin de la valeur numérique on utilisera .Value, si c'est la forme textuelle du nombre (string) on utilisera .Text . Les termes "Value" et "Text" parlent d'eux-mêmes.

Exemple :

MsgBox TypeName(Range("a1").Text) ' string
MsgBox TypeName(Range("a1").Value) ' double ou empty

- Une alternative entre ces types est l'emploi des fonctions de conversion CSTR,CDBL que tu connais .

Ensuite "Value2"... est l'équivalent de Value sauf dans le cas d'un formatage monétaire ou de date... Ici la lecture de l'aide est bcp plus clair qu'un grand discours.

Donc, bon, rien de révolutionnaire...

Amicalement,
Us.
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
8
Euh... oui, en conclusion, je ne vois pas bien l'intérêt pour la reconnaissance d'un nombre entier...

Amicalement,
Us.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
68
Non, pour un nombre, tu as raison. Plus utile pour les dates.
Messages postés
25
Date d'inscription
jeudi 24 mars 2011
Statut
Membre
Dernière intervention
6 avril 2011

ouh lala, on ne plaisante pas avec un programmeur !
oui, merci pour ton exposé.
c'était pas nécessaire, mais bon; j'ai eu des cours de tout ca à l'école à l'époque. je ne me considère pas débutant (ni pro non plus, qq part entre les 2). quand j'étais débutant, je me demandais que voulait dire sub, range etc...

écrit ca :
If Not VarType(Cells(j, 1)) =

et ensuite fais un ctrl/espace

comment tu expliques alors que excel te proposes vbinteger ?
tu comprends pourquoi j'avais mis ca ?
je suis pas un mega expert du VB c'est vrai, mais qq part, MS déconne avec son VBA aussi (a méditer lol)
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
8
Bonjour,

comment tu expliques alors que excel te proposes vbinteger ?
tu comprends pourquoi j'avais mis ca ?
je suis pas un mega expert du VB c'est vrai, mais qq part, MS déconne avec son VBA aussi (a méditer lol)


Je pensais avoir un peu répondu. Cela fait surement beaucoup d'information et peut-être pas assez d'explication de ma part... mais il y a tellement à dire que ce n'est pas si évident...

Je reprends point par point, en faisant court cette fois :
comment tu expliques alors que excel te proposes vbinteger ?
- On dit Excel, mais c'est VBE en réalité qui te proposes vbInteger. (VBE Visual Basic Editor> c'est l'interface là où tu programmes)
- VBE te proposes une aide à la saisie, donc pour chaque fonction (ou presque) il ouvre un bandeau pour compléter ta ligne.
- Si tu tapes : If Vartype(a) = Juste après le égal, un bandeau s'ouvre te proposant ce qui lui semble logique pour compléter ta ligne. Et, comme tu l'as remarqué il n'y a pas que vbInteger, mais une liste entière (vbArray, vbBoolean, etc, classé en ordre alphabétique). Donc si tu as aussi bien lu mes remarques précédentes, tu sais maintenant que ces constantes remplace qu'un chiffre en réalité. Ces chiffres étant toutes les valeurs que VarType renvoit en fonction de la nature de la variable testée. Comme quand une variable est de type Integer, il est normal que VarType renvoit un chiffre particulier pour le repérer, ici 2. Ou vbInteger ce qui est la même chose.
- Voilà comment j'explique la présence de vbInteger. vbInteger ne veut pas dire 'ENTIER'. Relis ma précédente explication.

tu comprends pourquoi j'avais mis ca ?

- Oui, je comprend ton erreur. J'ai tenté de l'expliquer précédemment, mais il faut peut-être relire plusieurs fois...

je suis pas un mega expert du VB c'est vrai, mais qq part, MS déconne avec son VBA aussi

- Et donc VBA ne déconne pas...

Amicalement,
Us.