Acutalisation du résultat d'une fonction sous vba si on change la valeur d'1 cellule

MaximeC

XLDnaute Junior
Bonjour,

Je travaille sur un tableau de données, qui s'actualise manuellement à différents instant t.

J'ai réaliser une fonction, qui parcours une plage de cellules, et qui permet de calculer un nombre d'heures, en fonction du contenu de la cellule voisine. (Fichier 1)

Lorsque j'appelle cette fonction, j'obtien le résultat voulu. Cependant, si je modifie la valeur d'une des cellules "heures", la fonction ne s'actualise pas (Fichier 2). Il faut pour cela que je clique sur la cellule ou j'ai rentré la fonction (dans le fichier 2, cellule P50) et que je valide de nouveau la fonction. Est-il possible qu'elle s'actualise automatiquement sans que j'ai à utiliser cette manipulation? Avez vous une idée?

Voici ma fonction et les documents :

Code:
Private Function HTGC()

'Déclaration des variables

Dim i As Long
Dim j As Long
Dim heures As Long

'Programme de la fonction

heures = 0
For j = 2 To 25
    For i = 8 To 47
        If Cells(i, j).Value = "TGC" Then
            j = j + 1
            heures = heures + Cells(i, j).Value
            j = j - 1
        End If
    Next i
Next j

HTGC = heures
        
End Function

Merci,

Maxime
 

MichD

XLDnaute Impliqué
Re : Acutalisation du résultat d'une fonction sous vba si on change la valeur d'1 ce

Bonjour,

Transforme ta fonction comme ceci :

Et dans la cellule contenant la fonction suivante, tu écris : =HTGC(B7:Y46)
Tu peux adapter B7:Y46 pour la plage de cellules désirées.

'---------------------------------------------------
VB:
Private Function HTGC(Rg As Range)
'Déclaration des variables
Dim i As Long
Dim j As Long
Dim heures As Long

'Programme de la fonction
heures = 0
For j = Rg(, 1).Column To Rg.Columns.Count
    For i = Rg(1).Row To Rg.Rows.Count
        If Cells(i, j).Value = "TGC" Then
            j = j + 1
            heures = heures + Cells(i, j).Value
            j = j - 1
        End If
    Next i
Next j
HTGC = heures        
End Function
'---------------------------------------------------
 

tototiti2008

XLDnaute Barbatruc
Re : Acutalisation du résultat d'une fonction sous vba si on change la valeur d'1 ce

Bonjour Maxime,

Oui, c'est possible, mais 2 méthodes possibles
La 1ère, c'est de rendre ta fonction volatile, ça veut dire que quel que soit la cellule modifiée dans un classeur ouvert, elle se recalculera
Si tu l'utilise à plein d'endroits, ça peut s'avérer assez lourd en calcul
Sinon, c'est très simple il suffit d'ajouter "Application.Volatile" au début du code de ta fonction

La 2ème possibilité, c'est de passer en paramètre d'entrée de ta fonction les cellules avec lesquelles elle devra travailler, auquel cas elle se recalculera seulement si une des cellules concernée change de valeur, mais ça ça demanderait de modifier ta fonction un peu plus
Dans ton cas particulier, peut-être que la solution 1 est envisageable mais la deuxième est indéniablement plus propre, à toi de voir

Edit : Bonjour MichD :)
 

MaximeC

XLDnaute Junior
Re : Acutalisation du résultat d'une fonction sous vba si on change la valeur d'1 ce

Bonjour MichD et tototiti2008,

J'ai utilisé la fonction que MichD m'a proposé... sans pour autant obtenir le résultat escompté .. J'obtient le résultat "58" au lieu de 143.
J'ai remarqué que le programme fonction uniquement sur les 4 premières lignes grisées, y compris l'actualisation.
Je pense donc qu'une petite erreur a du être commise dans les boucle for, nan?

A quoi correspond le: "Rg.Columns.Count"? Rg pour plage, columns pour colonnes, mais Count?

Merci
 
Dernière édition:

MaximeC

XLDnaute Junior
Re : Acutalisation du résultat d'une fonction sous vba si on change la valeur d'1 ce

En remplaçant "Rg.Columns.Count" par 25 et "Rg.Rows.Count" par 47, ça fonctionne! Avais-tu, MichD, un quelquconque objectif (plus rapide, ne traite que les cellules pleines ..) quant à l'utilisation de ses instructions?
 

tototiti2008

XLDnaute Barbatruc
Re : Acutalisation du résultat d'une fonction sous vba si on change la valeur d'1 ce

Bonjour à tous,

essaye peut-être de modifier comme ça

For j = 1 To Rg.Columns.Count
For i = 1 To Rg.Rows.Count
If Rg.Cells(i, j).Value = "TGC" Then
heures = heures + Rg.Cells(i, j+1).Value
End If
Next i
Next j

Pas testé :rolleyes:

Edit : Count ça veut dire Compte, donc le nombre colonnes et de lignes de la plage concernée
 

MaximeC

XLDnaute Junior
Re : Acutalisation du résultat d'une fonction sous vba si on change la valeur d'1 ce

Je viens de tester ça ne marche pas non plus, mais entre temps j'ai trouvé une solution, qui certes n'est pas propre au niveau du code, mais qui fonctionne. J'ai fait un mix de mon code et de celui de MichD. en faite j'ai simplement rajouté le "(Rg as Range)" dans l'intitulé de ma fonction.

Code:
Private Function HTGC(Rg As Range)
'Déclaration des variables
Dim i As Long
Dim j As Long
Dim heures As Long

'Programme de la fonction
heures = 0
For j = 2 To 25
    For i = 8 To 47
        If Cells(i, j).Value = "TGC" Then
            j = j + 1
            heures = heures + Cells(i, j).Value
            j = j - 1
        End If
    Next i
Next j
HTGC = heures
End Function
 

tototiti2008

XLDnaute Barbatruc
Re : Acutalisation du résultat d'une fonction sous vba si on change la valeur d'1 ce

Re,

pourtant moi, en testant, ça marche....

VB:
Private Function HTGC(Rg As Range)
'Déclaration des variables
Dim i As Long
Dim j As Long
Dim heures As Long

'Programme de la fonction
heures = 0
For j = 1 To Rg.Columns.Count
    For i = 1 To Rg.Rows.Count
        If Rg.Cells(i, j).Value = "TGC" Then
            heures = heures + Rg.Cells(i, j + 1).Value
        End If
    Next i
Next j
HTGC = heures
End Function
 

Discussions similaires