Un private sub dans un sub
Résolu
hcetat
Messages postés
8
Date d'inscription
Statut
Membre
Dernière intervention
-
hcetat Messages postés 8 Date d'inscription Statut Membre Dernière intervention -
hcetat Messages postés 8 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
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
A voir également:
- Private function vba
- Navigation in private - Guide
- Dekart private disk - Télécharger - Chiffrement
- Excel compter cellule couleur sans vba - Guide
- Incompatibilité de type vba ✓ - Forum VB / VBA
- Erreur 13 incompatibilité de type VBA excel ✓ - Forum Excel
4 réponses
Bonjour,
Basé sur la fonction WaitForUserInput de Chip Pearson.
Il te faut :
Dans un module standard le code :
et dans le module de la Feuil1 (pour l'exemple) :
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
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:
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
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
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
C'est très voisin de ce que je proposais.
Dans le module de la Feuil1
Et dans un module standard :
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
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
Ce qui fait que je ne peux pas placer d'avance ce qui suit dans la feuil1
Comment faire alors ?
Encore merci pour votre réactivité.
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é.
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