IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

executer code vba apres le calcul automatique des fomules


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 335
    Points : 148
    Points
    148
    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

  2. #2
    Membre actif
    Inscrit en
    Janvier 2003
    Messages
    604
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 604
    Points : 247
    Points
    247
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 335
    Points : 148
    Points
    148
    Par défaut
    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

  4. #4
    Membre actif
    Inscrit en
    Janvier 2003
    Messages
    604
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 604
    Points : 247
    Points
    247
    Par défaut
    Bonjour,

    J'ai oublié de faire une fonction correcte, qui doit renvoyer une valeur
    Voilà la correction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  5. #5
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 335
    Points : 148
    Points
    148
    Par défaut
    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

  6. #6
    Membre actif
    Inscrit en
    Janvier 2003
    Messages
    604
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 604
    Points : 247
    Points
    247
    Par défaut
    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.

  7. #7
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 335
    Points : 148
    Points
    148
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("calculation").Range("G1")
    et pointe dans la cellule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("calculation").Range("H1")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  8. #8
    Membre chevronné Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Points : 2 131
    Points
    2 131
    Par défaut
    Et si tu fais tout simplement
    Avant de tracer ton graph ?

  9. #9
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 335
    Points : 148
    Points
    148
    Par défaut
    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 !!

  10. #10
    Membre chevronné Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Points : 2 131
    Points
    2 131
    Par défaut
    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 ?

  11. #11
    Membre actif
    Inscrit en
    Janvier 2003
    Messages
    604
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 604
    Points : 247
    Points
    247
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  12. #12
    Membre chevronné Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Points : 2 131
    Points
    2 131
    Par défaut
    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.

Discussions similaires

  1. Réponses: 10
    Dernier message: 18/05/2011, 12h52
  2. [AC-2007] comment Executer code VBA à partir du formulaire ?
    Par sarah12 dans le forum VBA Access
    Réponses: 0
    Dernier message: 23/07/2010, 14h20
  3. Executer du code vba apres un publipostage
    Par xcbilx dans le forum VBA Word
    Réponses: 6
    Dernier message: 10/04/2008, 01h53
  4. Code VBA après conversion 2003->97
    Par madchemiker dans le forum VBA Access
    Réponses: 4
    Dernier message: 23/05/2007, 17h15
  5. [VBA] [EXCEL 97] Formatage automatique des cellules
    Par plante20100 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/09/2005, 10h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo