OVH Cloud OVH Cloud

[Help] [VBA] events syntaxe [was] [Q] Créer un log qui suit l'utilisation d'un classeur XL

11 réponses
Avatar
JCF
Bonjour à tous.
Je ne comprends pas pourquoi la macro suivante ne fonctionne pas:
---------------------------------
Private Sub ThisWorkbook_BeforeSave(ByVal SaveAsUI As Boolean, _
Cancel As Boolean)

Range("B2").Value = Date + Time

End Sub

----------------------------------
Je souhaite que cette macro enregistre la date et l'heure du dernier
enregistrement du classeur dans lequel elle se trouve (quelque soit le nom
de celui-ci) dans la cellule B2. J'ai choisi l'objet ThisWorkbook pour que
ça marche quelque soit le nom du classeur. Par contre je ne sais pas si les
arguments de cette macro sont facultatifs ou pas, car dans mon cas présent
je ne vois pas leur intérêt.
Pour l'instant il ne se passe absolument rien lorsque j'enregistre mon
classeur...

Il ne se passe rien non plus lorsque j'essaye avec BeforeClose.


Par contre, cette macro-ci marche bien:

---------------------------------
Private Sub Auto_Open()

Range("A2").Value = Date + Time

End Sub
-----------------------------

Idées, suggestions?

Merci d'avance!
Jean-Christophe

10 réponses

1 2
Avatar
AV
Dans le module de ThisWorkbook :

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
[Feuil2!B2] = Now
End Sub

AV
Avatar
ru-th
Salut

cette macro est bien dans le module thisworkbook ?
si oui, peut-être précisé la feuille
[feuil1!b2] = Now

ou la mettre dans un module standard sous le nom
sub auto_close()
[feuil1!b2] = Now
end sub
a+
rural thierry
"JCF" a écrit dans le message de news:
BD199FCB.F05%
Bonjour à tous.
Je ne comprends pas pourquoi la macro suivante ne fonctionne pas:
---------------------------------
Private Sub ThisWorkbook_BeforeSave(ByVal SaveAsUI As Boolean, _
Cancel As Boolean)

Range("B2").Value = Date + Time

End Sub

----------------------------------
Je souhaite que cette macro enregistre la date et l'heure du dernier
enregistrement du classeur dans lequel elle se trouve (quelque soit le nom
de celui-ci) dans la cellule B2. J'ai choisi l'objet ThisWorkbook pour que
ça marche quelque soit le nom du classeur. Par contre je ne sais pas si
les

arguments de cette macro sont facultatifs ou pas, car dans mon cas présent
je ne vois pas leur intérêt.
Pour l'instant il ne se passe absolument rien lorsque j'enregistre mon
classeur...

Il ne se passe rien non plus lorsque j'essaye avec BeforeClose.


Par contre, cette macro-ci marche bien:

---------------------------------
Private Sub Auto_Open()

Range("A2").Value = Date + Time

End Sub
-----------------------------

Idées, suggestions?

Merci d'avance!
Jean-Christophe



Avatar
JCF
"ru-th" m'a répondu:

Salut

cette macro est bien dans le module thisworkbook ?
Eh eh! Je me doutais bien qu'il y avait un truc que j'avais raté!!

C'était bien ça mon problème! J'aurais pu tourner encore longtemps en
rond...
Merci à tous les deux pour votre aide, et je me souviendrai de l'instruction
Now que je ne connaissais pas!
A+
Jean-Christophe

Avatar
JCF
Bon, et bien décidément, je suis une buse en programmation VBA.
Toujours pour mon petit log de suivi d'utilisation de mon fichier, je
voudrai qu'XL enregistre le nombre de fois que la plage de cellules qui
affiche le résultat a changé (cad pour voir le nombre d'itérations qu'à fait
l'utilisateur avant d'arriver à un résultat qui lui convient) et qu'il
enregistre également le nombre d'impression de ce fichier qui ont été
lancées.
J'ai essayé d'écrire tout ça dans le module 'Thisworkbook' et parmi les
nombreuses variantes que j'ai essayées j'en suis aux suivantes:
-----------------------------------------
'Enregistrement dans la cellule D2 de la modification d'une plage de
cellules nommée 'Resultat' 'dans le workbook.

Private Sub Resultat_Change(ByVal Résultat As Range)
Sheets("Log").Activate
Range("D2").Value = Range("D2").Value + 1
End Sub


-------------------------------------------
'Enregistrement dans la cellule E2 du nombre de lancement d'impressions

Private Sub App_WorkbookBeforePrint(ByVal Wb As Workbook, _
Cancel As Boolean)
Sheets("Log").Activate
Range("E2").Value = Range("E2").Value + 1
End Sub

--------------------------------------------
A quel endroit, encore une fois, me goure-je?
Merci d'avance pour votre aide!
A+
Jean-Christophe
Avatar
AV
Le problème est que tu inventes des évènements.....;-)

Dans le module de ThisWorkbook
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Range("Log!E2").Value = Range("Log!E2").Value + 1
End Sub

AV
Avatar
JCF
"AV" m'a répondu:

Le problème est que tu inventes des évènements.....;-)
Quand je te dis que je suis une buse... :-)

Dans le module de ThisWorkbook
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Range("Log!E2").Value = Range("Log!E2").Value + 1
End Sub
Ben ça c'est malin alors! C'est exactement l'exemple de l'aide MS! Mais j'ai

commencé par celui-là avant d'inventer plein de trucs, et ça ne marchait
pas! (j'avais dû encore rater qq chose...).
Merci pour la solution!!


Et dans mon autre Event, quelle est l'erreur??
Installé dans Thisworkbook:

----------------------------------
Private Sub Résultat_Change()

Range("Log!D2").Value = Range("Log!D2").Value + 1

End Sub
----------------------------------

'Résultat' étant le nom de la plage de cellules dont je veux traquer le
nombre de changements. J'imagine que mon erreur provient d'un truc du style
que 'Résultat' n'est pas considéré comme un objet? Ou autre?
Help, je n'arrive carrément pas à trouver où je me plante, pourtant ça
devrait être simple à faire comme truc...
Merci d'avance pour vos idées et suggestions!
Jean-Christophe

Avatar
AV
Et dans mon autre Event, quelle est l'erreur??


Dans le module de ThisWorkbook :

Private Sub Workbook_BeforePrint(Cancel As Boolean)
Range("Log!E2").Value = Range("Log!E2").Value + 1
End Sub

AV

Avatar
JCF
Le 14/07/04 14:41,"AV" m'a répondu:

Et dans mon autre Event, quelle est l'erreur??


Dans le module de ThisWorkbook :

Private Sub Workbook_BeforePrint(Cancel As Boolean)
Range("Log!E2").Value = Range("Log!E2").Value + 1
End Sub

AV


Ben non Alain! Celui-ci c'est le premier et tu m'y as déjà répondu! ~#-)
C'est le second sur lequel je continue à buter, dans lequel je souhaite
suivre le nombre de changements que l'utilisateur a fait dans ses calculs.

J'avais fait une première version, qui fonctionne, mais qui capte n'importe
quels changements. Cad que quand je change une valeur dans une cellule, cet
event compte de 30 à 60 changements.... Autant dire que cet indicateur ne me
sert à rien.
Voici la première version:

------------------------
Private Sub Workbook_SheetChange(ByVal Sh As Object, _
ByVal Source As Range)
Sheets("Log").Activate
Range("D2").Value = Range("D2").Value + 1

End Sub
------------------------

Du coup je me suis dit je vais plutôt suivre le nombre de changements que la
zone de cellules qui affiche le résultat du calcul (Zone nommée 'Résultat')
a subi, ce qui me permettra de savoir combien de fois l'utilisateur a changé
ses hypothèses de départ.

Donc voici ce que j'ai écrit pour essayer d'y arriver, placé dans le module
Thisworkbook

-------------------------
Private Sub Résultat_Change() '"Résultat" est le nom de ma plage de
'cellules à monitorer.

Range("Log!D2").Value = Range("Log!D2").Value + 1


End Sub
-----------------------

Voilà, mais ça ne marche pas. Pourquoi?
Merci et à +
Jean-Christophe


Avatar
AV
Ben non Alain! Celui-ci c'est le premier et tu m'y as déjà répondu! ~#-)


Ha bon....

Du coup je me suis dit je vais plutôt suivre le nombre de changements


Dans le module de la feuille contenant la plage nommée "Résultat"

Private mém, nbChange

Private Sub Worksheet_SelectionChange(ByVal zz As Range)
If Selection.Count > 1 Then Exit Sub
If Intersect(zz, [Résultat]) Is Nothing Then Exit Sub
mém = zz.Value
End Sub

Private Sub Worksheet_Change(ByVal zz As Range)
If Selection.Count > 1 Then Exit Sub
If zz.Value <> mém Then Sheets("Log").Range("D2").Value Sheets("Log").Range("D2").Value + 1
End Sub

AV

Avatar
JCF
"AV" m'a proposé:

Private mém, nbChange

Private Sub Worksheet_SelectionChange(ByVal zz As Range)
If Selection.Count > 1 Then Exit Sub
If Intersect(zz, [Résultat]) Is Nothing Then Exit Sub
mém = zz.Value
End Sub

Private Sub Worksheet_Change(ByVal zz As Range)
If Selection.Count > 1 Then Exit Sub
If zz.Value <> mém Then Sheets("Log").Range("D2").Value > Sheets("Log").Range("D2").Value + 1
End Sub


Ben non Alain, je suis désolé mais ça ne marche pas comme je le souhaite.
Avec ces instructions là, une modif est enregistrée à chaque fois qu'une
valeur est entrée en dur dans la feuille dans laquelle se trouvent les
instructions. Et cela que la cellule modifiée se trouve ou pas dans la zone
de cellules "Résultat". En revanche, si c'est le résultat d'une formule qui
change, rien n'est pris en compte (par exemple, si dans la feuille monitorée
se trouve somme(cellules se trouvant dans une autre feuille), aucune
modification n'est décomptée.

Mais en fait, tu as quand même raison, j'invente des trucs... :-[

Il suffit en fait d'entrer ça dans le module de la feuille de calcul dans
laquelle se trouve le résultat à surveiller:

---------------------------
Private Sub Worksheet_Calculate()
Sheets("Log").Range("D2").Value = _
Sheets("Log").Range("D2").Value + 1
End Sub

---------------------------

Cette instruction surveille toute la feuille et pas seulement ma plage de
cellules, mais elle a le bon goût de ne se déclencher qu'une seule fois si
tout un calcul en cascade change dans la feuille. Donc ça me sort
l'indicateur que je recherche.
Je suis désolé de t'avoir lancé sur une piste foireuse avec Change.
En tout cas merci beaucoup pour ton aide car tu m'as sorti du pétrin! :-)

A+
Jean-Christophe

1 2