Un private sub dans un sub
Résolu
hcetat
Messages postés
8
Statut
Membre
-
hcetat Messages postés 8 Statut Membre -
hcetat Messages postés 8 Statut Membre -
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
- Vba ouvrir un fichier excel avec chemin ✓ - Forum VB / VBA
- Incompatibilité de type vba ✓ - Forum VB / VBA
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