Un private sub dans un sub

Résolu
hcetat Messages postés 7 Date d'inscription   Statut Membre Dernière intervention   -  
hcetat Messages postés 7 Date d'inscription   Statut Membre Dernière intervention   -
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

  1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
  2. hcetat Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
     
    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
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
  3. hcetat Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
     
    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
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
  4. hcetat Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
     
    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