Verifier si une variable appartient à un ensemble de valeurs

[Résolu/Fermé]
Signaler
-
 Panda -
Bonjour,

je veux juste vérifier par une condition si ma variable appartient à un ensemble de valeurs.
bien sur je peux faire:

If Var= 1 or Var=5 or Var=12 or..... then

mais c'est un peu fastidieux quand il y a plein de tests.

il faudrait quelque chose du style

if Var= (or(1,5,12...)) then

ou

if Var={1;5;12...} then

je suis sur qu'il existe un truc comme ça et que la réponse va être évidente, mais je ne trouve pas.
je précise que c'est du VBA pour Access.

10 réponses

Messages postés
3598
Date d'inscription
mercredi 20 septembre 2006
Statut
Membre
Dernière intervention
24 septembre 2021
852
Salut,
As-tu essayé un truc genre
Select Case Var
  Case 1, 5, 12, ...
   Instructions
  Case else
End select
?
pas facile de faire plus simplouillet.
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 41713 internautes nous ont dit merci ce mois-ci

Messages postés
8539
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
20 juillet 2021
1 697
Bien vu, exactement :
Sub tst()
Dim var As Integer
  var = 12
  Select Case var
    Case 8, 9, 10, 11, 12, 13, 14, 15
      MsgBox var & " existe"
    Case Else
      MsgBox var & " inconnu"
  End Select
End Sub
tout bêtement!
c'est simple, suffisait d'y penser!
bon du coup ca donnerait:

Function testchoix(Tabl As String, quoi As Integer) As Boolean

montab = Array(Tabl)
trouve = False
For i = LBound(montab) To UBound(montab)
If quoi = montab(i) Then trouve = True
Next

End Function

et pour tester:

ouinon = testchoix("(1,3,5,7,9,11,13,15)", Var)
If ouinon = True Then
.....

mais ça n'a pas l'air de fonctionner, ma condition if est toujours fausse
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 41713 internautes nous ont dit merci ce mois-ci

je cherchais en utilisant la fonction array, mais sans succès:

firstarray = Array(8, 9, 10, 11, 12, 13, 14, 15)
myarray = Filter(firstarray, Var)
If UBound(myarray) > 0 Then

ça bloque à "myarray = Filter(firstarray, nomod)". j'ai essayé "myarray = Filter(firstarray, Var, true)" mais dans tous les cas il me dit que je n'ai pas le bon nombre d'arguments.

une idée?
j'ai une autre piste avec ce code trouvé sur un site:

Sub essai()
montableau = Array("A", "B", "C", "D")
x = "C"
p = Application.Match(x, montableau, 0)
If IsError(p) Then
MsgBox x & " Inconnu"
Else
MsgBox p
End If
End Sub

mais mon VBA (pour access) ne semble pas connaitre la méthode Match
merci pour ta réponse.
comme ça, ça doit fonctionner effectivement.
ce qui est dommage c'est que je voulais une instruction la plus courte possible pour faire un simple

if Var appartient à {x,y,z} then

et rendre le code le plus lisible possible.
mais ça fera très bien faute de mieux.
je reste étonné qu'il n'y ai pas plus concis
pas mal l'idée du dictionnaire, je connaissais pas. c'est un peu l'idée que j'avais, tester l'existence de ma variable dans un ensemble, là c'est dans un dictionnaire.
Messages postés
8539
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
20 juillet 2021
1 697
Re,
«ce qui est dommage c'est que je voulais une instruction la plus courte possible pour faire un simple
if Var appartient à {x,y,z} then
et rendre le code le plus lisible possible»


Voici :
Sub test()
Dim var As Integer
  var = 12
  If Appartient(var, "8, 9, 10, 12, 14, 15") Then
    MsgBox var & " existe"
  Else
    MsgBox var & " inconnu"
  End If
End Sub

Private Function Appartient(var As Variant, liste As String) As Boolean
  Select Case CStr(var)
    Case liste
      Appartient = True
    Case Else
      Appartient = False
  End Select
End Function
Bonjour,

Il faut passer tout le tableau en revue dans une boucle pour savoir si un élément existe.

Sub essai() 
montableau = Array("A", "B", "C", "D") 
x = "C"
trouve=False
For i = LBound(montableau) To UBound(montableau)
   if x=montableau(i) then trouve=True
next
if trouve then
   MsgBox x  & " Connu"
else
   MsgBox x  & " Inconnu"
endif
End Sub 


Le plus pratique serait de faire une fonction personnalisée.

A+.
Messages postés
8539
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
20 juillet 2021
1 697
Bonjour,

Pour éviter la boucle, tu peux utiliser un dictionnaire :
Option Explicit
Sub Test1()
Dim d As Object
Dim x As String
  'Variable à trouver
  x = "C"
  'Création d'un dictionnaire
  Set d = CreateObject("Scripting.Dictionary")
  'Ajout des clés, valeurs
  d.Add "A", ""
  d.Add "B", ""
  d.Add "C", ""
  d.Add "D", ""
  'Test
  If d.Exists(x) Then
    MsgBox x & " existe"
  Else
    MsgBox x & " inconnu"
  End If
End Sub

Le même avec une référence à Microsoft Scripting Runtime :
Sub Test2()
' Ajouter une référence à Microsoft Scripting Runtime
Dim d As Scripting.Dictionary
Dim x As String
  'Variable à trouver
  x = "C"
  'Création d'un dictionnaire
  Set d = New Dictionary
  'Ajout des clés, valeurs
  d.Add "A", ""
  d.Add "B", ""
  d.Add "C", ""
  d.Add "D", ""
  'Test
  If d.Exists(x) Then
    MsgBox x & " existe"
  Else
    MsgBox x & " inconnu"
  End If
End Sub



Messages postés
8539
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
20 juillet 2021
1 697
Chez moi çà fonctionne (sous Acces 2007 et sous Excel 2003 et 2007 versions françaises)
Peut-être un problème de version ou de déclaration des variables ?
Commences le module par Option Explicit et déclares toutes les variables.

Patrice
je vais vérifier mes variables.
je suis sous access 2010 c'est peut être ça.
décidément je ne vois pas, j'ai pourtant retourné ça dans tous les sens.
mon code :

Dim nomod As String
Dim firstarray As Variant, myarray As Variant

firstarray = Array(8, 9, 10, 11, 12, 13, 14, 15)
For i = LBound(firstarray) To UBound(firstarray)
MsgBox firstarray(i)
Next i
myarray = Filter(firstarray, nomod)
If UBound(myarray) > -1 Then
.....

la boucle ne sert qu'a m'assurer que mon tableau firstarray est bien fait, et c'est le cas.
pourtant l'instruction "myarray = Filter(firstarray, nomod)" renvoie toujours le même message d'erreur: "erreur de compilation : nombre d'arguments incorrect ou affectation de propriété incorrecte"
j'ai tout essayé, remplacer ma variable par une string quelconque....

j'aime pas rester sur un échec, une idée?
Messages postés
8539
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
20 juillet 2021
1 697
Seul, ton code fonctionne parfaitement, il est probable qu'une fonction ou une procédure chargée ait le même nom (Filter).

Pour lever l'ambigüité, essaies avec la syntaxe complète :
myarray = VBA.Strings.Filter(firstarray, nomod)
Cordialement
Patrice
t'es un génie, merci!
ça fonctionne parfaitement.
je ne connaissais pas l'écriture complète, intéressant.
Comme je le disais, on peut programmer une fonction pesonnalisée, du coup ça devient très simple et lisible, par exemple:

La fonction
Function Existe(table, elem) As Boolean
Existe = False
For i = LBound(table) To UBound(table)
   If table(i) = elem Then Existe = True
Next
End Function


Appel à la fonction
Sub essai()
A1 = Array(8, 9, 10, 11, 12, 13, 14, 15)
var=10
If Existe(A1, var) then
   MsgBox var & " existe"
  Else
    MsgBox var & " inconnu"
 End If

var="X"
S1 = Array("A", "B", "C", "D", "E")
If Existe(S1, var) then
   MsgBox var & " existe"
  Else
    MsgBox var & " inconnu"
 End If

End Sub
Messages postés
3598
Date d'inscription
mercredi 20 septembre 2006
Statut
Membre
Dernière intervention
24 septembre 2021
852
Pourquoi faire simple quand on peut faire compliqué...
pas mal comme ça.
merci beaucoup