Microsoft Excel

Herbers Excel/VBA-Archiv

Ereignisprozedur

Betrifft: Ereignisprozedur von: Peter F.
Geschrieben am: 31.07.2008 14:44:44

Hallo Excel-Fans,

ich hoffe, dass an diesem heißen Donnerstag Nachmittag wenigsten ein Experte online ist, der mir helfen kann:

Ich habe eine Arbeitsmappe mit 2 Arbeitsblättern (tab1 & tab2).
In Sheets("tab1").Range("D21") habe ich eine Formel, die per Sverweis aus einer Tabelle in Sheets("tab2") einen Wert extrahiert. Dieser Originalwert in tab2 muss gelegentlich aktualisiert werden.
Das habe ich mir wie folgt vorgestellt :
1. Ich überschreibe die Formel in Sheets("tab1").Range("D21") mit dem neuen Wert.
2. Dieser wird per VBA-Code ( in die richtige Zelle in Sheets("tab2") eingefügt.
3. Dann wird die Formel in Sheets("tab1").Range("D21") wieder hergestellt.

Den Code für Schritt 2 & 3 habe ich. Damit aber nicht vergessen wird das Makro dafür auszuführen (nicht jeder sieht dem Zellinhalt gleich an, dass er nicht aus einer Formel resultiert), möchte ich dessen Start mit der Eingabe des neuen Wertes in Sheets("tab1").Range("D21") verbinden.
Dafür sollte es eine Ereignisprozedur geben : Private Sub Worksheet_Change......., aber ich weiß nicht
wie die in diesem Fall auszusehen hat.
Einer da draußen weiß das bestimmt !
Ich bitte um Euren Beistand!

Danke,

Peter

  

Betrifft: AW: Ereignisprozedur von: Holger
Geschrieben am: 31.07.2008 15:30:49

Hallo Peter,
die Prozedur musst du in den Codeteile der Tabelle und nicht in ein Modul schreiben.

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("d21")) Is Nothing Then
deine Anweisungen
end if
End Sub


Gruß
Holger


  

Betrifft: AW: Ereignisprozedur von: Peter F.
Geschrieben am: 31.07.2008 17:00:47

Hallo Holger,

danke für den Code, der im Prinzip funktioniert. Ein Problem hat sich aber jetzt neu ergeben: Während die Ausführung meiner eingefügten Anweisung "von Hand" ausgelöst noch nicht einmal 1 sec. dauert,
so braucht es, in die Ereignisprozedur eingefügt ca. 20 sec.
Das Ergebnis ist eigentlich sehr schnell zu sehen, d.h., der aktualisierte Wert wird über die wiederhergestellte Formel angezeigt. Aber Excel rechnet noch lange weiter ( am unteren Rand des Blattes wird angezeigt (20 sec. lang) : Berechnete Zellen 100%.
Ich muss vielleicht noch anmerken, dass die Arbeitsmappe fast 7 MB groß ist.
Kann man noch etwas zu Beschleunigung tun ?

Gruß,

Peter.


  

Betrifft: AW: Ereignisprozedur von: Peter F.
Geschrieben am: 31.07.2008 17:26:23

Hallo Holger,



noch eine Anmerkung :



Wenn ich die Ausführung des Codes mit der Ereignisprozedur per [ESC] sofort unterbreche und dann mit "Beenden" aus VBA nach Excel wechsele, dann ist der neue Wert über die Formel fertig dargestellt.

Könnte man das , ich meine ESC o Ä. evtl. in den Code einfügen ?



Gruß,



Peter.


  

Betrifft: AW: Ereignisprozedur von: Erich G.
Geschrieben am: 31.07.2008 17:31:33

Hallo Peter,
ohne deinen Code kann man nur raten...

Probier mal eine dieser beiden Varianten aus:

Private Sub Worksheet_Change(ByVal Target As Range)
   Dim calS As XlCalculationState
   If Not Intersect(Target, Range("d21")) Is Nothing Then
      calS = Application.Calculation
      Application.Calculation = xlCalculationManual
      Application.EnableEvents = False
'
'      deine Anweisungen
'
      Application.Calculation = calS
      Application.EnableEvents = True
   End If
End Sub

Private Sub xWorksheet_Change(ByVal Target As Range)
   If Not Intersect(Target, Range("d21")) Is Nothing Then
      Application.EnableEvents = False
'
'      deine Anweisungen
'
      Application.EnableEvents = True
   End If
End Sub

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort


  

Betrifft: AW: Ereignisprozedur von: Peter F.
Geschrieben am: 31.07.2008 19:35:09

Hallo Erich,







ich kann nur sagen : ASTREIN !



Die erste Variante hat auf Anhieb wunderbar funktioniert.







Vielen Dank für deinen "Gehirnschmalz".







Gruß,







Peter (aus Moers)


  

Betrifft: AW: Ereignisprozedur - Korrektur von: Erich G.
Geschrieben am: 01.08.2008 19:13:46

Hallo,
in der ersten Variante muss calS anders deklariert werden, statt
Dim calS As XlCalculationState
sollte es besser heißen:
Dim calS As XlCalculation

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort


 

Beiträge aus den Excel-Beispielen zum Thema "Ereignisprozedur"