Un private sub dans un sub

Résolu/Fermé
hcetat Messages postés 8 Date d'inscription mercredi 5 décembre 2007 Statut Membre Dernière intervention 14 mai 2020 - 26 févr. 2016 à 11:18
hcetat Messages postés 8 Date d'inscription mercredi 5 décembre 2007 Statut Membre Dernière intervention 14 mai 2020 - 26 févr. 2016 à 15:15
Bonjour,

Je vous remercie pour votre article intitulé "VBA - Appel d'une macro dans une autre macro", très bien écrit et très clair.

J'essaie d'adapter le code que vous donnez en exemple au cas que je dois résoudre.
Je ne suis pas une flèche en VBA et il y a quelque chose qui m'échappe.
Voici l'exemple de votre article :

Private Sub Worksheet_Change(ByVal Target As Range)
'Si la cellule concernée par le changement n'a pas pour adresse A1 => on quitte
If Target.Address <> "$A$1" Then Exit Sub
'Si la cellule (donc A1) est > 10 alors on place "Pas mal!" en B1
If Target.Value > 10 Then Target.Offset(0, 1) = "Pas mal!" Else Target.Offset(0, 1) = "Pas terrible!"
End Sub

Sub MaMacro()
Dim monRange As Range
Set monRange = Sheets("Feuil1").Range("A1")
Call Worksheet_Change(monRange)
End Sub

Si j'en fais une macro sans rien en modifier et que je l'exécute, d'emblée, Excel place "pas terrible" en B1 et ensuite, quoique j'indique en A1, B1 ne se modifie plus.
Je me suis peut-être trompé, mais je m'attendais à ce que B1 se modifie en fonction de la valeur de A1.

Qu'est-ce que je n'ai pas compris ?

En complément, voici ce que je souhaite faire.
Un utilisateur doit faire un choix dans une liste de validation.
Une fois que ce soit est fait, le programme doit continuer à s'exécuter.

Pouvez-vous me dire comment faire appel à la suite du programme une fois que le choix est fait ?

Je vous remercie d'avance pour votre réponse.

Bien à vous

Henri

4 réponses

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
26 févr. 2016 à 11:39
Bonjour,

Basé sur la fonction WaitForUserInput de Chip Pearson.
Il te faut :
Dans un module standard le code :
Option Explicit

Public Changee As Boolean

Sub Test()
    Dim B As Boolean
    MsgBox "Vous devez faire votre choix dans la cellule A1 Feuil1"
    'ici on attends
    B = Attente_Utilisateur(Worksheets(1).Range("A1"), 10)
    'après l'attente
    If B = True Then
        MsgBox "la cellule A1 a changée, elle contient : " & Range("A1").Value
    Else
        MsgBox "la cellule n'a pas changé"
    End If
End Sub

Public Function Attente_Utilisateur(Cell_Changeante As Range, Duree_Max As Integer) As Boolean
Dim Debut As Double

    Changee = False
    Debut = Now
    Do
        DoEvents
        If Changee = True Then
            Attente_Utilisateur = True
            Exit Function
        End If
    Loop While Now - Debut < TimeSerial(0, 0, Duree_Max)
    Attente_Utilisateur = False
End Function


et dans le module de la Feuil1 (pour l'exemple) :
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$1" Then Changee = True
End Sub

1
hcetat Messages postés 8 Date d'inscription mercredi 5 décembre 2007 Statut Membre Dernière intervention 14 mai 2020
26 févr. 2016 à 12:58
Merci pour la réponse.

Ma problématique est légèrement différente puisque je dois attendre, indéfiniment s'il le faut, que l'utilisateur fasse sont choix dans la liste ci-dessous:
 
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="BIACCDF ,BIACUSD ,RAWUSD ,TMBCNF ,TMBUSD "
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = "Vos comptes"
.ErrorTitle = ""
.InputMessage = "Choisissez un compte en cliquant sur la flèche"
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With


Une fois que son choix est fait, la macro doit continuer à s'exécuter.

D'après votre article, on peut l'appeler avec une commande comme


Call Module1.ListeDesPaiementsSuite


mais ma question est : comment faire démarrer automatiquement la suite (call...) lorsque la cellule E1 qui contient le choix est remplie ?

Merci pour votre patience

Henri
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
26 févr. 2016 à 14:18
C'est très voisin de ce que je proposais.
Dans le module de la Feuil1
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target = Cell_Changeante Then Changee = True
End Sub


Et dans un module standard :
Option Explicit

Public Changee As Boolean, Cell_Changeante As Range

Sub test()
Dim B As Boolean
    Worksheets("Feuil1").Range("E1").Select
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="BIACCDF ,BIACUSD ,RAWUSD ,TMBCNF ,TMBUSD "
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = "Vos comptes"
        .ErrorTitle = ""
        .InputMessage = "Choisissez un compte en cliquant sur la flèche"
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With
    Set Cell_Changeante = Worksheets("Feuil1").Range("E1")
    B = Attente_Utilisateur
    MsgBox "valeur changée, suite"
End Sub

Public Function Attente_Utilisateur() As Boolean
Dim Debut As Double

    Changee = False
    Debut = Now
    Do
        DoEvents
        If Changee = True Then
            Attente_Utilisateur = True
            Exit Function
        End If
    Loop
    Attente_Utilisateur = False
End Function
0
hcetat Messages postés 8 Date d'inscription mercredi 5 décembre 2007 Statut Membre Dernière intervention 14 mai 2020
26 févr. 2016 à 14:33
Merci beaucoup ça commence à sentir l'écurie ! :-)

Je sens effectivement que nous sommes tout proches du jackpot, mais il y a encore un petit détail à régler.

La feuille sur laquelle s'applique le traitement est ouverte au début par


On Error Resume Next
ChDrive "X:"
If Error Then
ChDrive "C:"
ChDir "C:\WinBooks\DataExcel"
Else
ChDir "X:\DataExcel"
End If

nom = Application.GetOpenFilename("Nom fichier,*.XLS")
If nom <> False Then
Workbooks.Open nom
Else
Exit Sub
End If
On Error GoTo 0



Ce qui fait que je ne peux pas placer d'avance ce qui suit dans la feuil1


Private Sub Worksheet_Change(ByVal Target As Range)
If Target = Cell_Changeante Then Changee = True
End Sub


Comment faire alors ?

Encore merci pour votre réactivité.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
Modifié par pijaku le 26/02/2016 à 14:44
Option Explicit

Public Cell_Changeante As Range

Sub test()
Dim B As Boolean, Valeur_Initiale As String
    Worksheets("Feuil1").Range("E1").Select
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="BIACCDF ,BIACUSD ,RAWUSD ,TMBCNF ,TMBUSD "
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = "Vos comptes"
        .ErrorTitle = ""
        .InputMessage = "Choisissez un compte en cliquant sur la flèche"
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With
    Set Cell_Changeante = Worksheets("Feuil1").Range("E1")
    Valeur_Initiale = CStr(Cell_Changeante.Value)
    B = Attente_Utilisateur(Valeur_Initiale)
    MsgBox "valeur changée, suite"
End Sub

Public Function Attente_Utilisateur(Valeur As String) As Boolean
    Do
        DoEvents
        If Cell_Changeante.Value <> Valeur Then
            Attente_Utilisateur = True
            Exit Function
        End If
    Loop
    Attente_Utilisateur = False
End Function
0
hcetat Messages postés 8 Date d'inscription mercredi 5 décembre 2007 Statut Membre Dernière intervention 14 mai 2020
26 févr. 2016 à 15:15
Alléluia ! Ça marche !
J'ai remplacé par MsgBox "valeur changée, suite" par le Call et bingo !

Félicitations et merci !

Je devrais absolument consacrer quelques jours à suivre des cours, je pense que j'y gagnerais énormément !

Encore merci !

Henri
0