VBA màj liaison et TCD

Bonjour,

Help svp

j'ai une macro 1 dans un classeur A qui ouvre un classeur B et qui lance une macro 2 du classeur B qui a pour but de mettre à jour la liaison et les TCD du classeur B

Or la liaison est bien mise à jour mais les TCD ne bougent pas, en revanche si je reclique sur le bouton de la macro une deuxième fois, les TCD sont mis à jour, j'aimerais ne pas avoir à cliquer plusieurs fois pour que les TCD soient mis à jour:

Macro 1 classeur A:

Sub mettreàjour()
Workbooks.Open "C:\Users\************\Documents\CONTRÔLE DE GESTION\Brouillon\fichier secondaire.xlsm"
Application.Run "fichier secondaire.xlsm!module1.refresh"
End Sub

Macro 2 classeur B:

Sub refresh()
ActiveWorkbook.Connections("fichier principal").refresh
ActiveWorkbook.RefreshAll
End Sub

Je remercie par avance ceux qui voudront bien me sortir du pétrin

Cdlt

Bonjour

Plus simple. Vous mettez cette macro dans THISWORKBOOK de votre fichier B.

De cette sorte le TCD sera mis à jour à l'ouverture du fichier B

Private Sub Workbook_Open()
ThisWorkbook.RefreshAll
End Sub

Cordialement

Bonjour,

Juste une question, dans l'ordre il faut que la liaison soit faite car les tcd se basent sur la liaison.

Comment savoir si les tcd seront bien mis à jour après la liaison ?

Merci

re

En principe si vous avez fait une liaison entre deux classeurs devrait être active même sans macro. Le seul souci est que le TCD ne se met pas à jour via une liaison. Vous devriez faire un click droit dans le TCD puis choisir "actualiser les données". D'où l'intérêt d'une macro.

Avez-vous testé cette solution sans macro ?

Re,

Sans macro il se passe ce que je craignais, les TCD se mettent à jour avant que le tableau du classeur B n'ait été mis à jour par la liaison

Chronologiquement ce que j'essaie de faire :

1) tableau du classeur B se met à jour grâce à la liaison au classeur A

2) mettre à jour les TCD

3) Envoyer le fichier par mail (ça, ça marche bien)

Help

bonjour

salut Dan

normalement, s'il y a de réelles liaisons, Excel te demande s'il faut "mettre à jour", tu réponds oui et ça roule tout seul. Sans macro.

En fait, J'ai un classeur principal où je colle une base de données

j'ai ensuite 6 classeurs excel rattachés au classeur principal

une fois les 6 classeurs mis à jours liaison + TCD je dois les envoyer par mail à 6 personnes différentes

Pour le moment ce que j'arrive à faire c'est une macro dans le classeur principal qui ouvre les 6 classeurs et active les macro de ces classeurs (macro qui refresh all et macro qui envoie le fichier excel par mail)

Les liaisons sont mises à jour, les mails sont envoyés mais les TCD n'ont pas été mis à jour dans l'opération..

Si qq a une idée

Re

j'ai deux questions :

- Les 6 classeurs contiennent quoi comme feuille ? des feuilles de données liées au classeur principal et des feuilles avec les TCD ?

Si oui, les TCD se trouvent sur une ou des feuilles séparées des feuilles contenant les données liées au classeur principal ?

Il faudrait savoir comment est structuré un des 6 classeurs en fait

Cordialement

Re et encore merci pour ton aide,

Chacun des 6 classeurs a une liaison avec le classeur principal

Cette liaison crée une copie exacte de la base de données dans un tableau qui se situe dans un onglet de chacun des 6 classeurs

ensuite les tableaux croisés de chaque classeur utilisent les données du tableau qui se situe dans leur classeur.

Du coup la liaison marche bien et se met à jour toute seule quand on ouvre chacun des 6 classeurs, mais les TCD eux ne réagissent pas malgré les différents essais à base de Activeworkbook.refreshall

par contre si je sépare les étapes avec des macro séparées ( 1°ouvrir classeurs 2°refresh all) là ça fonctionne

Mais je trouve ça plus élégant d'avoir une seule macro qui arrive à gérer la séquence..

Encore merci

Re

Comme demandé avant, dans chaque classeur le TCD se trouve sur une feuille différente ou est sur la feuille contenant les données ?

Comment sont nommés les 6 classeurs B ?

Classeur B : Quel est le nom de la feuille contenant le TCD et le nom de la feuille contenant les données

Eventuellement possible de voir les fichiers A et B.

Vous pouvez aussi essayer en mettant ce code dans la feuille des classeur B contenant les données liées au classeur A. Le code mettra à jour le TCD du classeur B dès que la feuille sera actualisée

Private Sub Worksheet_Calculate()
ThisWorkbook.RefreshAll
End Sub

Cordialement

Bonjour,

Une piste à explorer ?

Cdlt.

Public Sub Update_Data()
Dim ws As Worksheet, pt As PivotTable
    Workbooks.Open "c:\...\...\xxx.xlsm", UpdateLinks:=0
    For Each ws In ActiveWorkbook.Worksheets
        For Each pt In ws.PivotTables
            pt.PivotCache.EnableRefresh = False
        Next pt
    Next ws
    ActiveWorkbook.Connections("yyy").Refresh
    For Each ws In ActiveWorkbook.Worksheets
        For Each pt In ws.PivotTables
            With pt.PivotCache
                .EnableRefresh = True
                .Refresh
            End With
        Next pt
    Next ws
End Sub

Bonjour Jean-Eric,

la mise à jour des TCD ne semble toujours pas fonctionner

je joins 2 fichiers d'exemple où j'ai appliqué votre macro

Merci par avance

Re,

Dans le fichier secondaire.xlsm, dans les propriétés de ta connexion, décoche 'Activer l'actualisation en arrière plan.

Enregistre et quitte le fichier.

Dans le classeur principal.xlsm, copie cette procédure.

A te relire.

Cdlt.

Public Sub Update_Data5()
Dim wb As Workbook
    Set wb = Workbooks.Open("C:\Users\Jean-Eric\Downloads\fichier secondaire.xlsm")
    wb.RefreshAll
    Application.CalculateUntilAsyncQueriesDone
End Sub

Jean-Eric,

félicitations cela fonctionne très bien apparemment

Maintenant je vais essayer d'ajouter à la procédure l'envoi par mail automatique et aussi faire de même pour les 6 classeurs excel..

Encore merci et bravo

Re

Eh ben voilà je m'y attendais ! On attend le dernier moment pour placer une réponse. Sympa Jean Eric.

Crdlt

Rechercher des sujets similaires à "vba maj liaison tcd"