workboock_open / auto_open

Sanarien

XLDnaute Nouveau
Bonjour à toutes et tous,

Une simple question : y-a-t-il une différence entre les deux ?
J'ai lu qu'il fallait 'privilégier' workboock.open dans wookboock plutôt que auto_open dans un module, sitôt dit sitôt fait, mais pas de chance ! Le copier coller du contenu de la macor auto_open dans workbook, donne une erreur à l'ouverture sur une information que je veux écrire dans un autre classeur :
(classeur ouvert : trucmuch.xls)
Windows('DonneesCa.xls').Activate
Sheets('sev').Select
ActiveSheet.Unprotect 'micdonsev'
Sheets('sev').Cells(50, 1).Value = chemin
Sheets('sev').Cells(52, 1) = Operateur
ActiveSheet.Protect 'micdonsev'
(la sélection ne fait pas partie de....) refrain connu.

Si vous avez une explication je suis preneur ! Merci d'avance (rien de vital : j'ai tout remis dans auto_open !)

Michel le sanarien
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour Sanarien, le Forum

Je suis partisant de ne plus employer les macros XL4 'Auto_Open' et autres 'Auto_Close'.

Pour la différence elle est simple, Microsoft préconise d'éviter de les employer dans de nouveaux développements puisqu'elles ont été avantageusement remplacées depuis XL97 par les macros évènementielles bien plus puissantes...

Pour ce qui est de ton Problème au regard de ton extrait de code, je ne situe pas vraiment comment 'Auto_Open' pourrait inter-agir de meilleure façon que la macro évènementielle 'Workbook_Open'...

En fait il faut surtout savoir gérer l'erreur si au moment de l'ouverture de 'TrucMuch.xls' le classeur 'DonneesCa.xls' n'est pas ouvert... Et ceci dans les deux types de macros... (A moins qu'ils ne manque des lignes dans le code que tu as fourni car je ne sais pas ce que sont 'Chemin' et 'Operateur' que je prends pour des Variable String)

Voici une approche plus rationnelle :


Private Const WBName As String = 'DonneesCa.xls'
Private Const WBPath As String = 'C:\\\\\\\\Documents and Settings\\\\\\\\UserName\\\\\\\\Mes documents\\\\\\\\'

Private Sub Workbook_Open()
Dim WBData As Workbook
Dim WSData As Worksheet
Dim Operateur As String, Chemin As String

Operateur = Application.UserName
Chemin = 'Mon Beau Sapin Roi des Forêts...'

If Not TestWBOpen(WBName) Then Workbooks.Open WBPath & WBName

Set WBData = Workbooks(WBName)
Set WSData = WBData.Sheets('sev')
   
With WSData
        .Unprotect 'micdonsev'
        .Cells(50, 1).Value = Chemin
        .Cells(52, 1) = Operateur
        .Protect 'micdonsev'
   
End With

End Sub


Private Function TestWBOpen(StrWBk As String) As Boolean
Dim WB As Workbook


For Each WB In Application.Workbooks
   
If LCase(CStr(WB.Name)) = LCase(StrWBk) Then TestWBOpen = True
Next

End Function


Bon 1er Mai


[ol]@+Thierry[/ol]

EDITION !!!
Satanés @##### de Smileys qui se mettent dans le Code !!! B)

Message édité par: _Thierry, à: 01/05/2006 15:17
 

Dan

XLDnaute Barbatruc
Bonjour,

Effectivement il est mieux d'utiliser Workbook_open car la macro 'auto_open' fait partie de l'antiquité d'excel et pourrait être abandonnée.

En supposant que ta version Excel ne soit pas Excel 95, place ton code de la macro auto_open en suivant les instructions ci-dessous :

- Vas dans VBA par ALT + F11
- CTRL + R pour ouvrir la fenetre VBA project (à gauche)
- Double clique sur THISWORRBOOK, cela t'ouvre une fenetre à droite dans laquelle tu mets ceci :

Code:
Private Sub Workbook_Open()
...le code de ta macro AUTO_OPEN sans le auto_open bien sûr...
End Sub

- Enregistre ton fichier.

Il ne te reste qu'à fermer ton fichier et le réouvrir pour t'apercevoir que cela fonctionne.

Si pb n'hésite pas

;)

Message édité par: Dan, à: 01/05/2006 15:22
 

Sanarien

XLDnaute Nouveau
Re - Bonjour et merci de vous être penchés sur le problème.
Je n'ai mis qu'un bout du code pour ne pas alourdir le message.
La situation :
- à l'ouverture du classeur 'FacturesCA.xls' (='trucmuch.xls') je demande une certain nombre d'opérations en particulier l'ouverture de deux autres dossiers : 'DonneesCA.xls' et 'Suivi_clients.xls'. La macro complète est en pièce jointe. Elle fonctionne bien (en tous cas depuis qu'elle est en place je n'ai pas eu de message d'erreu !). La copie de cette macro brutale et sans adaptation dans la procédure evénentielle 'workboock_open' du 'projet' FactureCA donne à l'instruction
Windows('DonneesCA.xls') l'erreur annoncée (comme si DonneesCA.xls n'existait pas ! ni n'était pas ouvert à ce moment) au moment où je veux écrire dans la feuille 'sev' (vers la fin de la macro).

Je suis avec XP Pro, Excel 2000.

Merci d'éclairer ma bougie
Michel le sanarien [file name=macro_20060501182611.zip size=620]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/macro_20060501182611.zip[/file]
 

Pièces jointes

  • macro_20060501182611.zip
    620 bytes · Affichages: 24

Dan

XLDnaute Barbatruc
Re,


Curieux cette macro ... tu as récupéré cela d'une autre appli ?

Bon l'instruction à pb dont tu parles fait appel au classeur qui se trouve à l'arrière plan.
Lorsque la macro bugue arrête-la et vérifie que ton classeur DONNEES est bien ouvert par menu / fenetre.

;)
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonsoir Dan, re Michel

C'est bizarre, mais de toute manière, la méthode Windows('Classeur.xls').Activate est un peu bourrin comme instruction.

Je ne sais quoi te dire, car moi je ne n'utilise plus Auto_Open... Et je ne vais pas faire de tests là-dessus.

De mémoire, la différence Fondamentale entre les deux Méthodes
1) 'Auto_Open'
2) 'Workbook_Open'

C'est que la seconde se déclenche systématiquement par toute ouverture du fichier que ce soit manuellement ou par Macro...

Alors que la première, 'Auto_Open', ne se déclenche qu'à l'ouverture manuelle du fichier, ou bien dans l'instruction de Macro d'Ouverture il faut spécifier un Macro Run dans la string de WorkBooks.Open (Sous réserve de ma mémoire)

Mais ce pourrait être la cause de ton souci...

Bonne Soirée
[ol]@+Thierry[/ol]
 

Sanarien

XLDnaute Nouveau
Bonjour à toutes et tous,
Bonjour Dan et _Thierry en particulier

Puis-je me permettre ? (tant pis je n'attends pas la réponse !)
1) Dan, La macro est de moi-même via comme pour tous l'étude d'un tas d'exemples pris par-ci par-là ! Il y a surement mieux à faire... mais quand ça marche je n'ai pas le temps d'aller beaucoup plus loin.
2) En particulier _Thierry en quoi l'instruction Windows('Classeur.xls').Activate est-elle 'bourrin' ? Comment fait-on pour la remplacer par quelque chose d'élégant quand on travaille sur plusieurs classeurs ?

Bon si vous avez une idée merci d'avance de me la communiquer (pour que j'aille vers un mieux) sinon désolé de vous avoir fait perdre déjà pas mal de temps la dessus et encore merci.

Michel Le sanarien
 

Dan

XLDnaute Barbatruc
Bonjour Sanarien, Thierry,

Ok merci de ton info car en lisant ta macro, j'avais quelques doutes sur ce que tu voulais faire notamment sur le scrollarea et sur l'instruction Application.ScreenUpdating = False.

A corriger dans ta macro,
Application.ScreenUpdating = False -> à placer au début de ta macro
Application.ScreenUpdating = True -> à placer à la fin de ta macro (à ne pas oublier ...)

Mis à part cela, l'amigos Thierry a déjà proposé quelque chose que tu dois essayer. Fais savoir quoi. Merci.

A te lire



;)
 
S

sanarien

Guest
Re bonjour DAN et Thierry,

Vous ai-je dit que je cherchais à améliorer la facturation d'une association dont je suis le trésorier... donc que je travaille gratis !
Je viens de passer l'après midi à comprendre les bêtises des opérateurs ! et je n'avais pas vu vos messages. Je vais donc étudier le code envoyé par Thierry.
Pour information : j'ai essayé d'utiliser un workbook.close dans un classeur 'toto' avec à l'intérieur un windows('trucmuch.xls').activate : même sanction, dans auto_close() ça marche, dans workbook_close() : erreur identique ('la sélection ne fait pas ...')
Il y a bien une liaison entre les deux erreurs (en open et en close) !

Merci encore.
Michel le sanarien
 

Dan

XLDnaute Barbatruc
Re,

Attention dans ton message tu fais erreur lors de la fermeture. En effet la macro n'est workbook_close mais celle ci -dessous :

Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
... ton code
End Sub

;)
 

Statistiques des forums

Discussions
312 229
Messages
2 086 423
Membres
103 206
dernier inscrit
diambote