Microsoft Excel

Herbers Excel/VBA-Archiv

Worksheet_Change | Herbers Excel-Forum


Betrifft: Worksheet_Change von: ing.grohn
Geschrieben am: 04.03.2010 16:17:52

Hallo Forum,
der folgende Code ist im Code-Fenster von Tabelle1 abgelegt:
Ändere ich das Feld D18 und verlasse es, passiert nichts.
Wenn ich das Nachbarfeld ändere und verlasse, gibts die erwartete Reaktion:
Dim bln As Boolean

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim rng As Range

Target.Font.ColorIndex = 5
Set rng = Range("D18")
    If Target.Address = rng.Address Then bln = True
    If bln = True And Target.Address <> rng.Address Then
       Call testmakro
       bln = False
    End If
      
End Sub

Warum ist das so?
Bedankt für eine Antwort.
Mit freundlichen Grüßen
Albrecht

  

Betrifft: Worksheet_Change aber nicht so! von: Renee
Geschrieben am: 04.03.2010 16:26:15

Hi Albrecht,

Die Code-Konstruktion ist "durchgequirltes von Hinten durch die Brust ins Auge"....

WAS willst du erreichen ? 3 mal True/False IF und Vergleiche ist einfach irgendwie überflüssig!

GreetZ Renée


  

Betrifft: AW: Worksheet_Change aber nicht so! von: ing.grohn
Geschrieben am: 04.03.2010 16:33:37

Hallo Renee,
diese "durchgequirlte Scheisse" hat mir jemand aus dem Forum gegeben!
Wenn ein Feld geändert wird, sollte ein Makro starten (die Zeile mit der Farbe kanste vergessen!!)
Mit freundlichen Grüßen
Albrecht
(sag mir wie ichs machen muß, danke)


  

Betrifft: Damit du's auch verstehst,... von: Luc:-?
Geschrieben am: 04.03.2010 17:00:18

…Albrecht,
If Target.Address = rng.Address Then bln = True und If bln = True And Target.Address <> rng.Address Then widerspricht sich eigentl und ist deshalb vermutl so Quatsch, zumindest aber lt.Renée! Außerdem ist bln hier nicht deklariert und Einiges könnte man einfacher schreiben, zB…
bln = (Target.Address = rng.Address)
Wenn sich D18 ändert, entspricht Target auch D18. Damit ist dann bln = True. Das ist aber nur 1 Voraussetzung. Die 2. ist, dass die Adressen nicht übereinstimmen, also passiert auch nichts und bln bleibt True. Das wäre an sich nicht weiter schlimm, aber ich befürchte, das ist bei dir 'ne Globalvariable. Dann bleibt dieser Wert solange erhalten, bis mal deine 2.Bedingung voll erfüllt wird, also sowohl bln = True ist als auch die Adressen nicht übereinstimmen. Und das kann frühestens bei der nächsten Zelle der Fall sein, nachdem sich was in D18 geändert hat. Wurde testmakro aber aufgerufen, ist bln = False und alles beginnt von vorn.
Soweit die Theorie. Du musst beachten, dass jede andere Änderung auf dem Blatt ebenfalls diese Prozedur aufruft, wobei endlose Verschachtelungen entstehen können, die natürlich Auswirkungen auf eine Globalvariable bln haben können, so dass dein Konstrukt nicht mehr zuverlässig fktioniert. Deshalb schliesst man idR solche Verschachtelungen aus, indem man Application.EnableEvents zuvor und danach oder zumindest keine Globalvariablen verwendet.
Gruß Luc :-?


  

Betrifft: AW: Damit du's auch verstehst,... von: ing.grohn
Geschrieben am: 04.03.2010 17:14:13

Hallo Luc,
das hab ich sogar verstanden!
Vielen Dank
Mit freundlichen Grüßen
Albrecht
Ps ich bin nicht richtig firm was VBA angeht und übernehme Dinge und probiere aus. Machmal geht das auch daneben und machnmal spielt VBA sein eigenes Spiel !
Bin aber schon weit gekommen.


  

Betrifft: AW: Worksheet_Change von: Hajo_Zi
Geschrieben am: 04.03.2010 16:29:40

Hallo Albrecht,

wenn man sich noch ein wenig ansrenkt bekommt man das bestimmt noch erheblich komplizierter hin als Dein Vorschlag. Icch hätte nur

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    Target.Font.ColorIndex = 5 ' grundsätzlich
    If Target.Address = "$D$18" Then testmakro
End Sub

geschrieben.

GrußformelHomepage


  

Betrifft: AW: Worksheet_Change von: ing.grohn
Geschrieben am: 04.03.2010 16:36:20

Hallo Hajo,
funktioniert wie gewollt!!
Vielen Dank für die gewünschte Antwort
Mit freundlichen Grüßen
Albrecht


  

Betrifft: AW: Worksheet_Change von: Reinhard
Geschrieben am: 04.03.2010 16:32:14

Hallo Albrecht,

testmakro wird nie ausgeführt. bln kannste weglassen, die zwei IFs zu einem IF:

If Target.Address = rng.Address And Target.Address <> rng.Address Then

und das wird nie TRue

Gruß
Reinhard


  

Betrifft: AW: Worksheet_Change von: ing.grohn
Geschrieben am: 04.03.2010 16:39:05

Hallo Reinhard,
ich muß dir widersprechen:
Das Testmakro wird ausgeführt, wenn ich D18 ändere, dann verlasse (egal ob Enter, Tab oder Mouse) und anschließend das Nachbarfeld ändere und verlasse.
Vielen Dank
Mit freundlichen Grüßen
Albrecht