Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 VBA : Fonction Select Case

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Bonjour,

Ma question est facile, mais je ne trouve pas de solution.
Quand je lance

Select Case Variable
Case "PR", "TP"

J'obtiens un bon résultat, néanmoins, je souhaite stocker les modalités dans une variables Donnees comme Donnees= "PR" & ", " & "TP", et quand je lance le programme:
Case Donnees

le code ne marche, pas. J'ai essayé aussi Donnees= "PR, TP", le code ne marche pas non plus.

Merci pour votre aide
 
Solution
Merci Dudu2,
cette réponse m'a fait prendre conscience que je n'avais pas du tout compris la question
Joyeux réveillon !

Gégé-45550

XLDnaute Accro
Bonjour,
Ce serait plus facile de vous aider avec le code complet de la Sub.
Cordialement,
 

Dudu2

XLDnaute Barbatruc
Bonjour,
Je ne sais pas si j'ai bien compris le problème, mais à tout hasard, perso je fais ça:
VB:
Sub a()
    Const ListeCodes = "PR,TP,XX,YY"
    Dim TabCodes() As String
    Dim Variable As String
   
    TabCodes = Split(ListeCodes, ",")    'LBound = 0
   
    Variable = "XX"
   
    Select Case Variable
        Case TabCodes(0)    '"PR"
            ...
        Case TabCodes(1)    '"TP"
            ...
        Case TabCodes(2)    '"XX"
            ...
        Case TabCodes(3)    '"YY"
            ...
    End Select
End Sub
 
Dernière édition:

Gégé-45550

XLDnaute Accro
Merci Dudu2,
cette réponse m'a fait prendre conscience que je n'avais pas du tout compris la question
Joyeux réveillon !
 

job75

XLDnaute Barbatruc
Bonsoir à tous,

Anne-Marie n'a peut-être pas bien compris que dans l'instruction Case la virgule fait partie de la syntaxe de cette instruction.

On ne peut pas toucher à cette virgule.

Donc si l'on utilise la variable Donnees = "PR, TP" il faudra écrire :
VB:
Case Split(Donnees, ", ")(0), Split(Donnees, ", ")(1)
A+
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous,

Une méthode basée sur une fonction CaseN qui retourne un nombre entier de 0 à n. Ce nombre n sera utilisé dans un select case. 0 (zéro) correspondra au cas "Case Else" (valeur non trouvée).

La fonction : CaseN ( xValeur , xMajMin , xSepar , x1 , x2 ,x3 , ..., xn )

- xValeur est la valeur cherchée

- xMajMin prend la valeur True ou False. Si c'est True on distingue les majuscules des minuscules dans les comparaisons, si c'est False les comparaisons ne tiennent pas compte de la casse ("TitI" est égal "titi" ou "TITI")

- xSepar est le séparateur des valeurs de comparaisons. Dans l'exemple c'est la virgule "," (comme dans Donnees= "PR" & ", " & "TP")

- x1 , x2 ,x3 , ... , xn : c'est une suite de données avec lesquelles on compare xValeur.

xi est soit une constante soit une variable. xi représente un string ou bien des string séparés par le caractère xSepar.


Exemple :
Si Val1 = "SX,SP,SY" : Val2 = "AA,DF,SY" alors :
CaseN ( "df" , False , "," , "PR,TP" , Val1, "GB,LP,TS" , Val2 ) renverra 4 car on a trouvé la valeur "df" dans Val2 qui est à la position 4 dans "PR,TP" , Val1, "GB,LP,TS" , Val2


Ensuite on utilisera le select case comme suit :
VB:
Sub Demo()
Dim Val1, Val2, Valeur

   Val1 = "SX,SP,SY": Val2 = "AA,DF,SY"
   Valeur = "df"
   Select Case CaseN("df", False, ",", "PR,TP", Val1, "GB,LP,TS", "AAA", Val2)
      Case 1         ' trouvé dans "PR,TP"
         '...
      Case 2         ' trouvé dans Val1
         '...
      Case 3         ' trouvé dans "GB,LP,TS"
         '...
      Case 4         ' trouvé dans "AAA"
         '...
      Case 5         ' trouvé dans Val2 (ce qui sera le cas ici)
         '...
      Case Else      ' trouvé nulle part
   End Select
End Sub

Voir dans le classeur deux procédures de test.

La fonction CaseN a pour code dans module1 :
VB:
Function CaseN(xValeur, xMajMin As Boolean, xSepar As String, ParamArray xData()) As Integer
Dim i&, x, y, aux
   If UBound(xData) = -1 Then Exit Function
   For i = 0 To UBound(xData)
      If Not IsArray(xData) Then
         If StrComp(xValeur, x, IIf(xMajMin, vbBinaryCompare, vbTextCompare)) = 0 Then CaseN = i + 1: Exit Function
      Else
         For Each y In Split(xData(i), xSepar)
            If StrComp(xValeur, y, IIf(xMajMin, vbBinaryCompare, vbTextCompare)) = 0 Then CaseN = i + 1: Exit Function
         Next y
      End If
   Next i
End Function
 

Pièces jointes

  • VBA_dev_Anne_Marie- Select case avec variables- v1.xlsm
    19.4 KB · Affichages: 3

patricktoulon

XLDnaute Barbatruc
re
Bonjour à tous
meilleurs veux pour la nouvelle année

on peut décanter cette demande sous diverses maniere
l'object des recherche doit etre compilé
  1. ok ici dans l'exemple 1 on utilisera des constantes
  2. que l'on compilera et decoupera en array
  3. un match et un select case
VB:
'version1
Const Val1$ = "SX,SP,SY"
Const Val2$ = "AA,DF,SY"
Sub Demo1()
Dim Valeur$, x&

   t = Split(Val1 & "," & Val2, ",") 'compil en array
  
   Valeur = "df" 'la valeur  à chercher
  
   x = Application.IfError(Application.Match(Valeur, t, 0), 0)
    
    Select Case x
      Case 1
        MsgBox "trouvé en position " & x
      Case 2
        MsgBox "trouvé en position " & x
      Case 3
        MsgBox "trouvé en position " & x
      Case 4
          MsgBox "trouvé en position " & x
      Case 5
          MsgBox "trouvé en position " & x
            
      Case Else:      MsgBox "trouvé nulle part"
   End Select
End Sub

version 2
on ne veut pas melanger les deux constante
  1. on travaillera donc par rubrique
  2. on split chaque constanate
  3. on match sur les split (2 variable x1 et x2)
  4. si x2>0 alors rubrique =2 et x1=x2 sinon rubrique = 1et x1
  5. select case rubrique
  6. select case x1 imbrique dans les case rubriques
Code:
'version2
'patricktoulon
Const Val1$ = "SX,SP,SY"
Const Val2$ = "AA,DF,SY"
Sub Demo2()
    Dim Valeur$, x1&, x2, rubrique&

    t1 = Split(Val1, ",")     'compil en array
    t2 = Split(Val2, ",")    'compil en array

    Valeur = "df"    'la valeur  à chercher

    x1 = Application.IfError(Application.Match(Valeur, t1, 0), 0): If x1 > 0 Then rubrique = 1
    x2 = Application.IfError(Application.Match(Valeur, t2, 0), 0): If x2 > 0 Then rubrique = 2: x1 = x2
    Select Case rubrique
    Case 1'case rubrique 1
        Select Case x1
        Case 1:            MsgBox "trouvé en position " & x1 & " dans la rubrique " & rubrique
        Case 2:            MsgBox "trouvé en position " & x1 & " dans la rubrique " & rubrique
        Case 3:            MsgBox "trouvé en position " & x1 & " dans la rubrique " & rubrique
        Case 4:            MsgBox "trouvé en position " & x1 & " dans la rubrique " & rubrique
        Case 5:            MsgBox "trouvé en position " & x1 & " dans la rubrique " & rubrique
        Case Else: MsgBox "trouvé nulle part"
        End Select
    
    Case 2'case rubrique 2

        Select Case x1
        Case 1:            MsgBox "trouvé en position " & x1 & " dans la rubrique " & rubrique
        Case 2:            MsgBox "trouvé en position " & x1 & " dans la rubrique " & rubrique
        Case 3:            MsgBox "trouvé en position " & x1 & " dans la rubrique " & rubrique
        Case 4:            MsgBox "trouvé en position " & x1 & " dans la rubrique " & rubrique
        Case 5:            MsgBox "trouvé en position " & x1 & " dans la rubrique " & rubrique
        Case Else: MsgBox "trouvé nulle part"
        End Select

    End Select
End Sub
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @patricktoulon et très bonne année 2024 à toi ,

Que 2024 soit parsemé
de tous ces petits moments de bonheur éphémères
dont on se souviendra
toujours
.


Je n'avais pas pris l'option Match car Match ne distingue pas les majuscules des minuscules.
Avec la fonction CaseN, on n'a pas besoin de plusieurs lignes de type match dans le code. On appelle le CaseN qu'une seule fois.
 

patricktoulon

XLDnaute Barbatruc
re
Avec la fonction CaseN, on n'a pas besoin de plusieurs lignes de type match dans le code. On appelle le CaseN qu'une seule fois.
ben le temps que je met pour deux match tu le prends dans ta boucle
en fait ton argument n'est pas recevable dans le sens ou la 2d ligne toi tu le fait dans ta boucle dans une fonction externe en l'ocurence la "caseN"
cela dit l'idée est jolie

tu veux du vraiment mono ligne ?
ben fait une seule ligne "switch" voir "Choose"tu aura la même chose
 

patricktoulon

XLDnaute Barbatruc
après si il faut et la je chipotte bien sur
on fait rubrique mais avec un seul match
tout simplement dans un select case true sur > ou < que 3
VB:
'version1
Const Val1$ = "SX,SP,SY"
Const Val2$ = "AA,DF,SY"
Sub Demo1()
    Dim Valeur$, x&

    t = Split(Val1 & "," & Val2, ",")    'compil en array

    Valeur = "df"    'la valeur  à chercher

    x = Application.IfError(Application.Match(Valeur, t, 0), 0)
    Select Case True
    Case x < 3    'rubrique1
        Select Case x
        Case 1: MsgBox "trouvé en position " & x & " dans la rubrique1"
        Case 2: MsgBox "trouvé en position " & x & " dans la rubrique1"
        Case 3: MsgBox "trouvé en position " & x & " dans la rubrique1"
        Case 4: MsgBox "trouvé en position " & x & " dans la rubrique1"
        Case 5: MsgBox "trouvé en position " & x & " dans la rubrique1"
        Case Else: MsgBox "trouvé nulle part"
        End Select
    Case x > 3    'rubrique2
        Select Case x
        Case 1: MsgBox "trouvé en position " & x & " dans la rubrique2"
        Case 2: MsgBox "trouvé en position " & x & " dans la rubrique2"
        Case 3: MsgBox "trouvé en position " & x & " dans la rubrique2"
        Case 4: MsgBox "trouvé en position " & x & " dans la rubrique2"
        Case 5: MsgBox "trouvé en position " & x & " dans la rubrique2"
        Case Else: MsgBox "trouvé nulle part"
        End Select
    End Select
End Sub
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…