Actualiser les résultats de la fonction Excel VBA

Est-ce que quelqu'un sait comment je peux get une fonction définie par l'user pour se réévaluer (en fonction des données modifiées dans la feuille de calcul)? J'ai essayé F9 et Shift + F9 , mais ceux ne fonctionnent pas. La seule chose qui semble fonctionner est l'édition de la cellule avec l'appel de fonction, puis appuyez sur Entrée. Des idées? Je me souviens d'avoir pu le faire …

Vous devez utiliser Application.Volatile dans le haut de votre fonction:

 Function doubleMe(d) Application.Volatile doubleMe = d * 2 End Function Fonction doubleMe (d) Function doubleMe(d) Application.Volatile doubleMe = d * 2 End Function Application.Volatile Function doubleMe(d) Application.Volatile doubleMe = d * 2 End Function doubleMe = d * 2 Function doubleMe(d) Application.Volatile doubleMe = d * 2 End Function 

Il sera ensuite réévalué chaque fois que le classur change (si votre calcul est réglé sur automatiquement).

Plus d'informations sur les raccourcis keyboard F9 pour calculer dans Excel

  • F9 Recalcule toutes les feuilles de travail dans tous les classurs ouverts
  • Shift + F9 Recalcule la feuille de travail active
  • Ctrl + Alt + F9 Recalcule toutes les feuilles de travail dans tous les classurs ouverts (recalcul complet)
  • Shift + Ctrl + Alt + F9 Reconstruit l'arborescence des dependencies et effectue un recalcul complet

D'accord, j'ai trouvé celui-ci moi-même. Vous pouvez utiliser Ctrl + Alt + F9 pour y parvenir.

Si vous incluez TOUTES les references aux données de tableur dans la list de parameters UDF, Excel recalculera votre fonction chaque fois que datatables référencées changent:

 Public Function doubleMe(d as variant) doubleMe=d*2 end Function Fonction publique doubleMe (d en variante) Public Function doubleMe(d as variant) doubleMe=d*2 end Function doubleMe = d * 2 Public Function doubleMe(d as variant) doubleMe=d*2 end Function 

Vous pouvez également utiliser Application.Volatile, mais cela a pour inconvénient de faire en sorte que votre UDF soit toujours recalculé, même s'il n'est pas nécessaire car datatables référencées n'ont pas changé.

 Public Function doubleMe() Application.Volatile doubleMe=Worksheets("Fred").Range("A1")*2 end Function Fonction publique doubleMe () Public Function doubleMe() Application.Volatile doubleMe=Worksheets("Fred").Range("A1")*2 end Function Application.Volatile Public Function doubleMe() Application.Volatile doubleMe=Worksheets("Fred").Range("A1")*2 end Function doubleMe = Feuilles de travail ("Fred"). Plage ("A1") * 2 Public Function doubleMe() Application.Volatile doubleMe=Worksheets("Fred").Range("A1")*2 end Function 

Il fonctionne bien celui-ci pour actualiser le calcul mieux que Range (A: B) .Calculer

 Public Sub UpdateMyFunctions() Dim myRange As Range Dim rng As Range 'Considering The Functions are in Range A1:B10 Set myRange = ActiveSheet.Range("A1:B10") For Each rng In myRange rng.Formula = rng.Formula Next End Sub Public Sub UpdateMyFunctions () Public Sub UpdateMyFunctions() Dim myRange As Range Dim rng As Range 'Considering The Functions are in Range A1:B10 Set myRange = ActiveSheet.Range("A1:B10") For Each rng In myRange rng.Formula = rng.Formula Next End Sub Dim myRange As Range Public Sub UpdateMyFunctions() Dim myRange As Range Dim rng As Range 'Considering The Functions are in Range A1:B10 Set myRange = ActiveSheet.Range("A1:B10") For Each rng In myRange rng.Formula = rng.Formula Next End Sub Dim rng As Range Public Sub UpdateMyFunctions() Dim myRange As Range Dim rng As Range 'Considering The Functions are in Range A1:B10 Set myRange = ActiveSheet.Range("A1:B10") For Each rng In myRange rng.Formula = rng.Formula Next End Sub 'Compte tenu des fonctions sont dans la plage A1: B10 Public Sub UpdateMyFunctions() Dim myRange As Range Dim rng As Range 'Considering The Functions are in Range A1:B10 Set myRange = ActiveSheet.Range("A1:B10") For Each rng In myRange rng.Formula = rng.Formula Next End Sub Définir myRange = ActiveSheet.Range ("A1: B10") Public Sub UpdateMyFunctions() Dim myRange As Range Dim rng As Range 'Considering The Functions are in Range A1:B10 Set myRange = ActiveSheet.Range("A1:B10") For Each rng In myRange rng.Formula = rng.Formula Next End Sub Pour chaque rng dans myRange Public Sub UpdateMyFunctions() Dim myRange As Range Dim rng As Range 'Considering The Functions are in Range A1:B10 Set myRange = ActiveSheet.Range("A1:B10") For Each rng In myRange rng.Formula = rng.Formula Next End Sub rng.Formula = rng.Formula Public Sub UpdateMyFunctions() Dim myRange As Range Dim rng As Range 'Considering The Functions are in Range A1:B10 Set myRange = ActiveSheet.Range("A1:B10") For Each rng In myRange rng.Formula = rng.Formula Next End Sub 

À l'aide d'Excel 2010, j'ai rencontré les mêmes problèmes que Brian. Lorsque j'ai essayé toutes les solutions proposées ici, il n'y a pas eu d'amélioration, la fonction définie par l'user est apparue pour ne pas recalculer en dépit d'avoir Application.Volatile, en utilisant des combinaisons de touches de recalcul etc. Cependant, je me suis rendu count que ma définition de fonction était en défaut dans le fait que toutes les references de cellules dans il n'était pas suffisamment qualifié pour fonctionner correctement lorsque la feuille contenant la fonction n'était pas la feuille active, par exemple la modification des cellules (a, b) à Application.Caller.Worksheet.Cells (a, b) a complètement résolu le problème! Je crois que c'est la solution parce que lorsque la feuille contenant ma fonction n'est pas active, les cellules de la feuille (a, b) sont interprétées comme faisant reference à n'importe quelle feuille qui se trouve à l'heure actuelle.

Pour passer à Automatique:

 Application.Calculation = xlCalculationAutomatic 

Pour passer à Manuel:

 Application.Calculation = xlCalculationManual 
 Public Sub UpdateMyFunctions() Dim myRange As Range Dim rng As Range 'Considering The Functions are in Range A1:B10 Set myRange = ActiveSheet.Range("A1:B10") For Each rng In myRange rng.Formula = rng.Formula Next End Sub Public Sub UpdateMyFunctions () Public Sub UpdateMyFunctions() Dim myRange As Range Dim rng As Range 'Considering The Functions are in Range A1:B10 Set myRange = ActiveSheet.Range("A1:B10") For Each rng In myRange rng.Formula = rng.Formula Next End Sub Dim myRange As Range Public Sub UpdateMyFunctions() Dim myRange As Range Dim rng As Range 'Considering The Functions are in Range A1:B10 Set myRange = ActiveSheet.Range("A1:B10") For Each rng In myRange rng.Formula = rng.Formula Next End Sub Dim rng As Range Public Sub UpdateMyFunctions() Dim myRange As Range Dim rng As Range 'Considering The Functions are in Range A1:B10 Set myRange = ActiveSheet.Range("A1:B10") For Each rng In myRange rng.Formula = rng.Formula Next End Sub 'Compte tenu des fonctions sont dans la plage A1: B10 Public Sub UpdateMyFunctions() Dim myRange As Range Dim rng As Range 'Considering The Functions are in Range A1:B10 Set myRange = ActiveSheet.Range("A1:B10") For Each rng In myRange rng.Formula = rng.Formula Next End Sub Définir myRange = ActiveSheet.Range ("A1: B10") Public Sub UpdateMyFunctions() Dim myRange As Range Dim rng As Range 'Considering The Functions are in Range A1:B10 Set myRange = ActiveSheet.Range("A1:B10") For Each rng In myRange rng.Formula = rng.Formula Next End Sub Pour chaque rng dans myRange Public Sub UpdateMyFunctions() Dim myRange As Range Dim rng As Range 'Considering The Functions are in Range A1:B10 Set myRange = ActiveSheet.Range("A1:B10") For Each rng In myRange rng.Formula = rng.Formula Next End Sub rng.Formula = rng.Formula Public Sub UpdateMyFunctions() Dim myRange As Range Dim rng As Range 'Considering The Functions are in Range A1:B10 Set myRange = ActiveSheet.Range("A1:B10") For Each rng In myRange rng.Formula = rng.Formula Next End Sub