AW: SelectionChange Ereignis löst nicht aus
21.05.2018 00:46:05
fcs
Hallo Raphi,
Worksheet_SelectionChange(ByVal Target As Range)
ist in deinem Fall nicht das geeignete Ereignis-Makro, denn dieses Ereignis-Makro wenn eine andere Zelle/anderer Zellbereich selektiert wird.
Du musst arbeiten mit
Worksheet_Change(ByVal Target As Range)
Diese Ereignis-Makro wird gestartet, wenn der Inhalt einer Zelle/eines Zellbereichs manuel oder per Makro geändert wird.
Der Variablen Target wird bei diesen beiden Ereignis-Makros die Zelle bzw. der Zellbereich zugewiesen der selektiert (bei Worksheet_SelectionChange) bzw. geändert (bei Worksheet_Change) wurde.
Des sollte/muss man in diesen Makros meistens mit der Variablen Target arbeiten und nicht mit ActiveCell, damit die Informationen korrekt verarbeitet werden.
In deinem Fall muss dazu Target als Parameter an das Makro Berechnung übergeben werden.
Weitere Punkte die zu Beachten sind:
Target kann auch mehrere Zellen beinhalten
Dies muss ggf. im Makro berücksichtigt werden, indem man z.B. alle Zellen in einer Schleife abarbeitet.
nicht erwünschter wiederholter Aufruf des Ereignis-Makros
Wenn ein Ereignis-Makro Aktionen ausführt (z.B. Werte in ein Tabellenblatt einträgt) dann ist es oft unerwünscht, dass diese Aktionen das Ereignis-Makro wiederholt auslösen.
Denn es verlängert sich die Makroausführung, im Extremfall gerät das Makro in eine Endlosschleife.
Dies kann man verhindern, indem man vorrübergehend die Ereignismakros deaktiviert.
Berechnungsmodus
Werden durch die Aktionen des Makros viele Berechnungsformel betroffen, sollte der Berechnungsmodus
vorrübergehend auf "manuelle Berechng" gesetzt werden, um sehr lange Ausführungszeiten eines Makros zu verhindern.
Nachfolgend der Code des T%abellenblatts angepasst.
Gruß
Franz
Option Explicit
Dim x As Double
Dim y As Double
Dim A As Double
Dim C As Double
Dim Q As Double
Dim Qnot As Double
Dim i As Integer
Dim j As Integer
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("A5:B20")) Is Nothing Then Exit Sub
Application.EnableEvents = False 'Ereignismakros deaktivieren
Call berechnung(Bereich:=Target)
Application.EnableEvents = True 'Ereignismakros wieder aktivieren
End Sub
Private Sub berechnung(Bereich As Range)
Dim Zelle As Range
For Each Zelle In Bereich.Cells
'~~~ einlesen der fixen Werte
x = Cells(1, 2)
y = Cells(2, 2)
'~~~ einlesen der variablen Werte
i = Zelle.Row 'Legt i auf die aktuell markierte Zeile fest
j = Zelle.Column
A = Cells(i, 1) 'einlesen von A aus der Zeile
C = Cells(i, 2) 'einlesen von c aus der Zeile
'~~~ Eigentliche Berechnung
Q = x * C * A * 1 / 10000
Qnot = (y - x * C) * A / 10000
'~~~ Ausgabe
Cells(i, 3) = Q
Cells(i, 4) = Qnot
Next Zelle
End Sub