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 SubBonjour 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 = TrueA+
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