Ensemble des entiers

RS8 Messages postés 100 Date d'inscription vendredi 18 mai 2007 Statut Membre Dernière intervention 15 juillet 2009 - 5 juin 2007 à 08:45
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 6 juin 2007 à 09:49
Bonjour,

j'ai un tableau Excel et avec vb6 je voudrais tester si le contenu d'une cellule est un entier. J'ai essayé avec IsNumeric mais il lui arrive de convertir les String en Integer.
N'est-il pas possible de tester si le contenu de la cellule appartient à un intervalle d'entiers ?
Par exemple :
Dim intervelle As Range
intervalle = [0..50]
If contenuCellule "appartient" intervalle Then
...
Else
End If

Merci.

18 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
5 juin 2007 à 08:52
"avec IsNumeric mais il lui arrive de convertir les String en Integer"
c'est justement l'interet de la chose ^^

If IsNumeric ( MaValue ) Then
    If MaValue >=0 And MaValue <=50 Then
          ...
    End If
End If

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
RS8 Messages postés 100 Date d'inscription vendredi 18 mai 2007 Statut Membre Dernière intervention 15 juillet 2009
5 juin 2007 à 08:59
Ok mais je ne veux pas justement !

Je t'explique un peu mieux : je teste si le contenu de la cellule A1 est un entier et si c'est le cas je stocke les valeurs de la ligne 1.
Si elle est vide ou contient une chaîne de caractère je passe à la ligne suivante et ainsi de suite jusqu'à parcourir complétement mon tableau Excel.
Je ne souhaite donc garder que les cellules contenant des entiers et IsNumeric convertit les String en Int et donc ça fausse mes données!

Merci.
0
drikce06 Messages postés 2237 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 11
5 juin 2007 à 09:07
Salut, il faut que ce soit vraiment un entier compris entre 0 et 50 et non un réel?

 Drikce 06 (Nouveau !!! Forum Exclusivement Office Et VBA By Mortalino)

Si la réponse vous convient: Réponse acceptée < body>
0
RS8 Messages postés 100 Date d'inscription vendredi 18 mai 2007 Statut Membre Dernière intervention 15 juillet 2009
5 juin 2007 à 09:13
Non c'était un exemple! En fait ma colonne et numérotée de 1 à 30 000 mais je dois convertir les données d'un appareil de mesure et lorsqu'il y a une erreur ce n'est plus un entier mais une string et la je ne veux pas qu'il me mette cette ligne dans mon tableau car elle est inutile et comme je dois tracer un graphe par la suite il ne me faut que des réels dans mon tableau !

Mais oui il faut que ce soit un entier naturel (>= 0)

Merci
0

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

Posez votre question
drikce06 Messages postés 2237 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 11
5 juin 2007 à 09:16
Il ne faut pas confondre entier et réel d'où ma question:

Entier: 1,2,3 ... 10 etc
Réel: 1.23545 , 45/78, etc

 Drikce 06 (Nouveau !!! Forum Exclusivement Office Et VBA By Mortalino)

Si la réponse vous convient: Réponse acceptée < body>
0
drikce06 Messages postés 2237 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 11
5 juin 2007 à 09:17
En cas des erreurs ce sera un nombre sous forme de string?

 Drikce 06 (Nouveau !!! Forum Exclusivement Office Et VBA By Mortalino)

Si la réponse vous convient: Réponse acceptée < body>
0
RS8 Messages postés 100 Date d'inscription vendredi 18 mai 2007 Statut Membre Dernière intervention 15 juillet 2009
5 juin 2007 à 09:22
Non pas un nombre, il me met le nom de l'erreur avec un charabia incompréhensible!
Je voudrais juste que mon programme, tant que les lignes de la colonne A sont des entiers (ex : 1, 2, 3, ...) récupère la ligne correspondante et la stocke dans un tableau d'entier et dès qu'il s'aperçoit que c'est une string passe à la ligne suivante et ce autant de fois que le fichier excel contient d'erreurs. Car si j'utilise IsNumeric, il va convertir la string mais ca ne va pas correspondre et mon graphique va etre faussé!

Merci.
0
drikce06 Messages postés 2237 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 11
5 juin 2007 à 09:27
Mais si tu fais, isnumeric alors que tu as une chaine du style "258toto25588" ça converti pas en Integer il vois bien que c'est une chaîne et pas un nombre, là je vois pas ton problème. 

If IsNumeric(Range("N1").Value) Then

Donne le bout de code que tu as fait qu'on voye ce qui va pas.

 Drikce 06 (Nouveau !!! Forum Exclusivement Office Et VBA By Mortalino)

Si la réponse vous convient: Réponse acceptée < body>
0
RS8 Messages postés 100 Date d'inscription vendredi 18 mai 2007 Statut Membre Dernière intervention 15 juillet 2009
5 juin 2007 à 09:32
C'est exactement ce que tu as mis :

Dim i As Long
Dim tableau(30 000) As Long
For i = 1 To 30 000
   If IsNumeric(Range("A" & i).Value) Then
      tableau(i-1) = Range("A" & i).Value
   Else
   End If
Next

Merci.
0
drikce06 Messages postés 2237 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 11
5 juin 2007 à 09:40
Le problème c'est que tu ne gères pas le cas où ce n'est pas numéric.

Dim i As Long
Dim tableau(30 000) As Long
For i = 1 To 30 000
   If IsNumeric(Range("A" & i).Value) Then
      tableau(i-1) = Range("A" & i).Value
   Else
     tableau(i-1) = 0 ou autre chose
   End If
Next

 Drikce 06 (Nouveau !!! Forum Exclusivement Office Et VBA By Mortalino)

Si la réponse vous convient: Réponse acceptée < body>
0
RS8 Messages postés 100 Date d'inscription vendredi 18 mai 2007 Statut Membre Dernière intervention 15 juillet 2009
5 juin 2007 à 09:49
IsNumeric renvoie un booléen si c'est un nombre ou si la string est convertible en nombre c'est bien ça ?

Mais avec un IN ou quelque chose dans le même genre je ne peut pas tester si le contenu de la cellule appartient à cet intervalle ?
Car si je mets :

If 0 <= (Range("A1").Value) <= 30 000

et que ma cellule contient un string que va t-il se passer ? Il va la convertir ou me renvoter une erreur ?

Je pensais plutôt à :

Dim intervalle As Range
intervalle = [0..30000]
If (Range("A1").Value) IN intervalle Then
...
Else
...
End If

Est-ce possible ?

Merci.
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 23 août 2018 21
5 juin 2007 à 10:40
J'ai fait le test avec différentes valeurs numériques, avec virgule ou point, avec apostrophe comme premier caractère, avec espace, avec des lettres,... et ça devrait bien fonctionner de cette manière.

        If IsNumeric(Range("A" & I)) _
                And Range("A" & I) >= 0 _
                And Range("A" & I) <= 30000 Then
               
            MsgBox "Ligne " & I & " OK" & vbCrLf & _
                    Range("A" & I) * 2  ' pour vérifier si la valeur se calcule
        End If

MPi
0
RS8 Messages postés 100 Date d'inscription vendredi 18 mai 2007 Statut Membre Dernière intervention 15 juillet 2009
5 juin 2007 à 11:10
Ok je vais essayer merci.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
5 juin 2007 à 11:36
c'est le code que je t'ai filé ce matin....
m'enfin....

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
RS8 Messages postés 100 Date d'inscription vendredi 18 mai 2007 Statut Membre Dernière intervention 15 juillet 2009
5 juin 2007 à 12:01
Oui et ça doit être pour cela qu'il ne marche pas

Mais c'est bon j'ai trouvé! Plutôt que de tester si c'est un entier je fais plusieurs tests car j'ai remarqué que les erreurs commencent par des string qui sont tout le temps les mêmes (il y en a 20 différentes!!!) ! Certes ce n'est pas très esthétique un If avec 19 ElseIf mais c'est le seul code que j'ai trouvé et qui marche ! Et donc si le test ne rentre dans aucun des elseIf c'est que ma cellule contient un entier !

Sinon j'ai lu sur un autre forum que la commande IsNumeric ralentissait le programme ! Est-ce vrai?

En tout cas merci à vous trois pour votre aide
0
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 28
5 juin 2007 à 12:40
Une méthode rigolote :

Une chaîne de caractères représente sans aucun doute un entier lorsque la retransformation en chaîne de l'entier de la division par 1 de la chaîne concernée est la chaine de départ.

Ainsi :

Private Sub Command1_Click()
  toto = "11.1"
  MsgBox IIf(CStr(Val(toto) \ 1) = toto, toto & " est un entier", toto & " n'est pas un entier")
  toto = "11"
  MsgBox IIf(CStr(Val(toto) \ 1) = toto, toto & " est un entier", toto & " n'est pas un entier")
  toto = "n'importe quoi"
  MsgBox IIf(CStr(Val(toto) \ 1) = toto, toto & " est un entier", toto & " n'est pas un entier")
  toto = "-10"
  MsgBox IIf(CStr(Val(toto) \ 1) = toto, toto & " est un entier", toto & " n'est pas un entier")
End Sub
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
6 juin 2007 à 09:44
dit, j'ai toujours pas compris ton : "IsNumeric convertit les String en Int et donc ça fausse mes données"

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
6 juin 2007 à 09:49
Je crois que j'ai saisi, une cellule qui contient "16" (un texte) ne doit pas être confondu avec une cellule qui contiendrait 16 (numérique)...

voilà du tout cuit...

Public Function IsCellValueInRange(ByRef voCell As Range, ByVal vnMin As Integer, ByVal vnMax As Integer) As Boolean
  '# Si notre cellule contient un numérique
  If IsNumeric(voCell.Text) Then
      '# Et qu'il ne comporte pas de partie décimale...
      If voCell.Value = voCell.Value \ 1 Then
          '# Alors, on testes, tentant de savoir si le contenu de notre
          '# cellule est situé entre les bornes reçues en paramètre.
          IsCellValueInRange = voCell.Value >= vnMin And voCell.Value <= vnMax
      End If
  End If
End Function , ----
By Renfield

s'utilise ainsi :

If IsInValueRange(ActiveCell, 0, 50) Then
  ...
End If , ----
By Renfield

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0