Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/12/2011, 15h50   #1
Membre habitué
 
Inscription : mai 2007
Messages : 314
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 314
Points : 106
Points : 106
Par défaut executer code vba apres le calcul automatique des fomules

Bonjour,

j'ai un userform dans laquelle j'affiche et j'actualise un graphe par code vba et ce graphe est lié a une série de cellules dans lesquelles il y a des formules
le problème est que des-fois le graphe s'affiche avant que les formules ne soient actualisées (calcule automatique des formules) donc le graphe affiche les anciennes données avant le calcul
y a t-il le moyen de démarrer l’exécution du code vba après le calcul automatique des formules ?

Merci pour votre aide
LaPanic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 16h42   #2
Membre régulier
 
Inscription : janvier 2003
Messages : 254
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 254
Points : 76
Points : 76
Bonjour,
Je te propose avant de lancer ton affichage de vérifier que les formules se soient executés.
Si une des formules affiche une valeur à la fin des process de calcul automatique, tu peux t'en servir comme condition.
Sinon tu peux créer ta propre formule dans un module.
Code :
1
2
3
4
5
function Verif() as int
application.volatile
activesheet.range("TestFin")=1
' TestFin est une cellule nommée
end function
tu mets "=Verif" dans une cellule en bas à droite de ton fichier.
(en plus tu pourrais vérifier que les autres fonctions sont passées avant
que Verif s'execute)
Et dans ton code de graphe du vérfie la valeur de la cellule nommée "TestFin"..
Voila.
Ca devrait le faire.
comme de bien entendu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2011, 17h03   #3
Membre habitué
 
Inscription : mai 2007
Messages : 314
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 314
Points : 106
Points : 106
Merci pour ta réponse,
je trouve l’idée inintéressante mais je n'arrive pas a utiliser la fonction et quand je fais des changements et j'actualise les formules rien ne se passe et la fonction '=verif' renvoi #NOM?
merci pour votre aide
LaPanic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2011, 21h47   #4
Membre régulier
 
Inscription : janvier 2003
Messages : 254
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 254
Points : 76
Points : 76
Bonjour,

J'ai oublié de faire une fonction correcte, qui doit renvoyer une valeur
Voilà la correction
Code :
1
2
3
4
5
6
7
8
Function verif() As Integer
Application.Volatile
If ActiveSheet.Range("Verif") = 1 Then
    verif = 1
Else
    verif = 0
End If
End Function
Verif est bien sûr une cellule nommée, que tu peux placer ou tu veux.
verif() étant une fonction que tu dois glisser dans un module de code.
(insertion->Module dans VBE)

Voilà bonne semaine.
comme de bien entendu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 15h24   #5
Membre habitué
 
Inscription : mai 2007
Messages : 314
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 314
Points : 106
Points : 106
merci
ça ne marche pas ou bien je n'arrive pas a afficher le graphe après l'actualisation des formules
est ce que je peux faire quelque chose avec Worksheet_Calculate ??
merci pour votre aide
LaPanic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 15h53   #6
Membre régulier
 
Inscription : janvier 2003
Messages : 254
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 254
Points : 76
Points : 76
Bonjour,
Est ce que tu as bien posé une condition dans ton graphe
qui implique la création du graphe une fois qu'une formule
a rendu son résultat ?
Le Worksheet.calculate peut effectivement forcer le calcul.
On peut aussi mettre application.calculation=xlCalculationAutomatic
au démarrage de ton code.
En souhaitant que cela marche. Sinon soumet nous le code de ton graphe
pour voir comment l'activer en fonction d'un résultat extérieur.
Bye.
comme de bien entendu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 16h16   #7
Membre habitué
 
Inscription : mai 2007
Messages : 314
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 314
Points : 106
Points : 106
slt
au fait le graph a actualiser est sur un userform et que j'actualise a partir d'une liste déroulante
la fonction 'Verif' est dans lacellule
Code :
Sheets("calculation").Range("G1")
et pointe dans la cellule
Code :
Sheets("calculation").Range("H1")
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub ComboBox3_Change()
 
Sheets("calculation").Range("H1").Value = 0
Sheets("calculation").Range("F1") = ComboBox3.ListIndex
 
 
Sheets("calculation").Range("H1").Value = 1
 
        Do Until Sheets("calculation").Range("G1").Value = 1
 
       Loop
 
listbox1_Update
 
littleChart
End Sub
et listbox1_Update
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
Public Sub listbox1_Update()
 
Dim X As Integer, i As Integer, j As Integer
Dim Tableau(13), Plage(13)
 
If ComboBox1.Value = "Column 3D" Then
 
    For i = Cht.SeriesCollection.Count To 1 Step -1
        Cht.SeriesCollection.Delete i - 1
    Next i
    For i = 2 To 13
        Tableau(i) = Sheets("calculation").Cells(2, 2 + i)
    Next i
    With Cht
    .HasLegend = True
    .Legend.Position = chLegendPositionBottom
    End With
For j = 0 To ListBox1.ListCount - 1
    If ListBox1.Selected(j) = True Then
        If Cht.SeriesCollection.Count > 0 Then Cht.SeriesCollection.Add
        For i = 2 To 13
            Plage(i) = Sheets("calculation").Cells(j + 3, 2 + i)
        Next i
        With Cht
            .SetData C.chDimCategories, C.chDataLiteral, Tableau
            .SeriesCollection(X).Caption = Sheets("calculation").Cells(j + 3, 1)
            .SeriesCollection(X).SetData C.chDimValues, C.chDataLiteral, Plage
'            .SeriesCollection(x).Interior.Color = 50000 * (j + 1)
            .SeriesCollection(X).Interior.Color = 90000 * (j + 3)
            .SeriesCollection(X).Line.Color = 90000 * (j + 3)
 
        End With
        X = X + 1
        Erase Plage
      End If
Next j
 
 Else
    For i = Cht.SeriesCollection.Count To 1 Step -1
        Cht.SeriesCollection.Delete i - 1
    Next i
    For i = 1 To 13
        Tableau(i) = Sheets("calculation").Cells(2, 2 + i)
    Next i
    With Cht
    .HasLegend = True
    .Legend.Position = chLegendPositionBottom
    End With
For j = 0 To ListBox1.ListCount - 1
    If ListBox1.Selected(j) = True Then
        If Cht.SeriesCollection.Count > 0 Then Cht.SeriesCollection.Add
        For i = 1 To 13
            Plage(i) = Sheets("calculation").Cells(j + 3, 2 + i)
        Next i
        With Cht
            .SetData C.chDimCategories, C.chDataLiteral, Tableau
            .SeriesCollection(X).Caption = Sheets("calculation").Cells(j + 3, 1)
            .SeriesCollection(X).SetData C.chDimValues, C.chDataLiteral, Plage
'            .SeriesCollection(x).Interior.Color = 50000 * (j + 1)
            .SeriesCollection(X).Interior.Color = 90000 * (j + 3)
            .SeriesCollection(X).Line.Color = 90000 * (j + 3)
 
        End With
        X = X + 1
        Erase Plage
      End If
Next j
End If
 
End Sub
et littlechart
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
Sub littleChart()
Dim X As Integer, i As Integer
Dim Tableau(3)
 
If ComboBox3.Value = "Year to date" Then
 
 
    For i = Chh.SeriesCollection.Count To 1 Step -1
        Chh.SeriesCollection.Delete i - 1
    Next i
    For i = 1 To 3
        Tableau(i) = Sheets("calculation").Cells(18, i)
    Next i
 
        For i = 1 To 3
            Plage(i) = Sheets("calculation").Cells(19, i)
        Next i
        With Chh
            .HasTitle = True
            .Title.Caption = "Year to date till " & Sheets("calculation").Range("C20")
            .SetData D.chDimCategories, D.chDataLiteral, Tableau
            .SeriesCollection(X).SetData D.chDimValues, D.chDataLiteral, Plage
            .SeriesCollection(X).Interior.Color = 590000 * (i + 3)
            '.SeriesCollection(X).
            '.Axes(xlValue).TickLabels.NumberFormat = "0.0%"
        End With
'ChartSpace2.Charts(1).Axes(xlValue).TickLabelUnitType
 
        X = X + 1
    Erase Plage
 
Else
 
    For i = Chh.SeriesCollection.Count To 1 Step -1
        Chh.SeriesCollection.Delete i - 1
    Next i
    For i = 1 To 2
        Tableau(i) = Sheets("calculation").Cells(18, i)
    Next i
 
        For i = 1 To 2
            Plage(i) = Sheets("calculation").Cells(20, i)
        Next i
        With Chh
            .HasTitle = True
            .SetData D.chDimCategories, D.chDataLiteral, Tableau
            .SeriesCollection(X).SetData D.chDimValues, D.chDataLiteral, Plage
            .SeriesCollection(X).Interior.Color = 590000 * (i + 3)
            .Title.Caption = Sheets("calculation").Range("C20")
 
 
        End With
 
        X = X + 1
    Erase Plage
 
 
End If
 
End Sub
Merci pour votre aide
LaPanic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 16h46   #8
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Et si tu fais tout simplement
Avant de tracer ton graph ?
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 17h05   #9
Membre habitué
 
Inscription : mai 2007
Messages : 314
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 314
Points : 106
Points : 106
merci ZebreLoup
non ca ne régle pas le problème des fois le calcul des formules est rapide donc lors de l'affichage du graphe il prend les bonnes données mais des fois le calcule prend un peut plus de temps je ne sais pas pourquoi ??? le graphe prend les données avant actualisation
donc lors de l’exécution de
le code continu et affiche le graphe en même temps que l'actualisation des formules d'ou le probleme

merci pour votre aide !!
LaPanic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 17h23   #10
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Je vais regarder de plus près car il me semblait que ça attendait la fin du recalcul avant de continuer. Tu es bien en mode calcul manuel ?
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 17h31   #11
Membre régulier
 
Inscription : janvier 2003
Messages : 254
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 254
Points : 76
Points : 76
As tu essayé en mode debug pour voir comment il se comportait ?
Je n'avais pas compris que tu voulais qu'il y ait une mise à jour en direct
de ton UserForm qui restait ouvert.
Le application.calculate est une bonne idée.
Tu pourrais faire dans le code du UserForm

Code :
1
2
3
4
while maValeurTest<>1
' mise à jour des valeurs des fonctions de la feuille
application.calculate 
wend
Dis nous si c'est ok.
comme de bien entendu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 17h42   #12
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Je viens de vérifier chez moi, si tu es en mode calcul manuel, le code VBA attend bien la fin du calcul lancé par Application.Calculate pour continuer à s'exécuter. Tu lances bien le calcul au bon moment ? (Après avoir modifier toutes les valeurs dont dépendent les calculs).

@comme de bien entendu : Je ne comprends pas bien ce que tu proposes. Tester une valeur pour savoir si le calcul est terminé pourrait être une solution mais il faudrait savoir à l'avance le résultat qu'on attend dans la cellule et être sûr que ce soit la dernière valeur calculée. Ca doit être faisable mais je ne pense pas que ce soit nécessaire, c'est un peu l'artillerie lourde.
Et en tout cas boucler sur un Application.Calculate au mieux ne marchera pas ou bloquera l'application, au pire fera planter Excel. Il faut d'abord lancer le calcul et ensuite boucler pour attendre le résultat. Même si une fois encore je ne pense pas que ce soit nécessaire.

@LaPanic : Tu as l'air d'utiliser pleins de variables globales. Peut-être qu'un code complet ou un fichier exemple pourra nous aider à mieux cerner le problème.
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h14.


 
 
 
 
Partenaires

Hébergement Web