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 :

recalculer automatiquement toutes les fonctions d'une feuille


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 39
    Par défaut recalculer automatiquement toutes les fonctions d'une feuille
    Bonjour,

    J'ai créé une fonction que j'utilise beaucoup de fois dans une feuille.

    J'ai rajouté dans ma fonction "Application.Volatile" pour qu'elle se recalcule automatiquement dès qu'il y a un changement dans mon workbook.

    J'ai aussi rajouté un bouton qui appelle la fonction "Calculate" de la feuille en question parce que j'avais remarqué que parfois "Application.Volatile" ne suffisait pas.

    Mais malgré ça, je ne sais absolument pas pourquoi, des fois ça ne veut pas fonctionner et je dois aller dans chaque cellule où est ma fonction, appuyer sur entrer pour qu'elle se recalcule et ne plus avoir la valeur "#VALEUR!" dans ma cellule.

    Ma fonction fonctionne correctement puisque si je clique sur entrée j'ai les bonnes valeurs.

    Mais utilisant cette fonction une centaine de fois dans ma feuille, cliquer sur chaque cellule puis appuyer sur entrée à chaque ouverture de mon classeur est un peu chiant!!

    Quelqu'un aurait une idée??

    Merci d'avance!

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonjour,
    Sans le code de la fonction en question, difficile de se prononcer

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Une question bête, mais dans les otpions as tu la case "calcul automatique" cochée ? Car, par VBA après de multiples essais, on peut avoir changer cette valeur sans vraiment le vouloir.

    Une autre question, Application.Volatile est en début de fonction ?

    Hervé.

  4. #4
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 39
    Par défaut
    Merci pour les réponses.

    Je ne savais pas que cette case à cocher éxistait donc je suis allé voir et oui elle est bien coché, deplus j'ai du coup cliqué sur le bouton calculer maintenant et la ça fonctionne nickel.

    J'ai mit application.volatile à le fin de la fonction.

    Je ne pense pas que le code de la fonction soit utile, la fonction fonctionne très bien...

    Donc la question que je me pose maintenant c'est que fait le bouton calculer maintenant de la boite de dialogue option, car je pourrais peut etre reprendre ça??

  5. #5
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 39
    Par défaut
    En fait, j'ai dit une bêtise, ça ne fonctionne pas non plus avec le bouton calculer maintenant.

    Bon en fait j'ai fait un test avec un point d'arrêt sur ma fonction, quand je fait un calculate de ma feuille, il ne recalcule que les fonctions qui fonctionne déjà, c'est comme si il ne voyait pas les autres... Je ne comprends pas bien.

    Et pareil pour le volatile, il ne fonctionne qu'à l'endroit où la fonction retourne une valeur correcte, mais il ne rentre pas dans les fonctions qui retournent #Valeur !

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Re,

    Généralement, on mets "Application.Volatile" en tout début de fonction après la déclaration des éventuelles variables (j'ai même pas contrôlé si celà faisait une différence ???). Maintenant, si ta fonction n'est pas top secret, tu pourrais nous la poster afin de pouvoir faire des tests.

    Hervé.

  7. #7
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 39
    Par défaut
    Ha non non elle est pas trop secrète c'est juste que je ne sais pas si c'est très utile et vous risquez de vous prendre la tête pour la tester ...
    Mais ok je vous la donne

    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    Function budgetRealise(categorie As String, operation As String, annee As Integer)
    'Fonction permettant de calculer par categorie la somme reverser à l'annee
    'l'operation permet de savoir si c'est une opération de dépenses ou de credit
     
    'déclaration des variables
    Dim rng As Range                'permet de parcourir le compte
    Dim cel As Range               'idem
    Dim cell1 As Range              'idem
    Dim cell2 As Range              'idem
    Dim anneeBudget As Integer      'annee de l'operation (dateBudget)
    Dim somme As Single             'somme de l'operation pour l'annee en cours
    Dim ligneTotalSBE As Integer    'nombre de ligne du tableau du compte SBE
    Dim ligneTotalVentilation As Integer 'nombre de ligne du tableau de ventilation
     
    Application.Volatile
     
    'initialisation des variables
    somme = 0
    ligneTotalSBE = nbreLigne("Compte SBE")
    ligneTotalPortefeuille = nbreLigne("Compte Portefeuille")
    ligneTotalVentilation = nbreLigne("Ventilation")
    anneeBudget = annee
     
    'parcours de toute les cellules du compte SBE
    With ThisWorkbook.Worksheets("Compte SBE").Activate
        Set cell1 = Worksheets("Compte SBE").Range("Categorie").Cells(8)
        Set cell2 = Worksheets("Compte SBE").Range("Categorie").Cells(ligneTotalSBE)
        Set rng = Worksheets("Compte SBE").Range(cell1, cell2)
        For Each cel In rng
            If cel.Value = categorie Then
                anneeBudget = Worksheets("Compte SBE").Range("dateBudget").Cells(cel.Row).Value
                If anneeBudget = annee Then
                    If Worksheets("Compte SBE").Range("P").Cells(cel.Row).Value = "P" Then
                        If operation = "Dépenses" Then
                            somme = somme + Worksheets("Compte SBE").Range("debit").Cells(cel.Row).Value
                        ElseIf operation = "Recettes" Then
                            somme = somme + Worksheets("Compte SBE").Range("credit").Cells(cel.Row).Value
                        Else: MsgBox ("l'operation doit etre Dépenses ou Recettes")
                        End If
                    End If
                End If
            End If
        Next cel
    End With
     
    'parcours de toutes les cellules du compte portefeuille
    With ThisWorkbook.Worksheets("Compte Portefeuille").Activate
        Set cell1 = Worksheets("Compte Portefeuille").Range("CategoriePortefeuille").Cells(8)
        Set cell2 = Worksheets("Compte Portefeuille").Range("CategoriePortefeuille").Cells(ligneTotalPortefeuille)
        Set rng = Worksheets("Compte Portefeuille").Range(cell1, cell2)
        For Each cel In rng
            If cel.Value = categorie Then
                anneeBudget = Worksheets("Compte Portefeuille").Range("dateBudgetPortefeuille").Cells(cel.Row).Value
                If anneeBudget = annee Then
                    If Worksheets("Compte Portefeuille").Range("Pportefeuille").Cells(cel.Row).Value = "P" Then
                        If operation = "Dépenses" Then
                            somme = somme + Worksheets("Compte Portefeuille").Range("debitPortefeuille").Cells(cel.Row).Value
                        ElseIf operation = "Recettes" Then
                            somme = somme + Worksheets("Compte Portefeuille").Range("creditPortefeuille").Cells(cel.Row).Value
                        Else: MsgBox ("l'operation doit etre Dépenses ou Recettes")
                        End If
                    End If
                End If
            End If
        Next cel
    End With
     
    'parcours de toutes les cellules de la feuille ventilation
    With ThisWorkbook.Worksheets("Ventilation").Activate
        Set cell1 = Worksheets("Ventilation").Range("categorieVentilation").Cells(8)
        Set cell2 = Worksheets("Ventilation").Range("categorieVentilation").Cells(ligneTotalVentilation)
        Set rng = Range(cell1, cell2)
        For Each cel In rng
            If cel.Value = categorie Then
                anneeBudget = Worksheets("Ventilation").Range("dateBudgetVentilation").Cells(cel.Row).Value
                If anneeBudget = annee Then
                    If Range("PVentilation").Cells(cel.Row).Value = "P" Then
                        If operation = "Dépenses" Then
                            somme = somme + Worksheets("Ventilation").Range("debitVentilation").Cells(cel.Row).Value
                        End If
                    End If
                End If
            End If
        Next cel
    End With
     
    budgetRealise = somme
     
    End Function
    Merci

  8. #8
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 39
    Par défaut
    Et maintenant ça marche...

    Je comprends pas...

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Re,

    1° une fonction ne peut que retourner une valeur ou un tableau de valeurs mais normalement, elle ne doit (et ne peut) pas sélectionner ou activer.

    2° normalement, toutes les variables externes à la fonction lui sont passées en argument et pas utilisées en "dur" (dans ton cas je reconnais que ça en fait quelques unes mais bien construite, la fonction n'en demande pas tant que ça)

    Ceci ne sert à rien, il n'y a aucune référence dans le code qui le suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    With ThisWorkbook.Worksheets("Compte Portefeuille").Activate
    End With
    Ta fonction pourrait aussi être simplifiée en lui passant en argument des fonctions Excel (pourquoi réinventer la roue), ici je suppose que tu à une autre fonction qui te compte les lignes : ligneTotalSBE = nbreLigne("Compte SBE") mais Excel a entre autres la fonction NB.SI pour retourner un nombre de cellule correspondant au critère, par exemple :
    retourne le nombre de cellules qui ne sont pas vides.

    Tu as trois boucles dans ta fonction alors que bien construite tu ne devrais en avoir qu'une (en passant les bons arguments la boucle, donc la fonction, doit te retourner la bonne valeur) pour la cellule contenant la fonction

    Ceci ne devrait pas se trouver dans une fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Else: MsgBox ("l'operation doit etre Dépenses ou Recettes")
    Avec un gestionnaire d'erreur dans ta fonction et avec Err.Raise, ta fonction (comme celles d'Excel) doit te retourner une valeur d'erreur :
    ici tu génère une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If operation <> "Dépenses" Or operation <> "Recettes" Then
        Err.Raise (vbObjectError + 1000)
    End If
    un petit exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function TEST(A As Range, B As Range) As Double
     
        Application.Volatile
     
        If A <> B Then
            Err.Raise (vbObjectError + 1000)
        Else
            TEST = A + B
        End If
     
    End Function
    Surtout, ne le prends pas mal, ce sont des conseils et non des critiques

Discussions similaires

  1. [XL-2010] Parcourir toutes les images d'une feuille
    Par eno97 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 31/10/2012, 18h34
  2. Effacer toutes les donnees sur une feuille
    Par Potzo dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 08/07/2010, 15h46
  3. [XL-2003] Effacer toutes les Shapes d'une feuille sauf une
    Par martinmacfly dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/01/2010, 18h44
  4. Réponses: 0
    Dernier message: 27/11/2007, 23h59
  5. [VBA-E] supprimer le contenu de toutes les cellules d'une feuille
    Par BipBip2 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 13/08/2004, 16h13

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