XL 2019 Choix lancement de macro selon résutat d'une boucle

gilboss

XLDnaute Nouveau
J'ai 9 macro qui ouvre chacune une mgbox différente. Selon le résultat d'une boucle de 1 à 9 qui se trouve dans le code de la page, une des macro doit se lancer via Call le nom de la macro qui se termine par le n° du résultat de la boucle.
Seulement, j'aurai déjà réussi si l'on pouvais nommer une macro par un chiffre. ' Sub 1 ( ) ' Mais Excel vba ne le permet pas. J'ai donc appelé mes macro ' Message_1 ( ) ' à 'Message_9' Mon soucis, je n'arrive pas à nommer le résultat de ma boucle pour incrémenter le nom de ma Macro. Par exemple, ma boucle i=5, Résultat= Message_i ce qui donnerai Message_5 et que je lancerai par Call Résultat.
Mais je n'arrive pas à faire cet incrément Message_i
J'espère avoir été assez claire. Merci pour votre aide.
 

p56

XLDnaute Occasionnel
Bonjour,

Dans ce cas, il est mieux d'écrire une seule procédure en lui passant un argument.
Voici un exemple :
VB:
Sub exemple_d_appel()
    Message 2
End Sub

Sub Message(index As Byte)
    Select Case index
       Case 1: MsgBox "blabla 1"
       Case 2: MsgBox "blabla 2"
       Case 3: MsgBox "blabla 3"
       Case 4: MsgBox "blabla 4"
       Case 5: MsgBox "blabla 5"
       Case 6: MsgBox "blabla 6"
       Case 7: MsgBox "blabla 7"
       Case 8: MsgBox "blabla 8"
       Case 9: MsgBox "blabla 9"
    End Select
End Sub

Alternative : directement dans la procédure "appelante" :
VB:
Sub Exemple2()
Dim Msg As Variant

    Msg = Array("blabla 0", "blabla 1", "blabla 2", "blabla 3", "blabla 4", "blabla 5", "blabla 6", "blabla 7", "blabla 8", "blabla 9")
    
    MsgBox Msg(2)
End Sub
 

gilboss

XLDnaute Nouveau
J'ai testé manuellement votre code en le plaçant dans un module. Il fonctionne.
J'ai essayé en le placant dans le code de la page et en faisant une boucle qui se déclenche en cliquant sur une cellule ( ici ligne de 1 à 9 sur colonne C) Mais cela ne marche pas. message d'erreur. Type d'argument Byref incompatible.


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim i
For i = 1 To 9
If Selection.Count = 1 Then
If Not Intersect(Target, Cells(i, 3)) Is Nothing Then
Message i
End I
Next i
End Sub
 

p56

XLDnaute Occasionnel
Alors il faut corriger votre code.
L'index passé en argument est de type Byte donc il est nécessaire de typer votre i de la même façon.
Ensuite, il faut fermer les 2 IF par des END IF
Ce qui donne (avec des indentations de code c'est toujours plus facile de voir les end if manquants) :
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim i As Byte

    For i = 1 To 9
        If Selection.Count = 1 Then
            If Not Intersect(Target, Cells(i, 3)) Is Nothing Then
                Message i
            End If
        End If
    Next i
End Sub

Alternative : on peut simplifier le tout comme ceci :
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not Intersect(Target, Range("C1:C9")) Is Nothing Then Message Target.Row
End Sub

Ou bien encore plus simple :
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Msg As Variant

    Msg = Array("blabla 0", "blabla 1", "blabla 2", "blabla 3", "blabla 4", "blabla 5", "blabla 6", "blabla 7", "blabla 8", "blabla 9")
    If Not Intersect(Target, Range("C1:C9")) Is Nothing Then MsgBox Msg(Target.Row)
End Sub
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
313 274
Messages
2 096 754
Membres
106 739
dernier inscrit
jcdu16