Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Worksheet_calculate

Worksheet_calculate
26.06.2014 08:36:15
Cäptn
Guten Morgen zusammen,
ich möchte das Ereignis Worksheet_change nur bei Änderung einer bestimmten Zelle (A1) ausführen lassen. Wie funktioniert das? Standardmäßig führt ja jede Kalkulation im Worksheet zum Auslösen des Ereignisses.
Danke Euch,
C. Nuss

Anzeige

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Worksheet_calculate
26.06.2014 08:37:16
Cäptn
sorry, ich meine Worksheet_calculate!. Im text habe ich mich vertan.

AW: Worksheet_calculate
26.06.2014 09:07:17
Robin
Hey Nuss,
vielleicht hilft dir das ja schon weiter, ist zwar jetzt nur "Change", aber dennoch sollte es seinen Zweck erfüllen.
(Bei Zelländerung/Zelleingabe in Zell "A1")
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1")) Is Nothing Then
MsgBox "TaDa"
End If
End Sub
MfG Robin

Anzeige
AW: Worksheet_calculate
26.06.2014 09:08:19
Cäptn
danke! aber leider nein. _change reagiert ja nicht auf formeländerung. hätte ich erwähnen sollen: in zelle A1 steht eine formel!

AW: Worksheet_calculate
26.06.2014 09:13:56
Daniel
Hi
Du musst dir den alten Wert von A1 in einer statischen Variable merken und im calculate-event prüfen, ob diese Zelle geändert wurde und nur dann das Makro ausführen:
Private Sub Calculate()
Static WertAlt as String
If Range("A1").text  WertAlt then
hier der Code
WertAlt = Range("A1").text
End if
End Sub

Code ist nicht getestet, bitte nicht kopieren, sondern versuchen, das Prinzip zu verstehen und selber programmieren.
Gruß Daniel

Anzeige
AW: Worksheet_calculate
26.06.2014 09:16:06
Robin
Okidoki Nuss,
kein Problem, dann hätte ich diese alternative für dich schnell geschrieben.
Private Sub Worksheet_Calculate()
Dim rngC As Range
For Each rngC In Range("A1")
On Error GoTo Ende
If rngC = "!" Or rngC = "" Then Exit Sub
Next
MsgBox "TaDa"
Exit Sub
Ende:
MsgBox "Bitte nur Zahlen"
End Sub
Vielleichts ist es das, was du suchst.

Anzeige
AW: Worksheet_calculate
26.06.2014 09:21:51
Cäptn
schau ich mir auch mal an! dankeschön!!!

AW: Worksheet_calculate
26.06.2014 09:21:20
Cäptn
danke! ist verstanden und so werde ich es umsetzen.

AW: Worksheet_calculate
26.06.2014 09:27:37
Hajo_Zi
VBA Editor DieseArbeitsmappe
starte den VBA Editor (Alt+F11), Bild sollte zweigeteilt sein ansonsten Strg+R, Doppelklick auf Deine Datei, Doppelklick auf DieseArbeitsmappe, Code ins rechte Fenster kopieren, VBA Editor schließen.
Das Makro wird automatisch gestartet.
Der Code wirkt in der gesamten Datei.
VBA Editor Modul
starte den VBA Editor (Alt+F11), Bild sollte zweigeteilt sein ansonsten Strg+R, gehe auf Deine Datei, rechte Maustaste, Einfügen Modul, Code ins rechte Fenster kopieren, VBA Editor schließen.
Register Ansicht, Befehlsgruppe Makros, auf Makro klicken, Makros anzeigen, Makro auswählen und ausführen.
VBA Editor Tabelle
starte den VBA Editor (Alt+F11), Bild sollte zweigeteilt sein ansonsten Strg+R, Doppelklick auf Deine Datei, Doppelklick auf Deine Tabelle, Code ins rechte Fenster kopieren, VBA Editor schließen.
Das Makro wird automatisch gestartet.
Der Code wirkt nur in dieser Tabelle.
unter DieseArbeitsmappe
Option Explicit                                     ' Variablendefinition erforderlich
Private Sub Workbook_Open()
'* H. Ziplies                                  *
'* 16.01.10                                    *
'* erstellt von HajoZiplies@web.de             *
'* http://Hajo-Excel.de/
'* und von Karin, http://Excel-Inn.de
'* Beverly_Forums@web.de                       *
' Array mit Adressen und eingetragen Werte füllen
' da Bilder schon eingefügt wurden müssen die
' nicht eingefügt werden
StArray = Array(Array("", "", "", "", "", ""), _
Array("A10", "A20", "A30", "A40", "A50", "A60"))
With Worksheets("Tabelle1")
For Loi = 0 To UBound(StArray(0), 1)
If Range(StArray(1)(Loi))  "" Then
' Zellinhalt auf Variable
StArray(0)(Loi) = Range(StArray(1)(Loi))
End If
Next Loi
End With
End Sub
unter der Tabelle
Option Explicit                                     ' Variablendefinition erforderlich
Private Sub Worksheet_Calculate()
'* H. Ziplies                                  *
'* 24.01.10                                    *
'* erstellt von HajoZiplies@web.de             *
'* http://Hajo-Excel.de/
Dim StBild As String                            ' Variable für Bildname
Application.ScreenUpdating = False              ' Bildschimaktualisierung aus
With Worksheets("Tabelle1")
For Loi = 0 To UBound(StArray(0), 1)        ' Schleife über überwachte Zellen
If Range(StArray(1)(Loi))  "" _
And Range(StArray(1)(Loi))  StArray(0)(Loi) Then
' Zelle geändert
MsgBox 1
StArray(0)(Loi) = Range(StArray(1)(Loi))
End If
Next Loi
End With
Application.ScreenUpdating = True               ' Bildschimaktualisierung ein
End Sub
in einem Modul
Option Explicit                                     ' Variablendefinition erforderlich
Public StArray                                      ' Variable für überwachte Zelladressen
Public Loi As Long                                  ' Schleifenvariable

Anzeige
AW: Worksheet_calculate
26.06.2014 10:53:59
Cäptn
dankeschön!
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige

Infobox / Tutorial

Optimierung des Worksheet_Calculate-Ereignisses in Excel VBA


Schritt-für-Schritt-Anleitung

Um das worksheet_calculate Ereignis in Excel VBA zu optimieren, folge diesen Schritten:

  1. Öffne den VBA-Editor: Drücke Alt + F11, um den VBA-Editor zu starten.

  2. Wähle das richtige Arbeitsblatt: Doppelklicke im Projekt-Explorer auf das Arbeitsblatt, in dem du das Ereignis implementieren möchtest.

  3. Füge den Code für das Ereignis ein: Kopiere den folgenden Code in das Codefenster:

    Private Sub Worksheet_Calculate()
       Dim WertAlt As String
       Static WertAlt As String
    
       If Range("A1").Text <> WertAlt Then
           MsgBox "Zelle A1 wurde geändert!"
           WertAlt = Range("A1").Text
       End If
    End Sub
  4. Schließe den VBA-Editor: Speichere deine Änderungen und schließe den Editor.

  5. Teste das Makro: Ändere den Wert in Zelle A1 und schaue, ob das Ereignis wie gewünscht reagiert.


Häufige Fehler und Lösungen

  • Fehler: Das Ereignis wird nicht ausgelöst
    Lösung: Stelle sicher, dass der Code im richtigen Arbeitsblatt-Objekt eingefügt wurde. Das private sub worksheet_calculate() muss im spezifischen Arbeitsblatt stehen.

  • Fehler: Es wird immer eine Nachricht angezeigt
    Lösung: Achte darauf, dass der Vergleich mit WertAlt korrekt durchgeführt wird. Überprüfe, dass WertAlt initialisiert ist.


Alternative Methoden

Wenn du das worksheet_calculate Ereignis nicht verwenden möchtest, kannst du die Worksheet_Change-Ereignisprozedur in Kombination mit einer statischen Variablen verwenden. Hier ein Beispiel:

Private Sub Worksheet_Change(ByVal Target As Range)
    Static WertAlt As String
    If Not Intersect(Target, Range("A1")) Is Nothing Then
        If Range("A1").Text <> WertAlt Then
            MsgBox "Zelle A1 wurde geändert!"
            WertAlt = Range("A1").Text
        End If
    End If
End Sub

Diese Methode reagiert allerdings nur auf direkte Eingaben und nicht auf Änderungen durch Formeln.


Praktische Beispiele

Beispiel 1: Überwachung mehrerer Zellen

Private Sub Worksheet_Calculate()
    Dim rng As Range
    Dim ZielZellen As Range
    Set ZielZellen = Range("A1:A10") ' Überwache Zellen A1 bis A10

    For Each rng In ZielZellen
        If rng.Value <> rng.OldValue Then
            MsgBox rng.Address & " wurde geändert!"
        End If
    Next rng
End Sub

Beispiel 2: Berechnung bei Änderung einer Formel

Private Sub Worksheet_Calculate()
    If Range("A1").Formula <> "" Then
        MsgBox "Die Formel in A1 hat sich geändert!"
    End If
End Sub

Tipps für Profis

  • Vermeide unnötige Berechnungen: Nutze Application.EnableEvents = False und Application.EnableEvents = True, um zu verhindern, dass das Ereignis mehrmals ausgelöst wird.
  • Performance-Tuning: Verwende Application.ScreenUpdating = False, um die Bildschirmaktualisierung während der Berechnungen zu deaktivieren.
  • Debugging: Nutze Debug.Print, um Informationen im Direktfenster auszugeben, wenn du Fehler suchst.

FAQ: Häufige Fragen

1. Wie kann ich das worksheet_calculate Ereignis in einem Modul verwenden?
Das worksheet_calculate Ereignis ist spezifisch für Arbeitsblätter. Du kannst jedoch Subroutinen im Modul erstellen, die durch dieses Ereignis aufgerufen werden.

2. Was tun, wenn das Ereignis nicht funktioniert?
Überprüfe, ob der Code im richtigen Arbeitsblatt-Objekt ist und ob die Makros in deiner Excel-Datei aktiviert sind. Achte auch darauf, dass der Code keine Syntaxfehler enthält.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige