Severus schrieb am 23.11.2010 02:00:28:
Sonja schrieb am 23.11.2010 00:37:13:
Severus schrieb am 22.11.2010 10:44:45:
Sonja schrieb am 22.11.2010 04:51:41:
Sonja schrieb am 22.11.2010 01:00:06:
Severus schrieb am 19.11.2010 04:33:09:
Sonja schrieb am 19.11.2010 02:58:45:
Hallo,
gibt es eine möglichkeit mit hilfe von vba, bei Wertänderung einer Zelle einen schon geschriebenen code "ablaufen" zulassen und somit die tabelle zu aktualisieren? und somit ohne "extra" Button.
ich hoffe mich halbwegs verständlich ausgedrückt zu haben.
vielen Dank.
Sonja
Hallo Sonja,
leider ist das nicht so klar wie es zu wünschen wäre.
Natürlich kannst Du einen Code ablaufen lassen, wenn Du eine Zelle änderst.
Dazu müsstest Du im Klassenmodul des betreffenden Arbeitsblattes
(z.B. Tabelle1(Tabelle1))
eine Prozedur
Private Sub Worksheet_Change(ByVal Target as Range)
...Dein Code...
End Sub
einrichten. Ich weiß natürlich nicht, was Dein Code bewerkstelligen soll und ob er bei Änderungen in jeder Zelle oder z.B. nur in einer einzigen Zelle oder nur bei einer Zeile oder einer Spalte stattfinden soll.
Bei nur einer Zelle müsstest Du z.B. den Code
If Target.Address <> "$A$1" Then Exit Sub
vor Deinem Code einfügen ($A$1 durch die entsprechende Zelladresse ersetzen). Für eine Zeile oder Spalte entsprechend
If Target.Row <> 7 Then Exit Sub (oder auch > 9, 7 Then Exit Sub (wie Zeile)
Dann würde der Code nur ausgeführt, wenn die Bedingungen erfüllt sind.
Wenn Dein Code Werte in die Tabelle schreibt müsstest Du zusätzlich vor Deinen Code
Application.EnableEvents = False
und nach Deinem Code
Application.EnableEvents = True
schreiben. Sonst löst jede Änderung durch Deinen Code die Prozedur wieder neu aus, da sie ja die Tabelle ändert.
Sollte Dein Code langwierige Operationen mit vielen Zell- oder Blattwechseln ausführen empfiehlt sich zusätzlich das Paar
Application.ScreenUpdating = False
...
Application.ScreenUpdating = True
Das beschleunigt den Code, da die Anzeige nicht aktualisiert wird solange der Code abläuft.
Severus
Hi Vielen vielen Dank soweit,
hat super funktioniert!!!!1
kann man dann auch noch ein paar ranges miteinander kombinieren... zur zeit luft das von ("B7:E107"). Wie kann ich jetzt noch ("J7:N107") mit einbinden ohne die ganze sachen nochmal hinzuschreiben?
beste grüße sonja
Hallo nochmal
also soweit funktoniert wie gesagt alles bestens nur leider ach außerhalb der ranges. ich habe die ranges wie besagt wie folgt eingegeben:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> ("B7:E107,G7:G107,I7:N107,Q7:Q107") Then
Application.EnableEvents = False
Call run
Application.EnableEvents = True
Exit Sub
End If
End Sub
nun kommt es dazu , dass auch außerhalb der ranges bei wertänderung alles aktualisiert wird.
hat jemand eine idee dazu?
vielen dank,
sonja
Adressen von Target.Address werden grundsätzlich als absolute Bezüge ausgegeben. Deine Restriktion wirkt also nicht. Du mußt die $-Zeichen hinzufügen wie in meiner ersten Antwort.
Severus
Hi,
Vielen Dank nochmal für deine Zeit und Hilfe aber
ich habe das jetzt in der Form:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> ("$B$7:$E$107,$G$7:$G$107,$I$7:$N$107,$Q$7:$Q$107") Then
Application.EnableEvents = False
Call run
Application.EnableEvents = True
Exit Sub
End If
End Sub
versucht und leider reagiert es immer noch bei wertänderung außerhalb der ranges?
Hast du vieleicht noch ne Idee?
beste Grüße,
Sonja
Hab mir das überlegt. Du verwendest in Deinem Fall besser die Intersect Methode:
Dim rngISECT as Range
Set rngISECT = Application.Intersect(Target, Range("B7:E107,G7:G107,I7:N107,Q7:Q107"))
If rngISECT is Nothing Then Exit Sub
Severus
Hi,
also irgendwas muss ich falsch machen ich schreib den code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngISECT As Range
Set rngISECT = Application.Intersect(Target, Range("B7:E107,G7:G107,I7:N107,Q7:Q107"))
If rngISECT Is Nothing Then
Application.EnableEvents = False
Call run
Application.EnableEvents = True
Exit Sub
End If
End Sub
und trotzdem reagiert es außerhalb der range?
|