Comparaison avec Null

cs_nitho Messages postés 130 Date d'inscription jeudi 16 avril 2009 Statut Membre Dernière intervention 8 décembre 2015 - 20 juil. 2011 à 08:35
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 22 juil. 2011 à 07:47
Salut les gars,

Voilà, j'ai un problème je compare une série de donnée v(i) de type chaine à une autre série w(i) de variable et je recherche les cas où les deux éléments sont différents. Le problème c'est que je me rends compte que quand ma l'une des variables est null, le résultat que j'obtiens n'est pas le résultat attendu.

cad si v(i) NUll et w(i) 1

et que je fais if (v(i) <> w(i)) then ...
la condition ne sera pas validée pourtant Null est bien différent de 1.


Quelqu'un aurait une solution


nitho l'amateur
A voir également:

9 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 juil. 2011 à 08:54
Bonjour,

ouvre ton aide vba sur la fonction IsNull


____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
cs_nitho Messages postés 130 Date d'inscription jeudi 16 avril 2009 Statut Membre Dernière intervention 8 décembre 2015
20 juil. 2011 à 09:02
Je connais cette fonction mais cela voudrais dire que je dois faire une grosse condition du genre

if (isnull(v(i)) and isnull(w(i))) or (not isnull(v(i)) and not isnull(w(i)) and v(i) = w(i)) then ...
else ...
end if

à chaque fois que je fais une comparaison et n'utiliser que le else, car ce sont les cas où les deux sont différents qui m'interessent.

Je me demandais donc s'il n'y avait pas un truc pour aller plus vite...



nitho l'amateur
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
20 juil. 2011 à 10:08
salut,

le ANDALSO et ORELSE n'existent pas en VBA, tu ne pourras donc pas tester à la fois le ISNULL et la comparaison "variable = null"

tu dois faire 2 lignes...

çà devrait ressembler à :
if isnull(v(i)) and isnull(w(i)) then
  debug.print "v(i) w(i) NULL"
elseif not isnull(v(i)) and not isnull(w(i)) then
  if v(i) = w(i) then ...
    debug.print "v(i) w(i) PAS NULL"
  else ...
  end if
else ....
end if 



selon ton usage, rien ne t'empêche de faire une fonction qui acceptera 0 ou 2 paramètres NULL

++

[hr]
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 juil. 2011 à 10:55
Un Null, pour moi est un NULL et on ne peut dire que deux NULL soient égaux, par définition.

Donc dans :
Dim toto
Dim titi

toto = Null
titi = Null
MsgBox IIf(Not IsNull(toto <> titi), toto <> titi, toto <> titi Or IsNull(toto) Or IsNull(titi))

toto = Null
titi = "a"

MsgBox IIf(Not IsNull(toto <> titi), toto <> titi, toto <> titi Or IsNull(toto) Or IsNull(titi))

toto = "a"
titi = Null

MsgBox IIf(Not IsNull(toto <> titi), toto <> titi, toto <> titi Or IsNull(toto) Or IsNull(titi))

toto = "x"
titi = "a"
MsgBox IIf(Not IsNull(toto <> titi), toto <> titi, toto <> titi Or IsNull(toto) Or IsNull(titi))


toto = "a"
titi = "a"
MsgBox IIf(Not IsNull(toto <> titi), toto <> titi, toto <> titi Or IsNull(toto) Or IsNull(titi))


Seule la dernière msgbox affichera "False" pour constater qu'il n'y a pas de différence.

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0

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

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 juil. 2011 à 11:28
Et partant de ce même principe (selon lequel 2 Null ne sont pas "égaux"), on pourrait même user d'un peu de fantaisie (bien que je n'aime pas les gestions abusives d'erreurs)

Private Sub Command1_Click()
  Dim toto, titi

  toto = Null
  titi = Null
  MsgBox si_diff(toto, titi)

  toto = "a"
  titi = Null
  MsgBox si_diff(toto, titi)

  toto = "x"
  titi = "a"
  MsgBox si_diff(toto, titi)

  toto = "a"
  titi = "a"
  MsgBox si_diff(toto, titi)
End Sub

Private Function si_diff(toto, titi) As Boolean
  On Error Resume Next
  si_diff = titi <> toto
  If Err Then si_diff = True
  On Error GoTo 0
End Function

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 juil. 2011 à 11:34
Voici d'ailleurs ce qu'en dit Micromachin, ICI.
On y lit bien :
Une valeur NULL indique que la valeur est inconnue. Une valeur NULL est différente d'une valeur vide ou de zéro. Deux valeurs NULL ne sont pas égales. Les comparaisons de deux valeurs NULL, ou d'une valeur NULL et d'une autre valeur, renvoient le message « inconnu » car la valeur de chaque NULL est inconnue.



____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
22 juil. 2011 à 07:29
ucfoutu -> pour le premier "exemple", tu testes justement le "null = null"?....
(dans mon exemple c'est juste le debug.print qui affiche ce égal, on fait bien 2 tests distincts)
dans ton 2e exemple, comme tu dis, il faut éviter ces on error quand on peut gérer... donc pourquoi ne pas avoir géré? ^^


nitho ->
en reprenant les exemples d'ucfoutu et pour recadrer avec ta question, tu peux en effet juste en faire une fonction
du genre :

private function IsEqual(byval aString1 as string, byval aString2 as string) as boolean
if isnull(astring1) then 
  IsEqual = isnull(astring2)
elseif isnull(astring2) then
  IsEqual = false 'sinon on serait passé au dessus
else
  IsEqual (astring1 astring2)
endif
end function



IsEqual(v(i), w(i)) te retournera donc true si elles sont toutes les 2 null, ou si elles ont des valeurs string identiques


++
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 juil. 2011 à 07:42
Bonjour, PCPT,
Non. Je ne teste pas ===>> je traite simplement le cas de deux NULL et obtiens bien un True en retour (qui signifie qu'ils sont différents).
Pour mémoire :
Seule la dernière msgbox affichera "False" pour constater qu'il n'y a pas de différence.



____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 juil. 2011 à 07:47
En d'autres termes :
- constater que deux données sont identiques est une chose (est 2 NULL ne sauraient être identiques)
- constater la similarité de deux "états" en est une autre.


____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
Rejoignez-nous