Aktualisieren Sie die Ergebnisse der Excel VBA-Funktion

70

Wie kann ich eine benutzerdefinierte Funktion veranlassen, sich basierend auf geänderten Daten in der Tabelle neu zu bewerten?

Ich habe versucht F9und Shift+F9 .

Das einzige, was zu funktionieren scheint, ist, die Zelle mit dem Funktionsaufruf zu bearbeiten und dann die Eingabetaste zu drücken.

Brian Sullivan
quelle

Antworten:

123

Sie sollten Application.Volatileoben in Ihrer Funktion Folgendes verwenden:

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

Es wird dann neu bewertet, wenn sich die Arbeitsmappe ändert (wenn Ihre Berechnung auf automatisch eingestellt ist).

vzczc
quelle
18
Danke, ich habe gerade meinen Kopf gegen einen Schreibtisch geschlagen. Sollte jedoch darauf hinweisen, dass Sie in Excel 2010 True an Application.Volatile übergeben müssen, d Application.Volatile True. H.
Mdm
@mdm Danke für die Infos zum True !! Benötigt dies auch für eine benutzerdefinierte Arbeitsblattfunktion in Excel 2013!
Timbram
1
Dies funktioniert, wenn ich den Wert einer Zelle ändere, aber ich habe eine Funktion, die Zellen basierend auf der Füllfarbe summiert, und dies aktualisiert die Funktion nicht, wenn ich die Füllfarbe der Zelle ändere. Ich muss den Wert erneut eingeben. Kann ich das Arbeitsblatt live aktualisieren, wenn ich die Füllfarbe ändere?
Chris L
@ChrisL Haben Sie eine Lösung für Ihren Anwendungsfall mit der Berechnung basierend auf der Füllfarbe gefunden? Schätzen Sie Ihre Lösung.
Smartini
@smartini Ich habe nie weiter nach einer Lösung gesucht. Ich habe meine Füllfarbenfunktion nicht oft genug verwendet, um eine Rolle zu spielen. Ich hatte vor 4 Jahren auf eine schnelle Antwort auf meinen Kommentar gehofft, aber er kam nie. Vielleicht am besten eine neue Frage stellen. Wenn Sie dies tun, schreiben Sie mir hier einen Kommentar, damit ich ihm folgen kann.
Chris L
39

Weitere Informationen zu den F9-Tastaturkürzeln für die Berechnung in Excel

  • F9 Berechnet alle Arbeitsblätter in allen geöffneten Arbeitsmappen neu
  • Shift+ F9 Berechnet das aktive Arbeitsblatt neu
  • Ctrl+ Alt+ F9 Berechnet alle Arbeitsblätter in allen geöffneten Arbeitsmappen neu (vollständige Neuberechnung)
  • Shift+ Ctrl+ Alt+ F9Erstellt den Abhängigkeitsbaum neu und führt eine vollständige Neuberechnung durch
Robert Mearns
quelle
16

Okay, habe diesen selbst gefunden. Sie können Ctrl+ Alt+ verwenden F9, um dies zu erreichen.

Brian Sullivan
quelle
Dies ist Ihre einzige Option, wenn Sie Excel 2007 haben, da die Application.VolatileMethode in Office 2010 hinzugefügt wurde.
Ich sage Reinstate Monica
11

Wenn Sie ALLE Verweise auf die Tabellenkalkulationsdaten in die UDF-Parameterliste aufnehmen, berechnet Excel Ihre Funktion neu, wenn sich die referenzierten Daten ändern:

Public Function doubleMe(d As Variant)
    doubleMe = d * 2
End Function

Sie können auch verwenden Application.Volatile, dies hat jedoch den Nachteil, dass Ihre UDF immer neu berechnet wird - auch wenn dies nicht erforderlich ist, da sich die referenzierten Daten nicht geändert haben.

Public Function doubleMe()
    Application.Volatile
    doubleMe = Worksheets("Fred").Range("A1") * 2
End Function
MarredCheese
quelle
1

So wechseln Sie zu Automatisch:

Application.Calculation = xlCalculationAutomatic    

So wechseln Sie zu Manuell:

Application.Calculation = xlCalculationManual    
Ayman
quelle
1

Das Application.Volatilefunktioniert nicht zum Neuberechnen einer Formel mit meiner eigenen Funktion. Ich benutze die folgende Funktion: Application.CalculateFull

alex303411
quelle
1

Dies aktualisiert die Berechnung besser als Range(A:B).Calculate:

Public Sub UpdateMyFunctions()
    Dim myRange As Range
    Dim rng As Range

    ' Assume the functions are in this range A1:B10.
    Set myRange = ActiveSheet.Range("A1:B10")

    For Each rng In myRange
        rng.Formula = rng.Formula
    Next
End Sub
MfJ
quelle
1

Ich fand es am besten, die Berechnung nur zu aktualisieren, wenn eine bestimmte Zelle geändert wird. Hier ist ein Beispiel für einen VBA-Code, der in das Ereignis "Arbeitsblatt" "Ändern" eingefügt werden soll:

Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, Range("F3")) Is Nothing Then
    Application.CalculateFull
  End If
End Sub
Gene Sorg
quelle
0
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
Prashanth
quelle
Bitte erläutern Sie den Code ein wenig. Dies würde die Nützlichkeit erheblich erhöhen.
Trilarion
rng.Formula = rng.Formula entspricht dem Eingeben einer Zelle und dem erneuten Drücken der Eingabetaste. Es zwingt Excel, die Zelle erneut zu berechnen - einschließlich aller benutzerdefinierten Funktionen.
Sam V