Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1296to1300
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Hilfe bei Bedingter Formatierung

Hilfe bei Bedingter Formatierung
17.02.2013 15:05:16
Josef_T
Guten Tag zusammen,
kann mir bitte jemand einen Tipp geben, wie ich die Formel =V5=MAX(V:V) abändern muß, dass mir nur der jeweilige MAX Wert angezeigt wird?
Habe versucht mit "hinzufügen 2. Bedingung Schrift weiß", funktioniert aber nicht.
Danke schon mal
Josef

22
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Hilfe bei Bedingter Formatierung
17.02.2013 15:07:43
Hajo_Zi
Hallo Josef,
=V5MAX(V:V) und Schriftfarbe weiß.

AW: Hilfe bei Bedingter Formatierung
17.02.2013 15:21:05
Josef_T
Hallo Hajo,
habe mich wohl falsch ausgedrückt. Der Max-Wert soll natürlich schwarz sei, damit ich was zulesen habe. Alle anderen Werte die nicht dem Maxwert entsprechen, möchte ich nicht sehen, oder mit der Schriftfarbe weiß, abgedeckt werden.
Vielleicht ist es so verständlicher.
Josef

AW: Hilfe bei Bedingter Formatierung
17.02.2013 15:24:21
Hajo_Zi
Hallo Josef,
ich hätte vermutet das macht mein Vorschlag.
Ich baue keine Datei nach, die Zeit hat schon jemand investiert.
Ein Link zur Datei wäre nicht schlecht.
Gruß Hajo

Anzeige
Wir verstehen dich anscheinend richtig, ...
17.02.2013 16:02:11
Luc:-?
…Josef,
obwohl du dich recht verworren ausgedrückt hast (vgl meine 1.AW), nur du verstehst uns bzw die Lösungen nicht. Hajo schlägt fast dasselbe vor wie ich, nur umgekehrt und damit im Prinzip etwas einfacher (falls die Zellfarbe tatsächlich weiß/ungefärbt ist, was aus deiner Anfrage geschlossen wdn kann).
Aber viell verstehst du ja meine, bisher von dir ignorierte 1.AW besser. Ansonsten einfach mal ausprobieren!
Luc :-?

Unter der Voraussetzung, dass ...
17.02.2013 15:15:42
Luc:-?
…du eigentl Folgendes meinst, Josef,
Ich möchte von den Werten einer Spalte nur den größten Wert per BedingtFormatierung anzeigen lassen, kann das so erledigt wdn:
1. Schriftfarbe der ganzen Spalte in der Zellfarbe formatieren!
2. Auf die ganze Spalte eine BedingtFormatierung setzen → Typ Zellwert ist… → Modus gleich → Bedingungsfml: =MAX(V:V) → Format Schriftfarbe: schwarz
Gruß Luc :-?

Anzeige
AW: Unter der Voraussetzung, dass ...
17.02.2013 16:02:18
Josef_T
Hallo Luc,
erstmal Danke für die Formel. Deine Formel funktioniert, solange es Werte sind. Ich aber, habe in meiner Anfrage versäumt, zuerwähnen das es sich in der Spalte um Datum und Uhrzeit handelt, die durch dieses Makro ausgelöst werden:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Zelle As Range
If Intersect(Range("J5:L196"), Target) Is Nothing Then Exit Sub
Application.EnableEvents = False
For Each Zelle In Intersect(Range("J5:L196"), Target)
Range("V" & Zelle.Row) = Now
Next
Application.EnableEvents = True
End Sub
Ich weiß nicht, ob durch dises Makro die Datümer deshalb auch stehen bleiben, obwohl sie keinen MAX-Wert mehr haben.
Luc, tut mir leid, dass ich mich zu sehr auf die bedingte Formatierung konzentriert habe, womit ich
eigentlich nur die Datümer mit weiß abdecken wollte, die nicht mehr MAX sind.
Gruß
Josef

Anzeige
Na dann ja doch noch, aber ...
17.02.2013 16:26:05
Luc:-?
…was ist das für eine unmögliche Ereignisproz, Josef,
die bei jedem Neueintrag in J5:L196 in jede Zelle des Bereichs die augenblickliche Uhrzeit nebst Datum einzutragen scheint, aber das doch nur 1x in kaum überbietbarer „Von-hinten-durch-die-Brust“-Methodik für die geänderte Zelle macht? Auf welche Änderung wird denn da reagiert? Auf ein Maximum wird jedenfalls nicht geprüft!
Also ich weiß ja nicht, welches hilflose Hirn sich diese völlig verschwurbelte Proz ausgedacht hat, aber es steht zu befürchten, dass du damit eigentlich was ganz Anderes erreichen willst. Vielleicht solltest du jetzt endlich mal dein eigentliches Problem und damit Anliegen vortragen und uns nicht mit Bröckchen eigener Lösungsversuche und daraus entstehender Sekundärproblemchen fürs xl/vb-Nirvana denken lassen.
Luc :-?

Anzeige
AW: Luc:-? was zum schmunzeln
17.02.2013 18:21:25
Josef_T
Hallo Luc,
dass Hirnlose Programm, läuft seit ca. sechs Jahren ohne Probleme in einer Spedition. Es werden täglich von fast allen LKW´s mehrere Tankvorgänge eingetragen. Die Eingaben in Spalte J, werden sofort zur Spalte K übertragen und dort summiert. Dass Datum und die Uhrzeit vom jeweils letzten Vorgang, wird dann "von-hinten-durch-die-Brust" in Spalte V eingetragen.
Die Namen der Fahrer und die Kenndaten des Fahrzeuges ect. werden in den Spalten A:I eingetragen.
Mit MAX() habe ich lediglich das jüngste Datum und die Uhrzeit ermittelt.
Das Problem bei den Usern ist, dass es sehr verwirrend ist das jeweils jüngste Datum zu finden.
Deshalb meine Anfrage, ob man ausser dem jüngsten Datum, alle anderen Datümer in Spalte V unsichtbar
machen kann.
Gruß
Josef

Anzeige
Ja, das würde so gehen wie schon ...
17.02.2013 18:45:30
Luc:-?
…beschrieben, Josef,
das Pgm sollte darauf keinen Einfluss haben. Aber evtl sind da noch andere wirksam…?
Luc :-?

AW: Danke Luc und Hajo, werde es versuchen owT...
17.02.2013 18:54:16
Josef_T
.

Mal zur Erläuterung der Proz, ...
17.02.2013 19:45:29
Luc:-?
…Josef;
merkwürdig ist…
For Each Zelle In Intersect(Range("J5:L196"), Target)
Range("V" & Zelle.Row) = Now
Next
Intersect ist hier nicht mehr erforderlich, denn die Änderungsfälle in anderen Bereichen wurden bereits zuvor mit Intersect ausgeschlossen. Das Target, das hier die geänderte Zelle repräsentiert, liegt also bereits im relevanten Bereich. Das Intersect bewirkt hier nur, dass auch genau dieses Target als Bezugsbereich ausgewählt wird. Damit hat dieser nur eine Zelle, wodurch die Schleife auch stets nur 1× durchlaufen wird, also überflüssig ist. Die Objekt-Laufvariable Zelle repräsentiert somit ebenfalls Target. Da das so ist, ist es zwar nicht ganz überflüssig, mit Zelle.Row die Zeile von Target zu bestimmen, aber mit ihrer Hilfe über Range die Zelle für den Datumseintrag in Spalte V zu ermitteln. Das macht man hier besser mit Cells, da der Eintrag in unterschiedl Spalten erfolgen kann, sonst käme auch Offset infrage. Somit ergäbe sich flgd Prozedur:
Private Sub Worksheet_Change(ByVal Target As Range)
Const adRelBereich$ = "J5:L196", nrDatNotatSp As Long = 22
If Not Intersect(Target, Range(adRelBereich)) Is Nothing Then
With Application
.EnableEvents = False
Me.Cells(Target.Row, nrDatNotatSp) = Now
.EnableEvents = True
End With
End If
End Sub
Die beiden Konstanten am Prozeduranfang machen diese „pflegeleichter“ → man muss bei Änderungen nicht die ganze Proz durchsuchen (was hier allerdings kein Problem wäre). Die direkte Einbindung der Behandlungsroutine in das If-Konstrukt zu Intersect wurde gewählt, um hier ggf später weitere Pgm-Verzweigungen mit ElseIf einbinden zu können → merke: Es ist nur eine Change-Proz direkt im Dokument-Klassenmodul des Blattes möglich (eine weitere in dem der Mappe und noch eine zur ganzen Application [Xl], deren Klassenmodul aber standardmäßig nicht vorbereitet ist)!
Gruß Luc :-?

Anzeige
AW: Mal zur Erläuterung der Proz, ...
17.02.2013 21:29:24
Josef_T
Hallo Luc,
jetzt, wo ich Deinen Code sehe und auprobiert habe, finde ich meinen Code auch merkwürdig.
Luc, ich wußte es damals und bis Heute nicht besser. Ich war damals froh, dass die Ergebnisse richtig dargestellt wurden. Umso mehr freue ich mich über Deinen Code, weil er nicht nur klasse funktioniert, sondern auch über Deine Erklärung zum nachvollziehen warum das so sein soll.
Herzlichen Dank Luc und Gute Nacht!
Gruß
Josef

Bitte sehr, dito! owT
17.02.2013 21:45:38
Luc:-?
:-?

Vom Sinn zum Unsinn zu Sinn
19.02.2013 13:43:45
EtoPHG
Hallo Josef,
IMHO macht dein Ereigniscode durchaus Sinn und der Luc'sche Argumentation kann ich nichts abgewinnen.
Sein Code funktioniert zwar, aber nur genau dann, wenn in einer einzigen Zelle des Bereichs eine Eingabe gemacht wird. Wird hingegen in mehreren Zelle gleichzeitig eine Eingabe gemacht (z.B. durch Copy/Paste, oder das markieren eines ganzen Bereichs und Eingabe mit Ctrl-Enter), wird bei deinem Code in jeder veränderten Zeile ein Datums-Eintrag gemacht und nicht nur in der Ersten. Das Wiederholen und Prüfen des Intersect-Bereichs macht also ganz klar Sinn. Auf eine Bed. Formatierung würde ich in deine Fall verzichten und einfach nur den letzten Eintrag (=jüngster Eintrag) entsprechend markieren.
Also etwa so:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Zelle As Range
If Intersect(Range("J5:L196"), Target) Is Nothing Then Exit Sub
Application.EnableEvents = False
With Range(Cells(5, 22), Cells(Rows.Count, 22).End(xlUp))
.Font.Color = .Interior.Color
For Each Zelle In Intersect(Range("J5:L196"), Target)
Cells(Zelle.Row, 22) = Now
Cells(Zelle.Row, 22).Font.ColorIndex = xlColorIndexAutomatic
Next
End With
Application.EnableEvents = True
End Sub
Gruess Hansueli

Anzeige
Nett, dass du deinen Beitrag NICHT unter den ...
19.02.2013 15:49:10
Luc:-?
…mit seinem Code gesetzt hast, Hansueli…! :-/
Aber ich kann mich ja noch gut erinnern.
Mein Code deckt den Normalfall ab — es wird flfd einzeln eingetragen! Von erstmaligem MxFml-Eintrag (deine 2.Variante für mehrzelliges Target) oder Copy'n'Paste (schon gar nicht über den relevanten Bereich hinaus) war nicht die Rede. Also muss man auch nicht diese Umständlichkeit bei jeder Change-Aktion in Kauf nehmen. Falls tatsächlich so etwas im Büro-Alltag auftreten sollte, kann man das ganz einfach am PgmAnfang mit If Target.Count > 1 Then Exit Sub ausschließen.
Gruß Luc :-?

Anzeige
Beitrag in falscher Hierarchiestufe und anderes...
19.02.2013 16:22:11
EtoPHG
Hallo Luc,
Ich werde mich in Zukunft bemühen die Hierarchieebene des Threads bei der Antwort besser zu berücksichtigen ;-)
Das du mit 'Falls tatsächlich so etwas im Büro-Alltag auftreten sollte' argumentierst, sehe ich im Widerspruch zur Aussage von Josef: 'Es werden täglich von fast allen LKW´s mehrere Tankvorgänge eingetragen.'. Warum könnte hier nicht ein mehrzeiliges Target vorkommen? Die Restriktion auf Target.Count = 1 hat gem. meinen Erfahrung schon öfter zu Unmut der Benutzer geführt.
Ebenfalls nicht verständlich (für mich) ist Dein: schon gar nicht über den relevanten Bereich hinaus. Intersect ist ja nur eine Schnittmenge des zu überwachenden Bereichs mit dem veränderten Bereich. Und das Change Ereignis wird m.W. nur genau 1 Mal getriggert, egal ob ich eine Zelle oder einen Bereich verändere; sprich nicht mehrmals bei einer Bereichsänderung.
Gruess Hansueli

Anzeige
Nun gut, fragen wir mal wie du dir das ...
19.02.2013 18:22:55
Luc:-?
…vorstellst, Hansueli;
Es werden täglich von fast allen LKWs mehrere Tankvorgänge eingetragen.
Alle auf einmal? Welcher „LKW“ kommt auf die Idee, das mit MxFml und MxKonstante zu machen (zB {={1.2.3}})? Oder wird erst auf ein Hilfsblatt geschrieben und dann im Block kopiert? Davon stand nichts in der Aufgabenstellung!
Also kann die Abfrage der Einzelligkeit durchaus benutzt wdn, um die Proz nicht unnötig bei irgendwelchen Copy'n'Paste-Vorgängen, die ja tatsächlich anfallen könnten, auszulösen. Soll aus dem relevanten Bereich woanders hin kopiert wdn, wird die Proz zZ ohnehin nicht benötigt. Soll sie später entsprechend ergänzt wdn, muss das natürlich beachtet wdn.
Problematisch könnte's höchstens beim Löschen/Ausschneiden ganzer Zellbereiche im Relevanzbereich wdn, aber das wird durch eine Einzelligkeitsprüfung ja auch abgefangen. Für das Löschen könnte man natürlich noch einen Zyklus unter einem ElseIf zur Einzelligkeit hinzufügen, aber das könnte bei einer operativen Tabelle selten der Fall sein, es sei denn, irgendein „LKW“ irrt sich mal (oder öfter). Aber diese Rahmenbedingungen kennen wir nicht, weil sie nicht mitgeteilt wurden.
Im ursprünglichen Code wird ja ganz am Anfang schon Intersect bemüht. Bliebe nur zu prüfen, ob ein mehrzelliges Target, das nur teilweise mit dem relevanten Bereich übereinstimmt, ein Nothing ergibt oder nicht, was ich im Moment nicht kann → glaube aber, wird Nothing sein.
Die Auslösung des Events erfolgt tatsächlich nur 1x pro Änderung, nicht unbedingt pro Zelle, aber das hat doch eigentl wenig mit der als üblich vorausgesetzten Arbeitsweise zu tun. Insofern sind deine Einwände, auf den konkreten Fall bezogen, eher theoretischer Natur.
Übrigens hast du bei deinem Code meine pflegefreundliche Anregung nicht übernommen. Ist zwar hier nicht wichtig, aber man sollte sich so etwas zur Gewohnheit machen — der Änderer/Anpasser wird's dir danken. ;-)
Luc :-?

AW: Nun gut, fragen wir mal wie du dir das ...
20.02.2013 15:21:28
EtoPHG
Hallo Luc,
Ich glaube wr können die Diskussion hier beenden.
Dein Zitat:
Im ursprünglichen Code wird ja ganz am Anfang schon Intersect bemüht. Bliebe nur zu prüfen, ob ein mehrzelliges Target, das nur teilweise mit dem relevanten Bereich übereinstimmt, ein Nothing ergibt oder nicht, was ich im Moment nicht kann → glaube aber, wird Nothing sein.
zeigt mir, dass du die Intersect Methode nicht begreifst, andernfalls kämst du nicht auf eine solch irrigen Glaubens-Annahme!
Gruess Hansueli

Du scheinst dich ja hier als ...
20.02.2013 18:56:54
Luc:-?
…„Meister Arroganz“ outen zu wollen, mein Lieber! :->
Glaube kaum, dass dir das auf die Dauer bekommt. Kann mich nämlich erinnern, dass es erst ein paar Jahre her ist, dass du hier selber Fragen gestellt hast. Such doch mal nach Frage-Threads von mir! :->
Da kommt der mir doch tatsächlich mit so einer Intersect-Schwurbelei! Hast du keine anderen Probleme? Natürlich weiß ich, was zB die FmlSchreibung (A1:C4 B3:B5) bedeutet. Da käme ein Bereich bei raus. Wenn das bei Intersect auch so ist, ist das OK, hätt' ich bloß lieber erst getestet. Im Übrigen habe ich schon UDFs geschrieben, die Vglbares mit Textlisten machen → wo sind deine?
Aber zu meinen eigentlichen Argumenten ist dir natürlich nichts eingefallen, weshalb du wohl meinst, dich so ohne Gesichtsverlust in dein Bergdorf zurückziehen zu können… ;->
Glücklicherweise ist der Thread ja schon längst erledigt und auch keine Benachrichtigung eingestellt. Nur spätere Archivnutzer dürfen sich dann daran erfreuen.
Luc :-?

Ich hab keine Probleme, ich löse welche (owT).
20.02.2013 21:41:15
EtoPHG

No Comment!
20.02.2013 22:50:48
Luc:-?
:-?

Nachtrag für Nachnutzer
21.02.2013 13:40:03
Luc:-?
Im Prinzip sollte der den 2.Teil des Threads begründende Einwurf wohl darauf hinweisen, dass die übliche Verwendung der vbFkt Intersect genau dann Gefahren birgt, wenn das Target einen Zellbereich aus mehr als einer Zelle umfasst, da sie die Schnittmenge [en Intersection (set theory), the set of elements common to some collection of sets, Zitat Wikipedia] der als Argumente angegebenen Zellbereiche zurückgibt. Insofern könnte das auch bei Change-Ereignissen ein Problem, dürfte aber eher ein Ausnahmefall sein. Deshalb sollte es ggf auch berücksichtigt wdn, indem man bei Irrelevanz Zellbereiche entweder ganz ausschließt oder mit Target(1) arbeitet, was stets nur der 1.Zelle von Target entspricht, die im Normalfall hier das ganze Target repräsentiert.
Anderenfalls, wenn Zellbereiche als Target zugelassen wdn müssen bzw dürfen, müssten tatsächlich alle Zellen des Targets oder eben besser seiner Schnittmenge mit dem relevanten Bereich (sicherheitshalber, falls nicht garantiert wdn kann, dass Target in Gänze innerhalb des relevanten Bereichs liegt) durchlaufen wdn.
Der Wirkung der vbFkt Intersect entspricht in XlFmln die Bereichsschreibweise mit Schnittmengenoperator Leerzeichen, also zB (A1:D5 B3:C7), was dem Zellbereich B3:C5 entspricht. Mit der vbFkt können auf einfache Weise auch Schnittmengen zusammengesetzter Bereiche (sog Mehrfachauswahlen) gebildet wdn, die ebenfalls zusammengesetzte Bereiche sein können. Das würde sich mit den entsprd Operatoren Semikolon und Leerzeichen in Bezugsschreibweise wohl etwas komplizierter darstellen und ist auch nicht zu jeder XlFkt als Argument angebbar.
Nichtsdestotrotz ist die einfache Form einer Change-Prozedur mit Target-Relevanzprüfung aber kein „Unsinn“ (Zitat), sondern nur nicht ganz DAU-sicher. Hier gilt es ggf abzuwägen, was unter den jeweils gegebenen Voraussetzungen vorteilhafter ist.
Luc :-?

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige