Markierung nicht löschen

16/12/2009 - 18:55 von Andreas H. | Report spam
Hallo Cracks ich nutze Excel 2003!

Mit einem Makro werden bei mir für eine Übersicht verschiedene Felder
gelb oder rot oder blau markerit, sobal ein bestimmter Buchstabe darin
eingegeben wird.
Wenn ich jetzt aber ein Feld einfach nur so einfàrben will und wo
anders wieder etwas eingebe, wird meine farbige formatierung von dem
Feld wo kein Buchstabe drin steht wieder "geweisst" :(
Wie kann ich das verhindern !?
Danke schon mal!
Hier das Makro:

Private Sub Worksheet_Calculate()

Dim RaBereich As Range, RaZelle As Range

Set RaBereich = Range("A1:AL37, D7:D12")

For Each RaZelle In RaBereich

If Not Intersect(RaZelle, RaBereich) Is Nothing Then

Select Case RaZelle.Value

Case "T"

' blau

RaZelle.Interior.ColorIndex = 5

Case "t"

' blau

RaZelle.Interior.ColorIndex = 5

*schnipp schnapp*

Case Else

' Keine

RaZelle.Interior.ColorIndex = xlNone

End Select

End If

Next RaZelle

Set RaBereich = Nothing

End Sub
 

Lesen sie die antworten

#1 Andreas Killer
17/12/2009 - 12:02 | Warnen spam
On 16 Dez., 18:55, "Andreas H." wrote:

Mit einem Makro werden bei mir für eine Übersicht verschiedene Felder
gelb oder rot oder blau markerit, sobal ein bestimmter Buchstabe darin
eingegeben wird.


Ich weiß nicht wie dieses Makro aussieht, aber Du brauchst es nicht!

Verwende das Change-Ereignis um die Zellen auf eine Verànderung durch
Eingabe zu überwachen und Deine Zellen zu fàrben.

Wenn ich jetzt aber ein Feld einfach nur so einfàrben will und wo
anders wieder etwas eingebe, wird meine farbige formatierung von dem
Feld wo kein Buchstabe drin steht wieder "geweisst" :(


Nun ja, ich sag mal Zufall, weil durch die Eingabe eine Berechnung des
Blattes ausgelöst wurde. Das muss aber bei einer Eingabe nicht immer
der Fall sein!

Wie kann ich das verhindern !?


Wenn Du eine andere Farbe wàhlst als die, die das Makro automatisch
setzt, dann frage die Farbe der Zelle vor dem Einfàrben ab.

schnipp
'Nicht zwischen Groß-/Kleinschreibung unterscheiden!
Option Compare Text

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Bereich As Range, R As Range
'Schnittmenge der geànderten Zellen und des Bereichs
Set Bereich = Intersect(Target, Range("A1:AL37, D7:D12"))
'Sind Zellen da?
If Bereich Is Nothing Then Exit Sub
'Jede Zelle einzeln àndern
For Each R In Bereich
Select Case R.Interior.ColorIndex
Case xlNone, 5
Select Case R.Value
Case "t"
' blau
R.Interior.ColorIndex = 5
Case Else
' Keine
R.Interior.ColorIndex = xlNone
End Select
Case Else
'Zelle wurde von Hand gefàrbt
End Select
Next
End Sub
schnapp

Andernfalls ist es nicht möglich, es sei denn Du verwaltest einen
Bereich der "von Hand" geànderten Zellen und prüfst diesen. Das ist
aber extrem aufwendig (evt. mit einem 2 "Synchron"-Blatt) und
schwierig zudem es kein Ereignis gibt mit dem Du das Einfàrben einer
Zelle ermitteln könntest, d.h. Du müsstest diese Zellen mit einem
gesonderten Makro erfassen/prüfen.

Weil Du das Calculate-Ereignis verwendet hast stellt sich eine weitere
Frage, ob Du Zellen überwachen möchtest die Formeln beinhalten.

Will man den Wert von Zellen überwachen die eine Formel beinhalten,
dann macht man dieses sinnvoller Weise im Calculate-Ereignis, denn das
Change-Ereignis tritt nicht ein, wenn sich Zellen wàhrend einer
Neuberechnung veràndern.

Dem Calculate-Ereignis fehlen jedoch jegliche Informationen darüber
welche Zellen gerade neu berechnet worden sind, d.h. man muss selber
die gewünschte Zelle überwachen.

Eine einfache Abfrage welchen Wert die Zelle gerade hat reicht oft
nicht aus, denn meistens möchte man ja nur dann reagieren wenn sich
der Wert tatsàchlich geàndert hat.

Dazu ist es unerlàßlich das man sich den Wert der Zelle merkt und mit
dem aktuellen Wert der Zelle vergleicht. Will man mehrere Bereiche
prüfen, dann ist der Programmieraufwand nicht ganz unerheblich.

Mit meinem WorksheetObserver beschrànkt sich der Aufwand auf wenige
Zeilen und ermöglicht dabei 2 Varianten.

Wenn Du das wirklich brauchst, dann bitte nochmal melden.


Noch ein bißchen konstruktive Kritik?

Hier das Makro:

Private Sub Worksheet_Calculate()
Dim RaBereich As Range, RaZelle As Range
Set RaBereich = Range("A1:AL37, D7:D12")
For Each RaZelle In RaBereich
If Not Intersect(RaZelle, RaBereich) Is Nothing Then


Diese IF-Abfrage hat keinen Sinn, weil durch die FOR EACH-Schleife
sichergestellt ist das RaZelle immer in RaBereich liegt.

Select Case RaZelle.Value
Case "T"


...
Case "t"


Will man Texte ohne Groß-/Kleinschreibung vergleichen gibt es mehrere
Möglichkeiten:

Durch "Option Compare Text" global im ganzen Modul.
Durch UCase() kann man einzelne Strings in Großbuchstaben, LCase in
Kleinbuchstaben, umwandeln.
Mit StrComp kann man mit der Option vbTextCompare 2 Strings
vergleichen.

Next RaZelle


Sehr ordentlich das Du hier RaZelle schreibst, bringt
Laufzeittechnisch nix, kann man weglassen, muss man aber nicht.

Set RaBereich = Nothing


Das brauchst Du nicht, Object-Variablen lösen sich bei End Sub
automatisch "in Luft auf".

Andreas.

Ähnliche fragen