Discussion:
Werte in Bereich vergleichen
(zu alt für eine Antwort)
Volker Neurath
2013-07-08 08:11:43 UTC
Permalink
Hi zusammen,

Folgendes Problem :

In einem Bereich aus drei Spalten möchte ich prüfen, ob die Werte
einer Zeile einer bestimmten Bedingung entsprechen.

Angenommen, die drei Spalten sind E F G.
Dann ist zu prüfen ob :
E4<F4<G4
E5<F5<G5

usw.

Wie stelle ich das am sinnvollsten an?
--
Claus Busch
2013-07-08 08:26:53 UTC
Permalink
Hallo Volker,
Post by Volker Neurath
In einem Bereich aus drei Spalten möchte ich prüfen, ob die Werte
einer Zeile einer bestimmten Bedingung entsprechen.
Angenommen, die drei Spalten sind E F G.
E4<F4<G4
E5<F5<G5
eigentlich bräuchtest du nur zu prüfen, ob E4 das Minimum und G4 das
Maximum ist, also:
=E4=MIN(E4:G4) und =G4=MAX(E4:G4)
Du brauchst sowieso immer nur 2 Werte zu prüfen. Denn wenn bei denen die
Bedingung erfüllt ist, ist die dritte Bedingung auch erfüllt.
Du kannst auch z.B. prüfen:
=E4=MIN(E4:G4) und =F4=KKLEINSTE(E4:G4;2)
Wenn du das in einer Formel haben möchtest, kannst du das mit
=UND(E4=MIN(E4:G4);G4=MAX(E4:G4))
testen.


Mit freundlichen Grüßen
Claus
--
Win XP Prof SP3 / Vista Ultimate SP2
Office 2003 SP3 /2007 Ultimate SP3
Claus Busch
2013-07-08 09:23:59 UTC
Permalink
Hallo Volker,
Post by Claus Busch
=UND(E4=MIN(E4:G4);G4=MAX(E4:G4))
du kannst aber auch testen, ob F4 in der Mitte liegt:
=UND(F4>E4;F4<G4)


Mit freundlichen Grüßen
Claus
--
Win XP Prof SP3 / Vista Ultimate SP2
Office 2003 SP3 /2007 Ultimate SP3
Volker Neurath
2013-07-08 16:37:17 UTC
Permalink
Am Mon, 8 Jul 2013 10:26:53 +0200
Post by Claus Busch
eigentlich bräuchtest du nur zu prüfen, ob E4 das Minimum und G4 das
=E4=MIN(E4:G4) und =G4=MAX(E4:G4)
Uff!
Daran hab ich gleich *gar nicht* gedacht...

Hab mir jetzt ein VBA gebastelt, dass so aussieht:
----
Function CheckPricing() As Boolean
Dim c As Range, dp As Range
Dim lastrow As Long

CheckPricing = True

With Worksheets("Produktliste")
lastrow = .Range("I" & Rows.Count).End(xlUp).Row
Set dp = .Range("I4:I" & lastrow)
End With

For Each c In dp
If c.Value > c.Offset(0, 1).Value Or c.Value > c.Offset(0,
2).Value _ Or c.Offset(0, 1).Value > c.Offset(0, 2).Value _
Then
CheckPricing = False
c.Interior.Color = vbRed
c.Offset(0, 1).Interior.Color = vbRed
c.Offset(0, 2).Interior.Color = vbRed
Else
c.Interior.Color = xlNone
c.Offset(0, 1).Interior.Color = xlNone
c.Offset(0, 2).Interior.Color = xlNone
End If
Next

End Function
----

Dieses rufe ich im Workbook_BeforeSave Event auf (da wird auch noch was
anderes geprüft) und wenn da was nicht passt, werden die Zellen
eingefärbt und der Speichervorgang abgebrochen.
Ursprünglich hatte ich vorgehabt, sogar nur jeweils die Zellen einer
zeile einzufärben, mit denen was nicht stimmt, also z.B.

E4=1000
F4=890
G4=1500

Dann würden E4 und F4 eingefärbt, weil hier evtl. ein "Dreher" vorliegt.
Bei
E4=890
F4=1500
G4=1000
würden dann analog dazu F4 und G4 eingefärbt und bei

Das aber würde das VBA eher aufwändiger machen - oder?
(Spontan fällt mir dazu jetzt nur ein, das mittels
SELECT... CASE...END CASE
zu machen.


Volker
der weiss, dass die Prozedur zu komplziert gestrickt ist...
Claus Busch
2013-07-08 17:26:40 UTC
Permalink
Hallo Volker,
Post by Volker Neurath
Dieses rufe ich im Workbook_BeforeSave Event auf (da wird auch noch was
anderes geprüft) und wenn da was nicht passt, werden die Zellen
eingefärbt und der Speichervorgang abgebrochen.
Ursprünglich hatte ich vorgehabt, sogar nur jeweils die Zellen einer
zeile einzufärben, mit denen was nicht stimmt, also z.B.
du brauchst doch eigentlich keinen Eintrag in der Tabelle, wenn die
Zellen gefärbt werden. Dann reicht doch auch eine Prozedur anstatt einer
Function. So sollte es reichen:

Sub CheckPricing()
Dim c As Range, dp As Range
Dim lastrow As Long

With Worksheets("Produktliste")
lastrow = .Range("I" & .Rows.Count).End(xlUp).Row
Set dp = .Range("I4:I" & lastrow)
End With

For Each c In dp
If c < c.Offset(0, 1) And c.Offset(0, 1) < c.Offset(0, 2) Then
c.Offset(, -1).Resize(, 3).Interior.ColorIndex = xlNone
Else
c.Resize(, 3).Interior.ColorIndex = 3
End If
Next
End Sub


Mit freundlichen Grüßen
Claus
--
Win XP Prof SP3 / Vista Ultimate SP2
Office 2003 SP3 /2007 Ultimate SP3
Claus Busch
2013-07-08 17:32:11 UTC
Permalink
Hallo Volker,
Post by Volker Neurath
For Each c In dp
If c < c.Offset(0, 1) And c.Offset(0, 1) < c.Offset(0, 2) Then
c.Offset(, -1).Resize(, 3).Interior.ColorIndex = xlNone
Else
c.Resize(, 3).Interior.ColorIndex = 3
End If
Next
End Sub
falschen Code kopiert :-(
probiere die Schleife so:

For Each c In dp
If c < c.Offset(0, 1) And c.Offset(0, 1) < c.Offset(0, 2) Then
c.Resize(, 3).Interior.ColorIndex = xlNone
Else
c.Resize(, 3).Interior.ColorIndex = 3
End If
Next


Mit freundlichen Grüßen
Claus
--
Win XP Prof SP3 / Vista Ultimate SP2
Office 2003 SP3 /2007 Ultimate SP3
Volker Neurath
2013-07-08 18:15:57 UTC
Permalink
Hi claus,

ich habs als Funktion gemacht, um auf diese Weise Boolean=FALSE
an die Aufrufende Sub (Workbook_BeforeSave) zurückzugeben, wenn die
Funktion einen Fehler ermittelt; dieser
Wert wird im Workbook_BeforeSave Event ausgewertet und im Fall
False ist dann dort Cancel=True.

Am Mon, 8 Jul 2013 19:32:11 +0200
Post by Volker Neurath
For Each c In dp
If c < c.Offset(0, 1) And c.Offset(0, 1) < c.Offset(0, 2) Then
c.Resize(, 3).Interior.ColorIndex = xlNone
Else
c.Resize(, 3).Interior.ColorIndex = 3
End If
Next
Werde ich testen, danke.

Lesen Sie weiter auf narkive:
Loading...