temporiser fermeture

teter

XLDnaute Junior
Bonjour à tous,

J'ai un petit souçi, vous devez vous en douter.
Sur un fichier, je fais des mises à jour (Bloomberg, application "bloombergui.xla!RefreshData") puis une copie. Pour copier les données mises à jour, j'utilise Application.OnTime sur le macro de copie.
Sur mon fichier ce code fonctionne.
Cependant, je souhaite l'appliquer à plusieurs fichiers du même type regroupés dans un onglet.
Le code ci-dessous me pose alors problème car le fichier ouvret est fermé (wb.close) trés rapidement, sans que le "ontime" n'aille jusqu'à la fin.
Idéalement, je voudrais bloquer la fermeture du fichier actif, tant que la mise à jour n'est pas finie. J'ai pensé à Sheet change et Thisworkbook.close False mais je ne connais pas trop.


Quelqu'un a-t-il une idée ?

Merci bcp
A+
Teter

Sub test()
Dim i As Integer, wb As Workbook
With Application.FileSearch
.NewSearch
.LookIn = "C:\..."
.SearchSubFolders = False
.Filename = "*.xls"
.Execute
For i = 1 To .FoundFiles.Count
'Open each workbook
Set wb = Workbooks.Open(Filename:=.FoundFiles(i))

'Perform the operation on the open workbook

Application.Run ("bloombergui.xla!RefreshData")
'tempspause est défini en fonction du nombre de données à mettre à jour
Application.OnTime tempspause, "Macro2"

'Save and close the workbook
wb.Save
wb.Close
'On to the next workbook
Next i
End With
End Sub


Sub Macro2()
Sheets("source").Select
Cells.Select
Selection.Copy
Sheets("dest").Select
Cells.Select
Selection.PasteSpecial Paste:=xlPasteValues
End Sub
 

teter

XLDnaute Junior
Re : temporiser fermeture

bonjour,

Je n'inspire pas grand monde mais je bloque complètement.
Pourtant je suis sur que ce n'est pas terrible.
Je viens auusi d'essayer sur un seul fichier un Workbook BeforeClose mais pareil, il ferme sans recalculer.
Merci d'avance.

A+

Teter
 

PMO2

XLDnaute Accro
Re : temporiser fermeture

Bonjour,

Faites un test avec le code suivant

Code:
Sub test()
Dim i As Integer, wb As Workbook
With Application.FileSearch
.NewSearch
.LookIn = "C:\..."
.SearchSubFolders = False
.Filename = "*.xls"
.Execute

For i = 1 To .FoundFiles.Count
'Open each workbook
Set wb = Workbooks.Open(Filename:=.FoundFiles(i))

'Perform the operation on the open workbook

Application.Run ("bloombergui.xla!RefreshData")
'tempspause est défini en fonction du nombre de données à mettre à jour

'########
DoEvents

'°°° si cela marche, essayez de faire un nouveau test en occultant cette ligne °°°
Application.Wait Now + TimeValue("00:00:10")  'suspend la macro pendant 10 secondes
'°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

Call Macro2
'########


'Save and close the workbook
wb.Save
wb.Close
'On to the next workbook
Next i
End With
End Sub


Sub Macro2()
Sheets("source").Select
Cells.Select
Selection.Copy
Sheets("dest").Select
Cells.Select
Selection.PasteSpecial Paste:=xlPasteValues
End Sub

Si cela fonctionne refaites un test en occultant la ligne de code suivante
Code:
Application.Wait Now + TimeValue("00:00:10")

Cordialement.

PMO
Patrick Morange
 

teter

XLDnaute Junior
Re : temporiser fermeture

Bonjour Patrick,

Merci de vous être penché sur mon problème.
Votre solution ne fonctionne pas car Wait stoppe l'application bloombergui.xla!RefreshData. Les données ne sont donc pas mises à jour avant la copie.

Pensez-vous qu'une boucle style do until ou do while puise fonctionner par exemple, ne pas fermer le fichier tant que bloombergui.xla!RefreshData is running ?

Je ne sais malheureusement pas comment traduire ce critère (bloombergui.xla!RefreshData is running).

Merci encore

Cordialement

Teter
 

PMO2

XLDnaute Accro
Re : temporiser fermeture

Bonjour,

Avez-vous essayé cette configuration ?

Code:
Sub test()
Dim i As Integer, wb As Workbook
With Application.FileSearch
.NewSearch
.LookIn = "C:\..."
.SearchSubFolders = False
.Filename = "*.xls"
.Execute

For i = 1 To .FoundFiles.Count
'Open each workbook
Set wb = Workbooks.Open(Filename:=.FoundFiles(i))

'Perform the operation on the open workbook

Application.Run ("bloombergui.xla!RefreshData")
'tempspause est défini en fonction du nombre de données à mettre à jour

'########
'--- Je ne sais pas où placer DoEvents aussi en mets-je un avant et un après ??? ---
DoEvents

Call Macro2

DoEvents
'########


'Save and close the workbook
wb.Save
wb.Close
'On to the next workbook
Next i
End With
End Sub

Ne disposant pas de la xla je ne peux malheureusement pas faire des tests en situation sur ma machine.

Cordialement.

PMO
Patrick Morange
 

mromain

XLDnaute Barbatruc
Re : temporiser fermeture

bonjour teter, PM02

si j'ai bien compris le PB : le Sub "bloombergui.xla!RefreshData" n'a pas le temps de s'exécuter.

ne pourrais-tu pas remplacer ton Sub "bloombergui.xla!RefreshData" par une Function du type :
Code:
Public Function RefreshData() as Boolean
RefreshData = False

'ta macro
'...
'...

RefreshData = True
End Function

et dans ton code, pour appeler la Function, tu écris
Code:
maVariable = Application.Run ("bloombergui.xla!RefreshData")
cela forcera surement la macro a attendre le retour de la Function, et daonc la fin de son exécution.

PS: je dis peut-être une énormité, si c'est le cas, excusez-moi, je n'utilise jamais le "Application.Run"...

a+
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Re : temporiser fermeture

Bonjour Teter, PMO2, Mromain, le forum

Utilises une boucle do loop sur doevents avec une variable publique déclenchée et remise à zéro avec ontime.

sur la pièce jointe, modifies une cellule, lances la macro message 15'' et fermes immédiatement le classeur
la fermeture sera différée aprés le ontime et sans oblitérer les enregistrements avant fermeture

Cordialement, @+
 

Pièces jointes

  • Classeur1.xls
    20 KB · Affichages: 69
  • Classeur1.xls
    20 KB · Affichages: 82
  • Classeur1.xls
    20 KB · Affichages: 81

teter

XLDnaute Junior
Re : temporiser fermeture

Bonjour,

Patrick, j'ai retesté sans succès,
MRomain, la xla est protégée, je n'ai donc pas le code,
Yeahou, ton code, adapté sur un de mes fichiers fonctionne. Mais quand je fais tourner la macro "générale", les instructions wb.save et wb.close sont lancées sans laisser tourner les maj, malgré le Workbook_BeforeClose et le Ontime.

Il me semble que le problème vient de là, comment temporiser ces 2 instructions ?

Merci d'avance

A+

Teter
 

PMO2

XLDnaute Accro
Re : temporiser fermeture

Bonjour,

A tout hasard je reviens avec une nouvelle approche.

1) créez un NOUVEAU module Standard et copiez y le code suivant

Code:
Sub Suspension(Duree As Long)
Dim Debut As Date
Dim Fin As Date
Dim CB As CommandBar
'--- Semble inutile mais est nécessaire pour rendre ---
'--- actifs les boutons des barres de commandes     ---
For Each CB In Application.CommandBars
  If CB.Visible Then
    If CB.Name <> "Worksheet Menu Bar" Then
      CB.Enabled = False
      CB.Enabled = True
    End If
  End If
Next CB
'------------------------------------------------------
Debut = Time
Fin = Debut + Duree / 86400
Call Rebours(Fin)

MsgBox "Terminé"  'pour le test (à virer par la suite)
  
End Sub

Sub Rebours(Fin As Date)
Dim Pause As Long
Dim Start As Date
On Error GoTo Erreur
Pause = 1
Start = Timer
Do While Timer < Start + Pause
  DoEvents
Loop
If Fin - Time <= 0 Then
  Error 65535
End If
Call Rebours(Fin) 'appel récursif
Exit Sub
'--- Pseudo traitement d'erreur ---
Erreur:
End Sub

2) dans votre code insérez l'instruction Call Suspension(12)
comme dans l'exemple ci-dessous (12 signifie un délai de 12 secondes, à adapter éventuellement)
Code:
Sub test()
Dim i As Integer, wb As Workbook
With Application.FileSearch
.NewSearch
.LookIn = "C:\..."
.SearchSubFolders = False
.Filename = "*.xls"
.Execute
For i = 1 To .FoundFiles.Count
'Open each workbook
Set wb = Workbooks.Open(Filename:=.FoundFiles(i))
'Perform the operation on the open workbook
Application.Run ("bloombergui.xla!RefreshData")

'### PMO l'argument est un Long qui indique le temps de pause en seconde ###
Call Suspension(12)
Call Macro2
'###########################################################################

'Save and close the workbook
wb.Save
wb.Close
'On to the next workbook
Next i
End With
End Sub


Sub Macro2()
Sheets("source").Select
Cells.Select
Selection.Copy
Sheets("dest").Select
Cells.Select
Selection.PasteSpecial Paste:=xlPasteValues
End Sub

3) priez très fortement votre Dieu pour que cela fonctionne

Cordialement.

PMO
Patrick Morange
 

teter

XLDnaute Junior
Re : temporiser fermeture

Bonjour Patrick, et les autres.

Après cet excellent week-end, retour à la dure réalité ...

Je vous remercie pour le temps que vous me consacrez, je viens de tester mais malgré mes incantations, le problème reste le même. Votre proposition revient à faire un Wait car elle stoppe la mise à jour.
En fait, dès qu'une instruction suit mon refresh, la macro passe à cette instruction, sans exécuter ou finir d'exécuter le refresh et même si je mets un point d'arrêt à cette 2° instruction.

Pensez-vous qu'il y ait moyen d'explorer les pistes suivantes :
- tant que la mise à jour est en cours (elle se fait sur une colonne), les cellules concernées contiennent du texte comme "#N/A Requesting data" puis un chiffre une fois que la maj est effectuée. Ne pourrait-on pas demander à ne pas fermer tant que le contenu d'au moins une des cellules non vides de cette colonne est non numériques ou le texte ci dessus ?
- durant la mise à jour, la barre d'état (je ne suis pas certain qu'elle se nomme ainsi, en bas de l'écran) indique "Recalcul: xx%" puis "Prêt" lorsque la maj est effectuée. N'y aurait-il pas moyen d'agir à ce niveau ?

Merci encore et d'avance.

Cordialement

Teter
 

keepcool183

XLDnaute Occasionnel
Re : temporiser fermeture

Bonjour Teter, Tous le monde,

Pour le recalcule vous pouvez toujours faire un "sendkeys F9" ou utiliser l'enregisteur de macro pour récupérer une ligne du style "application.calculate" (n'étant pas sur qu'elle sert à recalculer).

Bonne journée :)
 

mromain

XLDnaute Barbatruc
Re : temporiser fermeture

bonjour teter, le fil

toujours dans la même optique que mon post précédent :

tu crées une fonction du genre
Code:
Public Function MonRefreshData() as Boolean
MonRefreshData = False

Application.Run ("bloombergui.xla!RefreshData")

MonRefreshData = True
End Function
et dans ta macro, tu remplaces
Code:
Application.Run ("bloombergui.xla!RefreshData")
par
Code:
maVariable = MonRefreshData
à tester...

a+
 
Dernière édition:

auret

XLDnaute Nouveau
Re : temporiser fermeture

Bonjour,

Je reviens à ce topic puisque je rencontre le même problème avec des données récupérées sur Bloomberg.
Je n'ai pas bien saisi l'avant dernier message publié et j'aimerai savoir si une solution avait été trouvée.

Merci de votre aide.
 

Discussions similaires

Statistiques des forums

Discussions
312 490
Messages
2 088 882
Membres
103 981
dernier inscrit
vinsalcatraz