OVH Cloud OVH Cloud

Fine tuning d'une macro

7 réponses
Avatar
Stéphan DuQuébec
Bonjour à toutes & tous,

Une suggestion serait grandement appréciée.

Voici une macro de mon module ThisWorbook déclenchée par un clic de bouton:
______________________________________________
Function AleaEntre(Low As Long, High As Long) As Long

AleaEntre = Int(Rnd * (High - Low + 1)) + Low

End Function
________________________________________________

Sub GaucheDroite()

Application.ScreenUpdating = False

Range("COCOCALCUL!B15") = ""
Range("COCOCALCUL!E15") = ""
Range("DONNÉES!A3") = AleaEntre(1, 2)

If Range("DONNÉES!A3") = 1 Then Range("COCOCALCUL!B15").Select
If Range("DONNÉES!A3") = 2 Then Range("COCOCALCUL!E15").Select

ActiveCell.Value = AleaEntre(0, Range("DONNÉES!A5") - 1)

If Range("DONNÉES!A3") = 1 Then Range("COCOCALCUL!E15").Select
If Range("DONNÉES!A3") = 2 Then Range("COCOCALCUL!B15").Select

Application.ScreenUpdating = True

End Sub

En gros, la présente macro s'effectue dans une feuille où il n'y a que 2
cellules accessibles (non verrouillées). La macro cible de façon aléatoire
une des 2 cellules pour ensuite lui assigner une valeur, aussi aléatoire,
entre 0 et une valeur existante - 1, pour ensuite se positionner sur l'autre
cellule accessible.

Tout ça marche bien.

Je voudrais cependant modifier le mode d'appel de la macro.

Après le déroulement initial de la macro, l'utilisateur doit saisir une
valeur dans l'ActiveCell pour ensuite réenfoncer le bouton qui regénère tout
le processus.

Et ce, plusieurs fois à répétition (fin déterminée par un compteur en
parallèle).

Au lieu d'enfoncer le bouton de commande à chaque fois, j'aimerais qu'après
un premier déroulement de la macro (mettons initialement appelée dans
l'évènement WorkBook Open) "demeurer" en attente d'une entrée (inscription
d'une valeur suivi de la touche Enter) pour ensuite mettre une pause de 5
secondes (genre Application. OnTime Wow + .....) et regénérer cette macro de
nouveau.

Toujours jusqu'à la fni déterminée par une valeur de compteur.

Maintenant comment faire ?

Désolé du long roman fleuve.......j'ai toujours eu de la difficulté à être
bref.

Merci pour votre aide.

7 réponses

Avatar
MichDenis
Bonjour Stépha DuQuébec,


A ) Je n'ai pas pu savoir pourquoi tu utilisais le ThisWorkbook pour mettre ta procédure ?

B ) Place ceci dans la feuille module de la feuille où l'action se déroule :
À fois que tu vas modifier le contenu de la cellule B15 ou E15, ta procédure va s'exécuter.
Tu n'auras plus besoin d'un bouton pour appeler la macro.

'---------------------------
Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Union(Range("B15:E15"))) Is Nothing Then
GaucheDroite
End If

End Sub
'---------------------------
Sub GaucheDroite()

Application.ScreenUpdating = False

Range("COCOCALCUL!B15") = ""
Range("COCOCALCUL!E15") = ""
Range("DONNÉES!A3") = AleaEntre(1, 2)

If Range("DONNÉES!A3") = 1 Then Range("COCOCALCUL!B15").Select
If Range("DONNÉES!A3") = 2 Then Range("COCOCALCUL!E15").Select

ActiveCell.Value = AleaEntre(0, Range("DONNÉES!A5") - 1)

If Range("DONNÉES!A3") = 1 Then Range("COCOCALCUL!E15").Select
If Range("DONNÉES!A3") = 2 Then Range("COCOCALCUL!B15").Select

Application.ScreenUpdating = True

End Sub
'---------------------------


Ceci dans un module standard
'---------------------------
Function AleaEntre(Low As Long, High As Long) As Long

AleaEntre = Int(Rnd * (High - Low + 1)) + Low

End Function
'---------------------------


Salutations!


"Stéphan DuQuébec" a écrit dans le message de news:

Bonjour à toutes & tous,

Une suggestion serait grandement appréciée.

Voici une macro de mon module ThisWorbook déclenchée par un clic de bouton:
______________________________________________
Function AleaEntre(Low As Long, High As Long) As Long

AleaEntre = Int(Rnd * (High - Low + 1)) + Low

End Function
________________________________________________

Sub GaucheDroite()

Application.ScreenUpdating = False

Range("COCOCALCUL!B15") = ""
Range("COCOCALCUL!E15") = ""
Range("DONNÉES!A3") = AleaEntre(1, 2)

If Range("DONNÉES!A3") = 1 Then Range("COCOCALCUL!B15").Select
If Range("DONNÉES!A3") = 2 Then Range("COCOCALCUL!E15").Select

ActiveCell.Value = AleaEntre(0, Range("DONNÉES!A5") - 1)

If Range("DONNÉES!A3") = 1 Then Range("COCOCALCUL!E15").Select
If Range("DONNÉES!A3") = 2 Then Range("COCOCALCUL!B15").Select

Application.ScreenUpdating = True

End Sub

En gros, la présente macro s'effectue dans une feuille où il n'y a que 2
cellules accessibles (non verrouillées). La macro cible de façon aléatoire
une des 2 cellules pour ensuite lui assigner une valeur, aussi aléatoire,
entre 0 et une valeur existante - 1, pour ensuite se positionner sur l'autre
cellule accessible.

Tout ça marche bien.

Je voudrais cependant modifier le mode d'appel de la macro.

Après le déroulement initial de la macro, l'utilisateur doit saisir une
valeur dans l'ActiveCell pour ensuite réenfoncer le bouton qui regénère tout
le processus.

Et ce, plusieurs fois à répétition (fin déterminée par un compteur en
parallèle).

Au lieu d'enfoncer le bouton de commande à chaque fois, j'aimerais qu'après
un premier déroulement de la macro (mettons initialement appelée dans
l'évènement WorkBook Open) "demeurer" en attente d'une entrée (inscription
d'une valeur suivi de la touche Enter) pour ensuite mettre une pause de 5
secondes (genre Application. OnTime Wow + .....) et regénérer cette macro de
nouveau.

Toujours jusqu'à la fni déterminée par une valeur de compteur.

Maintenant comment faire ?

Désolé du long roman fleuve.......j'ai toujours eu de la difficulté à être
bref.

Merci pour votre aide.
Avatar
Pierre Fauconnier
Bonjour

Lance GaucheDroite à l'ouverture du classeur, en ajoutant en début de macro
Application.EnableEvents = False

et en fin de macro

Application.EnableEvents = True

pour désactiver l'évènement Change des feuilles

Dans le module de la feuille utilisée, gère l'évènement Worksheet.Change

Private Sub Worksheet_Change(ByVal Target As Range)
Static Compteur as integer
if Compteur < 10 Then ' nombre de fois que la macro doit s'exécuter
Application.Wait Now() + 0.00006
GaucheDroite
Compteur = Compteur + 1
End If
End Sub


Ok?

Pierre

"Stéphan DuQuébec" a écrit dans le
message de news:
Bonjour à toutes & tous,

Une suggestion serait grandement appréciée.

Voici une macro de mon module ThisWorbook déclenchée par un clic de
bouton:
______________________________________________
Function AleaEntre(Low As Long, High As Long) As Long

AleaEntre = Int(Rnd * (High - Low + 1)) + Low

End Function
________________________________________________

Sub GaucheDroite()

Application.ScreenUpdating = False

Range("COCOCALCUL!B15") = ""
Range("COCOCALCUL!E15") = ""
Range("DONNÉES!A3") = AleaEntre(1, 2)

If Range("DONNÉES!A3") = 1 Then Range("COCOCALCUL!B15").Select
If Range("DONNÉES!A3") = 2 Then Range("COCOCALCUL!E15").Select

ActiveCell.Value = AleaEntre(0, Range("DONNÉES!A5") - 1)

If Range("DONNÉES!A3") = 1 Then Range("COCOCALCUL!E15").Select
If Range("DONNÉES!A3") = 2 Then Range("COCOCALCUL!B15").Select

Application.ScreenUpdating = True

End Sub

En gros, la présente macro s'effectue dans une feuille où il n'y a que 2
cellules accessibles (non verrouillées). La macro cible de façon aléatoire
une des 2 cellules pour ensuite lui assigner une valeur, aussi aléatoire,
entre 0 et une valeur existante - 1, pour ensuite se positionner sur
l'autre
cellule accessible.

Tout ça marche bien.

Je voudrais cependant modifier le mode d'appel de la macro.

Après le déroulement initial de la macro, l'utilisateur doit saisir une
valeur dans l'ActiveCell pour ensuite réenfoncer le bouton qui regénère
tout
le processus.

Et ce, plusieurs fois à répétition (fin déterminée par un compteur en
parallèle).

Au lieu d'enfoncer le bouton de commande à chaque fois, j'aimerais
qu'après
un premier déroulement de la macro (mettons initialement appelée dans
l'évènement WorkBook Open) "demeurer" en attente d'une entrée (inscription
d'une valeur suivi de la touche Enter) pour ensuite mettre une pause de 5
secondes (genre Application. OnTime Wow + .....) et regénérer cette macro
de
nouveau.

Toujours jusqu'à la fni déterminée par une valeur de compteur.

Maintenant comment faire ?

Désolé du long roman fleuve.......j'ai toujours eu de la difficulté à être
bref.

Merci pour votre aide.


Avatar
Stéphan DuQuébec
Bonjour MichDenis,


A ) Je n'ai pas pu savoir pourquoi tu utilisais le ThisWorkbook pour mettre ta procédure ?


Rép: parce qu'elle peut être appelée dans différente feuille de mon classeur.

B ) Place ceci dans la feuille module de la feuille où l'action se déroule :
À fois que tu vas modifier le contenu de la cellule B15 ou E15, ta procédure va s'exécuter.
Tu n'auras plus besoin d'un bouton pour appeler la macro.


Rép: c'est ce que je tente sous très très peu.

Merci de votre collaboration permanente (j'oserais dire si patiente.....).

'---------------------------
Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Union(Range("B15:E15"))) Is Nothing Then
GaucheDroite
End If

End Sub


Avatar
Stéphan DuQuébec
Cette façon est aussi très intéressante.

Je vais essayer dans mon fichier et redonnerai des nouvelles.

Merci.


Bonjour

Lance GaucheDroite à l'ouverture du classeur, en ajoutant en début de macro
Application.EnableEvents = False

et en fin de macro

Application.EnableEvents = True

pour désactiver l'évènement Change des feuilles

Dans le module de la feuille utilisée, gère l'évènement Worksheet.Change

Private Sub Worksheet_Change(ByVal Target As Range)
Static Compteur as integer
if Compteur < 10 Then ' nombre de fois que la macro doit s'exécuter
Application.Wait Now() + 0.00006
GaucheDroite
Compteur = Compteur + 1
End If
End Sub


Ok?

Pierre

"Stéphan DuQuébec" a écrit dans le
message de news:
Bonjour à toutes & tous,

Une suggestion serait grandement appréciée.

Voici une macro de mon module ThisWorbook déclenchée par un clic de
bouton:
______________________________________________
Function AleaEntre(Low As Long, High As Long) As Long

AleaEntre = Int(Rnd * (High - Low + 1)) + Low

End Function
________________________________________________

Sub GaucheDroite()

Application.ScreenUpdating = False

Range("COCOCALCUL!B15") = ""
Range("COCOCALCUL!E15") = ""
Range("DONNÉES!A3") = AleaEntre(1, 2)

If Range("DONNÉES!A3") = 1 Then Range("COCOCALCUL!B15").Select
If Range("DONNÉES!A3") = 2 Then Range("COCOCALCUL!E15").Select

ActiveCell.Value = AleaEntre(0, Range("DONNÉES!A5") - 1)

If Range("DONNÉES!A3") = 1 Then Range("COCOCALCUL!E15").Select
If Range("DONNÉES!A3") = 2 Then Range("COCOCALCUL!B15").Select

Application.ScreenUpdating = True

End Sub

En gros, la présente macro s'effectue dans une feuille où il n'y a que 2
cellules accessibles (non verrouillées). La macro cible de façon aléatoire
une des 2 cellules pour ensuite lui assigner une valeur, aussi aléatoire,
entre 0 et une valeur existante - 1, pour ensuite se positionner sur
l'autre
cellule accessible.

Tout ça marche bien.

Je voudrais cependant modifier le mode d'appel de la macro.

Après le déroulement initial de la macro, l'utilisateur doit saisir une
valeur dans l'ActiveCell pour ensuite réenfoncer le bouton qui regénère
tout
le processus.

Et ce, plusieurs fois à répétition (fin déterminée par un compteur en
parallèle).

Au lieu d'enfoncer le bouton de commande à chaque fois, j'aimerais
qu'après
un premier déroulement de la macro (mettons initialement appelée dans
l'évènement WorkBook Open) "demeurer" en attente d'une entrée (inscription
d'une valeur suivi de la touche Enter) pour ensuite mettre une pause de 5
secondes (genre Application. OnTime Wow + .....) et regénérer cette macro
de
nouveau.

Toujours jusqu'à la fni déterminée par une valeur de compteur.

Maintenant comment faire ?

Désolé du long roman fleuve.......j'ai toujours eu de la difficulté à être
bref.

Merci pour votre aide.







Avatar
MichDenis
Bonjour Stéphan,

Désolé, mais la ligne de code se lit comme suit :

If Not Intersect(Target, Union(Range("B15"), Range("E15"))) Is Nothing Then



Sautations!



"Stéphan DuQuébec" a écrit dans le message de news:


Bonjour MichDenis,


A ) Je n'ai pas pu savoir pourquoi tu utilisais le ThisWorkbook pour mettre ta procédure ?


Rép: parce qu'elle peut être appelée dans différente feuille de mon classeur.

B ) Place ceci dans la feuille module de la feuille où l'action se déroule :
À fois que tu vas modifier le contenu de la cellule B15 ou E15, ta procédure va s'exécuter.
Tu n'auras plus besoin d'un bouton pour appeler la macro.


Rép: c'est ce que je tente sous très très peu.

Merci de votre collaboration permanente (j'oserais dire si patiente.....).

'---------------------------
Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Union(Range("B15:E15"))) Is Nothing Then
GaucheDroite
End If

End Sub


Avatar
Stéphan DuQuébec
Vous m'enlevez les "touches du clavier".....

J'avais eu la même erreur.

Merci.


Bonjour Stéphan,

Désolé, mais la ligne de code se lit comme suit :

If Not Intersect(Target, Union(Range("B15"), Range("E15"))) Is Nothing Then



Sautations!



"Stéphan DuQuébec" a écrit dans le message de news:


Bonjour MichDenis,


A ) Je n'ai pas pu savoir pourquoi tu utilisais le ThisWorkbook pour mettre ta procédure ?


Rép: parce qu'elle peut être appelée dans différente feuille de mon classeur.

B ) Place ceci dans la feuille module de la feuille où l'action se déroule :
À fois que tu vas modifier le contenu de la cellule B15 ou E15, ta procédure va s'exécuter.
Tu n'auras plus besoin d'un bouton pour appeler la macro.


Rép: c'est ce que je tente sous très très peu.

Merci de votre collaboration permanente (j'oserais dire si patiente.....).

'---------------------------
Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Union(Range("B15:E15"))) Is Nothing Then
GaucheDroite
End If

End Sub







Avatar
Stéphan DuQuébec
Pour ceux & celles qui ont suivi ce fil.

Un combiné des 2 réponses apportées fonctionne très bien.

Gérer l'évènement Sheet Change avec un Intersect (target et Union Range)
puis EnableEvents False & True. Le compteur et le temps d'attente de P.
Fauconnier avec ça et tout est A1.





Cette façon est aussi très intéressante.

Je vais essayer dans mon fichier et redonnerai des nouvelles.

Merci.


Bonjour

Lance GaucheDroite à l'ouverture du classeur, en ajoutant en début de macro
Application.EnableEvents = False

et en fin de macro

Application.EnableEvents = True

pour désactiver l'évènement Change des feuilles

Dans le module de la feuille utilisée, gère l'évènement Worksheet.Change

Private Sub Worksheet_Change(ByVal Target As Range)
Static Compteur as integer
if Compteur < 10 Then ' nombre de fois que la macro doit s'exécuter
Application.Wait Now() + 0.00006
GaucheDroite
Compteur = Compteur + 1
End If
End Sub


Ok?

Pierre

"Stéphan DuQuébec" a écrit dans le
message de news:
Bonjour à toutes & tous,

Une suggestion serait grandement appréciée.

Voici une macro de mon module ThisWorbook déclenchée par un clic de
bouton:
______________________________________________
Function AleaEntre(Low As Long, High As Long) As Long

AleaEntre = Int(Rnd * (High - Low + 1)) + Low

End Function
________________________________________________

Sub GaucheDroite()

Application.ScreenUpdating = False

Range("COCOCALCUL!B15") = ""
Range("COCOCALCUL!E15") = ""
Range("DONNÉES!A3") = AleaEntre(1, 2)

If Range("DONNÉES!A3") = 1 Then Range("COCOCALCUL!B15").Select
If Range("DONNÉES!A3") = 2 Then Range("COCOCALCUL!E15").Select

ActiveCell.Value = AleaEntre(0, Range("DONNÉES!A5") - 1)

If Range("DONNÉES!A3") = 1 Then Range("COCOCALCUL!E15").Select
If Range("DONNÉES!A3") = 2 Then Range("COCOCALCUL!B15").Select

Application.ScreenUpdating = True

End Sub

En gros, la présente macro s'effectue dans une feuille où il n'y a que 2
cellules accessibles (non verrouillées). La macro cible de façon aléatoire
une des 2 cellules pour ensuite lui assigner une valeur, aussi aléatoire,
entre 0 et une valeur existante - 1, pour ensuite se positionner sur
l'autre
cellule accessible.

Tout ça marche bien.

Je voudrais cependant modifier le mode d'appel de la macro.

Après le déroulement initial de la macro, l'utilisateur doit saisir une
valeur dans l'ActiveCell pour ensuite réenfoncer le bouton qui regénère
tout
le processus.

Et ce, plusieurs fois à répétition (fin déterminée par un compteur en
parallèle).

Au lieu d'enfoncer le bouton de commande à chaque fois, j'aimerais
qu'après
un premier déroulement de la macro (mettons initialement appelée dans
l'évènement WorkBook Open) "demeurer" en attente d'une entrée (inscription
d'une valeur suivi de la touche Enter) pour ensuite mettre une pause de 5
secondes (genre Application. OnTime Wow + .....) et regénérer cette macro
de
nouveau.

Toujours jusqu'à la fni déterminée par une valeur de compteur.

Maintenant comment faire ?

Désolé du long roman fleuve.......j'ai toujours eu de la difficulté à être
bref.

Merci pour votre aide.