Problème Userform avec application.CalculateUntilAsyncQueriesDone bugg
Bonjour à tous,
Afin de saisir un budget pour ma société qui compte une dizaine de magasin, j'ai mis en place un userform afin d'alimenter une base de données.
Voici concrètement comment fonctionne le fichier :
J'ai récupérer toutes les données des magasins pour les 5 dernières années et je les ai ajoutés dans un Powerquery et ensuite je les ai mis dans PowerPivot. Dans PowerPivot j'ai créer les mesures afin d'avoir les notions de chiffre d'affaires YTD PY etc...
Des données PowerPivot, j'ai créer un TCD que j'ai transformer en valeur dans ce style
VALEURCUBE("ThisWorkbookDataModel";MEMBRECUBE("ThisWorkbookDataModel";"[Correspondance compte].[Groupe].&[CA Brut]");MEMBRECUBE("ThisWorkbookDataModel";"[CA SAP].[Année 2].&[2018]")Tout fonctionne bien dans le userform sauf que lorsqu'on change de magasin dans le combobox.
Les données de la formule se mette à jour selon le nom du magasin, le problème c'est que le chargement ne se fait pas lorsqu'une macro est activé.
J'avais tout essayer :
RefreshAll
application.wait
j'ai essayer de mettre à jour la query à jour par VBA.
Finalement la solution que j'ai trouvé sur internet était ce bout de code suivant :
application.CalculateUntilAsyncQueriesDoneCependant Excel crash 1 fois sur deux avec cette formule et du coup mon programme est inutilisable si l'utilisateur perds ces données à chaque crash s'il ne l'a pas enregistré.
Existe t'il de mettre à jour calculer différemment sans utiliser le
application.CalculateUntilAsyncQueriesDone?
Je n'ai vraiment rien trouvé sur internet pour résoudre cela
Je vous remercie d'avance
Salut !
Je veux bien essayer de t'aider mais je n'ai pas compris le problème. Si tu peux joindre le fichier cela facilitera la résolution du problème
Bonjour,
En effet, ce n'est pas simple d'analyser un code qui plante avec uniquement des bribes... il faudrait faire une gestion d'erreurs, avec par exemple, un :
On Error Resume Nextpour éviter le plantage. Dans ton cas, c'est souvent un problème de gestion de la mémoire, quand tu déclares un :
setMerci de ta réponse,
ça bug vraiment au moment ou il y a ce code
application.CalculateUntilAsyncQuerieDoneVoici mon code lorsque je change de magasin :
Private Sub CBlisteCP_AfterUpdate()
Me.MultiPage1.Value = 0
Dim a As Integer
Dim sumPY As Double
Dim sumF2 As Double
Dim sumYTD As Double
Dim sumBU As Double
Dim SUMBU2 As Double
Dim b As Integer
'''''''''''''''''''''''''''''''''''''''''''''''''''''''met à jour les centres de profits dans les différentes feuilles''''''''''''''''''''''''''''''''
SpinButton1.Value = 1
Feuil10.Range("B1").Formula = "=CUBEMEMBER(""ThisWorkbookDataModel"",""[BDD CP].[NOM].&[" & CBlisteCP.Value & "]"")"
Feuil11.Range("C11").Formula = "=CUBEMEMBER(""ThisWorkbookDataModel"",""[BDD CP].[NOM].&[" & CBlisteCP.Value & "]"")"
Feuil11.Range("C1").Formula = "=CUBEMEMBER(""ThisWorkbookDataModel"",""[BDD CP].[NOM].&[" & CBlisteCP.Value & "]"")"
Feuil1.Range("C6").Formula = "=CUBEMEMBER(""ThisWorkbookDataModel"",""[BDD CP].[NOM].&[" & CBlisteCP.Value & "]"")"
Application.CalculateUntilAsyncQueriesDone
TBtaux.Value = Feuil10.Range("N23").Value
For i = 1 To 4
For a = 1 To 6
''''''''''''''''''''''''''''''''''''''''''''''''CA YTD, ca previsionnel, PY FULL, Tendances''''''''''''''''''''''''''''''''''''''''''''''''
Me("TBF2C" & a & "l" & i).Value = Feuil10.Cells(40 + a, 5 + i).Value
Me("TBF2C" & a & "l" & i).Value = Format(Me("TBF2C" & a & "l" & i).Value, "# ##0")
Me("TBF2C" & a & "l4").Value = Feuil10.Cells(5 + a, 9).Value
Me("TBF2C" & a & "l4").Value = Format(Me("TBF2C" & a & "l4").Value, "0.00%")
Next a
Next i
For a = 1 To 6
'''''''''''''''''''''''''''''''''''''''''Budget supplémentaire planifié''''''''''''''''''''''''''''''''''''''''''''
Me("TBF2C" & a & "l5").Value = (Val(Me("TBF2C" & a & "l8").Value) / 100 + 1) * Val(Me("TBF2C" & a & "l2").Value)
Me("TBF2C" & a & "l5").Value = Format(Me("TBF2C" & a & "l5").Value, "# ##0")
Me("TBF2C" & a & "l9").Value = Val(Me("TBF2C" & a & "l5").Value)
Me("TBF2C" & a & "l9").Value = Format(Me("TBF2C" & a & "l9").Value, "# ##0")
sumYTD = sumYTD + Val(Me("TBF2C" & a & "l1").Value)
sumPY = sumPY + Val(Me("TBF2C" & a & "l3").Value)
sumBU = sumBU + Val(Me("TBF2C" & a & "L5").Value)
SUMBU2 = SUMBU2 + Val(Me("TBF2C" & a & "l9").Value)
Next a
TBF2C1L5.Value = Val(TBF2C1L5.Value) + Val(TBhomePLAN.Value)
TBF2C1L5.Value = Format(TBF2C1L5.Value, "# ### ##0")
sumBU = sumBU + Val(TBhomePLAN.Value)
For a = 1 To 6
'''''''''''''''''''''''''''''''''''''somme pour total YTD après F2 = YTD + PLANIFIé''''''''''''''''''''''''''''''''''''''''
Me("TBF2C" & a & "l6").Value = Val(Me("TBF2C" & a & "l1").Value) + Val(Me("TBF2C" & a & "l5").Value)
Me("TBF2C" & a & "L6").Value = Format(Me("TBF2C" & a & "L6").Value, "# ### ##0")
sumF2 = sumF2 + Val(Me("TBF2C" & a & "L6").Value)
Next a
TBF2C1L6.Value = Val(TBF2C1L6.Value) + Val(TBhomeTB.Value)
TBF2C1L6.Value = Format(TBF2C1L6.Value, "# ##0")
sumF2 = sumF2 + Val(TBhomeTB.Value)
For a = 1 To 6
'''''''''''''''''''''''''''''''''''''''''''''''''''Comparaison en % (F2 - PY )/ PY''''''''''''''''''''''''''''''''''''''''''
Me("TBF2C" & a & "l7").Value = (Val(Me("TBF2C" & a & "l6").Value) - Val(Me("TBF2C" & a & "l3").Value)) / CDbl(Replace(Replace(Me("TBF2C" & a & "l3").Value, ",", "."), "%", ""))
Me("TBF2C" & a & "l7").Value = Format(Me("TBF2C" & a & "l7").Value, "0.00%")
Next a
TotalYTD.Value = sumYTD
TBTotalCA.Value = sumBU
TBTotalCAHO.Value = SUMBU2
TotalPY.Value = sumPY
Totalf2YTD.Value = sumF2
TotalYTD.Value = Format(TotalYTD.Value, "# ### ##0")
TotalPY.Value = Format(TotalPY.Value, "# ### ##0")
Totalf2YTD.Value = Format(Totalf2YTD.Value, "# ### ##0")
TBTotalCA.Value = Format(TBTotalCA.Value, "# ### ##0")
TBTotalCAHO.Value = Format(TBTotalCAHO.Value, "# ### ##0")
Totalcomp.Value = (Val(Totalf2YTD.Value) - Val(TotalPY)) / TotalPY
Totalcomp.Value = Format(Totalcomp.Value, "0.00%")
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Call mychart 'Change le graphique après changement site
End SubDès que il doit charger les données c'est la que ça plante.
Des fois ça bugg pas des fois ça bug c'est totalement aléatoire.
Peut-être un problème de rafraîchissement de la connexion aux données
Faire précéder
Application.CalculateUntilAsyncQueriesDonepar
On Error Resume Next
ActiveWorkbook.Connections("ThisWorkbookDataModel").Refresh
Application.CalculateUntilAsyncQueriesDonePeut-être un problème de rafraîchissement de la connexion aux données
Faire précéder
Application.CalculateUntilAsyncQueriesDonepar
On Error Resume Next ActiveWorkbook.Connections("ThisWorkbookDataModel").Refresh Application.CalculateUntilAsyncQueriesDone
Merci pour ta réponse, j'ai essayer le code que tu m'as proposé. Le seul truc qui change c'est que le changement de magasin est dix fois plus long car la base de données est tout le temps mis à jour. Résultat ça plante toujours de manière aléatoire. La Excel a planté lorsque j'ai changé pour la 4ème fois de magasin.
Remplace :
ActiveWorkbook.Connections("ThisWorkbookDataModel").Refreshpar
DoEventsRemplace :
ActiveWorkbook.Connections("ThisWorkbookDataModel").Refreshpar
DoEvents
Do events ne change rien au problème, le problème persiste.
Ce qui est étonnant c'est que dans plusieurs forum anglais le problème de la formule [code]application.CalculateUntilAsyncQueriesDone [/code ]
qui fait crasher Excel est connu mais aucune solution n'est proposé.
J'ai trouvé ça :
'Wait for Refresh to finish before running vba
Application.CalculateUntilAsyncQueriesDone
If Not Application.CalculationState = xlDone Then
DoEvents
End IfVu que je n'ai trouvé aucune solution viable sur internet ainsi que pas d'aide dans le forum.
J'ai décider d'entièrement abandonné le fait de faire des userform avec des liaisons powerpivot afin que de ne pas avoir à utiliser la formule application.CalculateUntilAsyncQueriesDone.
C'est vraiment dommage car les cubes avec powerpivot marche vraiment bien