Mise à jour TCD, pause, puis reprise macro
Bonjour et merci d'avance
voici ma macro qui devrait actualiser des TCD dans différentes feuilles. Mais je mets une pause suffisante pour la MAJ de TCD.
Mais j'ai un message à la 2ème MAJ
Sheets("MENU").Select
Application.EnableEvents = False
Sheets("W").PivotTables("SUIVI OPERATEUR").RefreshTable
Application.Wait (Now + TimeValue("00:00:30"))
Application.EnableEvents = True
Application.EnableEvents = False
Sheets("X").PivotTables("SUIVI OPERATEUR").RefreshTable ''''ICI'''' <================
Application.Wait (Now + TimeValue("00:00:30"))
Application.EnableEvents = True
Application.EnableEvents = False
Sheets("Y").PivotTables("SUIVI OPERATEUR").RefreshTable
Application.Wait (Now + TimeValue("00:00:30"))
Application.EnableEvents = True
Application.EnableEvents = False
Sheets("Z").PivotTables("SUIVI OPERATEUR").RefreshTable
Application.EnableEvents = True
J'ai l'impression que Excel suspend les MAJ TCD le temps de la pause.
Quand je clique Débogage et que je force la macro, c'est au 3ème TCD que j'ai de nouveau le message et idem au 4ème.
J'ai aussi sans :
Application.EnableEvents = True
Application.EnableEvents = FalseMerci d'avance pour votre aide.
J'ai supprimer les lignes la feuille X à Z comme suit :
Sheets("MENU").Select
Application.EnableEvents = False
Sheets("W").PivotTables("SUIVI OPERATEUR").RefreshTable
Application.Wait (Now + TimeValue("00:00:30"))car les 3 derniers TCD étaient construits par un copier coller de la feuille X. Donc ça devait créer un conflit.
Bonjour,
Ce ne serait pas PivotCache.Refresh à la place de pivottable.refresh ?
ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotCache.RefreshBonjour Xmenpl,
merci pour ta réponse.
En fait tu peux utiliser cette fonction quand tu veux "à distance" mettre à jour un TCD dans une autre feuille "W" par exemple.
Sheets("W").PivotTables("SUIVI OPERATEUR").RefreshTableCeci dit je pensais avoir trouvé mais non. Mon TDC est lié à une requête connexion. Les données ne se mettent à jour que lorsque ma macro est terminée. La pause dans la macro n'a aucun effet... Je reste toujours bloqué.
même une routine de sauvegarde de classeur après mise à jour, ça ne fonctionne pas.... Je garde toujours mes données non à jour. Si je stoppe ma macro alors seulement les données se mettent à jour....
Dim cellule As Range
Set cellule = Range("A1")
If Range("A1").Value = 0 Then
'Sheets("MECANIQUE").PivotTables("SUIVI OPERATEUR").RefreshTable
On Error Resume Next
ThisWorkbook.RefreshAll
Application.Wait (Now + TimeValue("00:00:20"))
cellule.Value = 1
Workbooks("POURC_HEURES_VENTILEES").Close True
Else
Sheets("MENU").SelectAs tu essayé l'enregistreur de macro pour voir les lignes de codes qu'Excel créé lors de l'acutalisation du tcd ?
Oui quand je fais clic droit sur le TCD et actualiser, dans l'enregistreur il ne me prend rien... aucune fonction...
Bonjour à tous,
avec Application.Wait, excel ne fait qu'attendre sans pouvoir faire rien d'autre.
Une tentative faite en aveugle faute de pouvoir tester, peut être des ajustement à faire :
Dim majTerminee As Boolean
Sub test()
majTerminee = False
Sheets("MENU").Select
Sheets("W").PivotTables("SUIVI OPERATEUR").RefreshTable
differe "X", "SUIVI OPERATEUR", TimeValue("00:00:30")
differe "Y", "SUIVI OPERATEUR", TimeValue("00:01:00")
differe "Z", "SUIVI OPERATEUR", TimeValue("00:01:30")
' si besoin attente du dernier, à tester après. Possible que ça bloque ce qui précède
' differe "zzz", "", TimeValue("00:02:00") ' "zzz" : feuille fictive
' Do
' DoEvents
' Loop Until majTerminee
End Sub
Sub differe(feuille As String, pt As String, h As Date)
If feuille = "zzz" Then
Application.OnTime Now + h, "termine"
Else
Application.OnTime Now + h, "'majTable ' & feuille &"", "" & pt'"
End If
End Sub
Sub majTable(feuille As String, pt As String, h As Date)
Sheets(feuille).PivotTables(pt).RefreshTable
End Sub
Sub termine()
majTerminee = True
End Suberic
Merci ERiiiC pour ton aide,
J'ai tester à l'ouverture de mon classeur, comme-ci, mais ça ne met pas à jour mes feuilles...
Private Sub Workbook_Open()
Dim majTerminee As Boolean
majTerminee = False
Sheets("MENU").Select
Sheets("W").PivotTables("SUIVI OPERATEUR").RefreshTable
differe "X", "SUIVI OPERATEUR", TimeValue("00:00:30")
differe "Y", "SUIVI OPERATEUR", TimeValue("00:01:00")
differe "Z", "SUIVI OPERATEUR", TimeValue("00:01:30")
' si besoin attente du dernier, à tester après. Possible que ça bloque ce qui précède
' differe "zzz", "", TimeValue("00:02:00") ' "zzz" : feuille fictive
' Do
' DoEvents
' Loop Until majTerminee
' Je continue ensuite avec des macros activate dans les feuilles suivantes
Sheets("W").Select
Sheets("X").Select
Sheets("Y").Select
Sheets("Z").Select
Sheets("MENU").Select
Workbooks("POURC_HEURES_VENTILEES").Close True
End Sub
Sub differe(feuille As String, pt As String, h As Date)
If feuille = "zzz" Then
Application.OnTime Now + h, "termine"
Else
Application.OnTime Now + h, "'majTable ' & feuille &"", "" & pt'"
End If
End Sub
Sub majTable(feuille As String, pt As String, h As Date)
Sheets(feuille).PivotTables(pt).RefreshTable
End Sub
Sub termine()
majTerminee = True
End SubTant qu'on est dans la boucle de la macro, la mise à jour semble impossible. Tous les "petits" TCD eux se mettent à jour et celui-ci "SUIVI OPERATEUR" relié directement à une requête connexion ne veut pas se mettre à jour en période de macro. A ne rien y comprendre...
Supprime les lignes que tu as ajouté pour tester correctement.
Et si ça fonctionne (tes TCD actualisés après 2min) tu actives le 'differe "zzz" et le do loop et tu retestes. Si toujours ok tu pourras ajouter tes autres lignes après.
eric
Merci Eriiic,
J'ai fait comme tu m'as dit
Private Sub Workbook_Open()
Dim majTerminee As Boolean
majTerminee = False
' Sheets("MENU").Select
Sheets("W").PivotTables("SUIVI OPERATEUR").RefreshTable
differe "X", "SUIVI OPERATEUR", TimeValue("00:00:30")
differe "Y", "SUIVI OPERATEUR", TimeValue("00:01:00")
differe "Z", "SUIVI OPERATEUR", TimeValue("00:01:30")
' si besoin attente du dernier, à tester après. Possible que ça bloque ce qui précède
differe "zzz", "", TimeValue("00:02:00") ' "zzz" : feuille fictive
Do
DoEvents
Loop Until majTerminee
' Sheets("W").Select
' Sheets("X").Select
' Sheets("Y").Select
' Sheets("Z").Select
' Sheets("MENU").Select
'Workbooks("POURC_HEURES_VENTILEES").Close True
End Sub
Sub differe(feuille As String, pt As String, h As Date)
If feuille = "zzz" Then
Application.OnTime Now + h, "termine"
Else
Application.OnTime Now + h, "'majTable ' & feuille &"", "" & pt'"
End If
End Sub
Sub majTable(feuille As String, pt As String, h As Date)
Sheets(feuille).PivotTables(pt).RefreshTable
End Sub
Sub termine()
majTerminee = True
End SubEt voici les résultats
OK x 3
Cette dernière capture est toujours visible au bout de 6 min et mes pages W, X, Y, Z ne sont pas mises à jour.
Bonjour,
non, pas comme je t'ai dit.
A chaque fois je te disais de tester en laissant
' differe "zzz", "", TimeValue("00:02:00") ' "zzz" : feuille fictive
' Do
' DoEvents
' Loop Until majTermineeen commentaire et de refaire un test en les activant que si le 1er test était ok
En précisant que cette partie pouvait bloquer le début.
Es-tu sûr que 30s soit suffisant ? Il faut que tu sois sûr à 100% que la précédente est finie avant de lancer la suivante
Et pourquoi masquer une partie du message ?
Sinon que donne :
Private Sub majTCD
ThisWorkbook.RefreshAll
End SubTu pourrais séparer les opérations et lancer manuellement la suite après la mise à jour totale.
On est tout près de la solution ! Merci à toi Eriiic pour ta contribution.
Le masquage est juste le chemin du fichier qui me semblait sans intérêt à partager !
Voici la dernière mouture :
Private Sub Workbook_Open()
Dim majTerminee As Boolean
majTerminee = False
Sheets("MENU").Select
Sheets("W").PivotTables("SUIVI OPERATEUR").RefreshTable
differe "X", "SUIVI OPERATEUR", TimeValue("00:01:00")
differe "Y", "SUIVI OPERATEUR", TimeValue("00:02:00")
differe "Z", "SUIVI OPERATEUR", TimeValue("00:03:00")
' si besoin attente du dernier, à tester après. Possible que ça bloque ce qui précède
' differe "zzz", "", TimeValue("00:02:00") ' "zzz" : feuille fictive
' Do
' DoEvents
' Loop Until majTerminee
End Sub
Sub differe(feuille As String, pt As String, h As Date)
If feuille = "zzz" Then
Application.OnTime Now + h, "termine"
Else
Application.OnTime Now + h, "'majTable ' & feuille &"", "" & pt'"
End If
End Sub
Sub majTable(feuille As String, pt As String, h As Date)
Sheets(feuille).PivotTables(pt).RefreshTable
End Sub
Sub termine()
majTerminee = True
End Sub
Private Sub majTCD()
ThisWorkbook.RefreshAll
End SubSi je me ballade dans les feuilles W,X,Y,Z j'ai bien les mises à jour.
Mais au terme d'1 mn j'ai toujours ce message qui apparaît 3 x à intervalle d'1 mn.
majTCD() était à tester indépendamment du reste, en solution de secours. En l'appelant manuellement depuis un bouton par exemple (enlever le Private)
Teste avec seulement ça dans ThisWorkbook :
Private Sub Workbook_Open()
ThisWorkbook.RefreshAll
End SubPar ailleurs Private Sub Worksheet_Change n'a rien à faire dans ThisWorkbook, c'est l'événement feuille.
Dans ThisWorkbook il devient Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Il faut te servir des listes déroulantes en haut pour choisir un événement, il se déclarera tout seul correctement.
Si le test au-dessus a été concluant on laisse tomber la suite devenue inutile...
Si je me ballade dans les feuilles W,X,Y,Z j'ai bien les mises à jour.et ceci 10 s après l'ouverture du fichier !
Mais au terme d'1 mn j'ai toujours ce message qui apparaît 3 x à intervalle d'1 mn.
Ceci laisse plutôt penser que la maj se fait toute seule à l'ouverture et non par les macros?!?
Tu devrais retenter sans macro.
Ceci dit les 3 messages d'erreur restent anormaux.
Mets les sub differe(), majTable() et termine() dans un module Standard
eric
En testant ceci
Private Sub Workbook_Open()
ActiveWorkbook.RefreshAll
DoEvents
'Application.Wait (Now + TimeValue("00:01:00"))
ActiveWorkbook.Save
Application.Quit
End SubJ'ai çà qu'Excel ne sait pas gérer... à la ligne
ActiveWorkbook.Save
Ca semblerait si simple avec une pause qui n'affecte pas une MAJ complète...
Pffff, tu ne dis même pas si .RefreshAll a fonctionné correctement...
Et bien diffère la fermeture selon le même principe pour laisser excel travailler tranquille :
Private Sub Workbook_Open()
ThisWorkbook.RefreshAll
Application.OnTime Now + TimeValue("00:02:00"), "fermer"
End Sub
Sub fermer()
ThisWorkbook.Save
Application.Quit
End SubJ'ai mis ta fermeture telle que tu l'as faite.
J'ai quand même remplacé ActiveWorkbook par ThisWorkbook. Ca serait bien que tu prennes le temps d'apprendre les rudiments avant de te lancer dans VBA.
Je n'aime pas trop les suicides commandés tels que Application.Quit. Là tu fermes tout excel même si l'utilisateur travaillait sur d'autres fichiers.
Si pb avec fermer() démarre un nouveau topic avec un titre en adéquation.
eric
Eriiic,
J'ai essayé
ThisWorkbook.RefreshAllMais ça ne marche pas. J'ai dû utiliser
ActiveWorkbook.RefreshAllLa conclusion que j'ai faite, résume bien la grosse lacune d'excel. Tu m'as apporté une aide précieuse pour en arriver à cette conclusion. Bien sûr que cette sortie est un suicide ! Mais c'est en apprenant qu'on s'améliore et ce "suicide" était calculé car il n'y a que moi qui me sers de fichier.
Tant que je fais des étapes simples comme actualiser un TCD, ça fonctionne. Mais si j'enchaîne dans le même code une suite, c'est en sortant de celle-ci que ça se met à jour. Et c'est juste pas possible. Je voulais mettre en place une planification du fichier ➕ MAJ TCD ➕ envoi par mail les feuilles W, X, Y, Z. (les 2 dernières étapes dans le même code). Le fichier devait s'exécuter en mon absence.... Mais pour l'instant ça n'est pas possible car Excel semble ne pas gérer mon besoin.
Finalement j'ai trouvé !
Comment Fermer un classeur après un délai d'inactivité Excel vba - YouTube (google.fr)
Avec, au lieu de fermer, j'exécute mon code.