VBA : Extraction tableau issu d'un TCD sur une source externe (Cube)

Bonjour à tous,

Je suis encore débutant sur VBA et je rencontre un problème que je n'avais jamais rencontré,

Pour contextualiser mon problème, je dispose d'un fichier Excel sur lequel j'ai un TCD connecté à une source externe (cube).
Je vous fournis uniquement la partie qui me pose problème car tout le reste fonctionne, ma macro devrait effectuer les actions suivantes:
- Actualisation du TCD
- Double clic sur la cellule A5 (Pour obtenir dans une feuille le tableau qui m’intéresse)
- Tri ma colonne O par ordre croissant

Le problème que je rencontre est le suivant : Une feuille est bien créée mais le tableau issu de mon TCD ne s'affiche qu'une fois que la macro à fini de s’exécuter (concrètement ici il trie la colonne O d'une feuille qui ne contient aucune information), en m'aidant de chat GPT, j'ai utiliser une fonction permettant de mettre un temps d'attente pour laisser mon tableau charger mais cela ne change rien...

J'ai également essayé de découper ma macro en 2, en faisant d'abord ce chargement du tableau puis réaliser toutes les autres actions par la fonction "call" mais rien non plus 😕

Je suis sur que cela vient du fait que le TCD est connecté à une source externe, car en essayant par un TCD sur une plage de donnée de mon excel le tableau apparait et les actions sont bien effectuée.

Auriez-vous une idée pour contourner ce problème ?

En vous remerciant d'avance pour toute l'aide que vous pourrez m'apporter

Code :

Sub MAJ_PROD_TCD()
    '

    '
    Dim ws As Worksheet
    Dim detailSheet As Worksheet
    Dim lastRow As Long

    ' Actualiser le TCD et afficher les détails
    Range("A5").Select
    ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotCache.Refresh
    DoEvents ' Laisser Excel traiter d'autres événements
    Range("A5").Select
    Selection.ShowDetail = True
    Application.Wait (Now + TimeValue("00:00:25")) ' Attendre 25 secondes pour assurer le chargement complet du TCD

    Range("C2").Select

    ' Désactiver les fonctionnalités pour améliorer les performances
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual

    On Error GoTo Cleanup ' Assurer la réactivation des fonctionnalités en cas d'erreur

Range("O3").Select
    Selection.AutoFilter
    ActiveWorkbook.Worksheets("Feuil1 (3)").AutoFilter.Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Feuil1 (3)").AutoFilter.Sort.SortFields.Add2 Key:= _
        Range("O3:O21785"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption _
        :=xlSortTextAsNumbers
    With ActiveWorkbook.Worksheets("Feuil1 (3)").AutoFilter.Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

Cleanup:
    ' Réactiver les fonctionnalités
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.Calculation = xlCalculationAutomatic

End Sub

Bonjour SUD beginer,

Je pense que c’est la ligne Application.EnableEvents = False qui te pose problème. Essaye de la mettre en commentaire (en ajoutant ' devant).

Bonjour Valky68,

Merci pour votre retour, j'ai mis apostrophe devant la ligne comme indiqué (j'ai essayé de la passer en "True" également) mais la requête se charge toujours une fois que la macro à terminé son exécution

Je l'ai aussi lancé en supprimant toutes les lignes concernant la désactivation des fonctionnalités mais toujours sans résultat.

Merci tout de même pour votre aide !

Bonjour SUD beginer

Perso je ferais plutôt un truc du style

With Worksheets("LaFeuilleContenantlLaRequête")
    Do While .QueryTables(1).Refreshing Or .QueryTables(2).Refreshing
    Loop
End With
' Actualiser le TCD et afficher les détails
DoEvents ' Laisser Excel traiter d'autres événements
ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotCache.Refresh
Range("A5").ShowDetail = True

A+

Bonjour,
J'avais également essayé votre méthode mais sans résultat, la solution était d'utiliser l’événement (Workbook_SheetChange) dans la partie "ThisWorbook" et de rédiger le reste de la macro là bas et non dans un module (J'avoue que je ne saurais expliquer pourquoi)

Voici le code que j'ai utilisé pour pouvoir ensuite réaliser mes modifications sur le tableau issu du TCD:

Dim ws_tcd As New Excel.Worksheet

Public Sub click_btn()

Dim ws As New Excel.Worksheet
Dim range_ligne_find As Range
Dim find_ligne As Long

ThisWorkbook.Worksheets("Feuil1").Range("A7").Value = ""

'rafraichir TCD
Set ws = ThisWorkbook.Worksheets("TCD")
ws.PivotTables("TCD_Cube").PivotCache.Refresh



Set range_ligne_find = ws.Columns(1).Cells.Find(What:=Format(ThisWorkbook.Worksheets("Feuil1").Range("B4").Value, "dd/mm/yy"), lookat:=xlWhole)

If range_ligne_find Is Nothing Then
find_ligne = 0
MsgBox "Cette date est introuvable ! ", vbExclamation + vbOKOnly, "Attention"
Else
find_ligne = range_ligne_find.Row
ws.Range("B" & find_ligne).ShowDetail = True
End If

End Sub

'Permet de vérifier que le tableau à complètement finis de charger
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

If Sh.Range("A3").Value = "[$Agence].[Nom Agence]" Then
Application.DisplayAlerts = False

Rechercher des sujets similaires à "vba extraction tableau issu tcd source externe cube"