PDA

Vollständige Version anzeigen : Wenn kein Minimun vorhanden, dann nimm erst gefundenen Wert


Vigo2
01.07.2014, 14:39
Hallo zusammen!

Ich versuche gerade einen Code zu schreiben und stoße an meine Grrenzen.
Der Code soll folgendes machen:
Wenn Wert x und Wert y mehr als einmal vorkommen, dann sollen er deren Werte in Spalte N verglichen werden (zu vergleichende Werte mind. 2). Wenn da ein Minimum vorhanden ist, dann tue ...
Nun das Problem: wenn kein Minimum vorhanden, dann nimm den zuerst gefundenen Wert.
Wie drückt man das letzte aus?

Hier ein Ausschnitt meines Codes:

For rr = 2 To lol
If Range("D" & rr) <> "" Then
With Range("D" & rr + 1 & ":D" & lol + 1)
If Cells(rr, 4) > 1 Then
If Cells(rr, 4).Offset(0, -2) > 1 Then
Set rangemin = Worksheets("Datenzusammenführung").Range("N2:N" & lol)
ut = Worksheet.Function.Min(rangemin)
ut.Offset(rr, -2) = ut.Offset(rr, -2).Value
If Cells(rr, 4).Offset(0, 10).Value > ut Then
Cells(rr, 4).Offset(0, 8) = ""
End If
If ut = "" Then...

Habt ihr eine Idee wie man das ausdrücken kann?

Viele Grüße, Vigo

chris-kaiser
01.07.2014, 14:51
Hi,

Ich versuche gerade einen Code zu schreiben und stoße an meine Grrenzen.
Der Code soll folgendes machen:
Wenn Wert x und Wert y mehr als einmal vorkommen, dann sollen er deren Werte in Spalte N verglichen werden (zu vergleichende Werte mind. 2). Wenn da ein Minimum vorhanden ist, dann tue ...
Nun das Problem: wenn kein Minimum vorhanden, dann nimm den zuerst gefundenen Wert.
Wie drückt man das letzte aus?

Wenn 5 und 3 mehr als einmal vorkommen, dann soll er deren? Werte in Spalte N vergleichen (mindestens zwei Werte???) wenn nun kein Minumum ??? gefunden wird, dass es aber immer aus Werten gibt, dann nimm den ersten Wert.

hmm, ich vermute mal das löst keiner hier.
Aber vielleicht täusche ich mich ja.

Vigo2
01.07.2014, 18:24
So ich hab mich noch einmal versucht:

Option Explicit

Sub zz()

Dim lZei As Long
Dim rangemin As Range
Dim ut As Long
Dim lol As Long


Application.ScreenUpdating = False
lol = Worksheets("Datenzusammenführung").Cells(Rows.Count, 1).End(xlUp).Row
For lZei = Worksheets("Datenzusammenführung").Cells(Rows.Count, 4).End(xlUp).Row To 1 Step -1
If Application.WorksheetFunction.CountIf(Columns(4), Range("D" & lZei).Value) > 1 Then
If Application.WorksheetFunction.CountIf(Columns(2), Range("B" & lZei).Value) > 1 Then
ut = WorksheetFunction.Min(Columns(14))
If Cells(lZei, 14) > ut Then
Cells(lZei, 14).Offset(0, -2) = ""
else if ut="" then

...

End If
End If
End If
Next lZei
Application.ScreenUpdating = True

End Sub

Diser Code funktioniert so auch. Ich würde nun aber gerne mit aufnehmen wollen, dass wenn kein Minimum gefunden wurde (Minimum ist in ut zu finden), dann soll der Wert in Spalte N des zuerst gefundenen Zeile, die die Kriterien (Abschnitt:
If Application.WorksheetFunction.CountIf(Columns(4), Range("D" & lZei).Value) > 1 Then
If Application.WorksheetFunction.CountIf(Columns(2), Range("B" & lZei).Value) > 1 Then erfüllt, als Minimum gesetzt werden.

Ich hoffe, es ist nun deutlicher geworden, was ich meine. Weiß jemand wie ich sagen kann: Nimm erste Zeile, die die Kriterien erfüllt??

Viele Grüße, Vigo2

chris-kaiser
02.07.2014, 08:28
Hallo Vigo,

da ut als Long deklariert ist, kann
else if ut="" then

mal nie gehen, da "" für einen String gilt
und die Zeile müsste bei Dir ROT sein da es Syntaktisch so aussehen sollte
elseif ut="" then

ut könnte den Wert Null (0) annehmen.
Aber nur dann wenn in Spalte 14 nichts stehen würde, ist das der Fall?

ich habe deinen Code ein wenig dokumentiert, aber Lösung habe ich keine, da ich die Logik daraus noch nicht verstehe

Sub zz()

Dim lZei As Long
Dim rangemin As Range
Dim ut As Long
Dim lol As Long

'Bildschirmaktivität ausschalten
Application.ScreenUpdating = False
'letzte befüllte Zeile im Sheet Datenzusammenführung in Spalte A
lol = Worksheets("Datenzusammenführung").Cells(Rows.Count, 1).End(xlUp).Row
'Schleife die zeilenweise in diesem Blatt in Spalte D rückwärts durchlaufen wird
For lZei = Worksheets("Datenzusammenführung").Cells(Rows.Count, 4).End(xlUp).Row To 1 Step -1
'Wenn Zählenwenn Suchbereich:SpalteD die jeweilige Zelle in Spalte D größer als 1 ist (also zumindest doppelt) dann
'********************
'wobei ab hier nur mehr das aktive Blatt abgefrag wird!!!!! da fehlt Worksheets("Datenzusammenführung")
'********************
If Application.WorksheetFunction.CountIf(Columns(4), Range("D" & lZei).Value) > 1 Then
'wenn nun auch Zählenwenn der Spalte B jeweilige Zelle in Spalte B größer als 1 ist (also auch doppelt) dann
If Application.WorksheetFunction.CountIf(Columns(2), Range("B" & lZei).Value) > 1 Then
'nimm das Minimum der Spalte N des aktiven Blattes
ut = WorksheetFunction.Min(Columns(14))
'wenn nun der Wert der jeweiligen Zeile der Schleife in Spalte N größer als das Minimum der Spalte N dann
If Cells(lZei, 14) > ut Then
'soll in der Spalte L der wert der jeweiligen Zeile auf leer gesetzt werden
Cells(lZei, 14).Offset(0, -2) = ""
'das kann jetzt nicht mehr gehen, wenn in N eine Zahl vorkommt......
ElseIf ut = "" Then

'...

End If
End If
End If
Next lZei
'Bildschirmaktivität einschalten
Application.ScreenUpdating = True

End Sub

Vigo2
08.07.2014, 14:14
Hallo zusammen!

Tut mir leid, dass ich mich schon so lang nicht gemeldet hab. Ich musste das Thema nach hinten schieben. Ich suche jedoch immer noch eine Lösung dafür.
Ich hab eine Beipieldatei hochgeladen um das Ganze näher zu erläutern. Ich glaube, dass eine andere Herangehensweise, das Ganze einfacher macht (finale Herangehensweise: ist abgesprochen und wird von meiner Seite nicht mehr angepasst).

Für alle Werte in Spalte D, deren Inhalt größer als 2 Zeichen ist, soll folgendes gemacht werden:
Schaue wie oft der Wert in Spalte B vorkommt.
Wenn der Wert genau 1 mal vorkommt, dann setzte in Spalte L ein "x".
Wenn der Wert in Spalte B mehrfach vorkommt, dann suche den Wert in Spalte D mit der maximalen Zeichenanzahl und setzte in Spalte L ein "x" (auf derselbe Höhe wie das gefundene Maximum).
Wenn das Maximum mehrfach vorkommt, dann setzte jeweils immer ein "x" in Spalte "L" ein.

Ich hoffe, dass diesmal etwas deutlicher geworden ist was ich meine. Ansonsten einfach noch einmal nachfragen

Viele Grüße,
Vigo2

Mc Santa
08.07.2014, 14:27
Hallo,

ich finde, das ist eine ganz andere Aufgabe als zuvor, aber vielleicht habe ich auch etwas falsch verstanden...
Hier mal eine Formellösung für L2. Anschließend nach unten kopieren:
{=WENN(LÄNGE(D2)>2;WENN(LÄNGE(D2)=MAX(LÄNGE($D$2:$D$55)*(B2=$B$2:$B$55));"x";"");"")}
Achtung Matrixformel: Eingabe erfolgt ohne {}, und die Formel wird mit STRG + SHIFT + RETURN abgeschlossen

Fragen gerne.
VG

chris-kaiser
08.07.2014, 14:34
Hi,

passen die X so?
ist im Moment mit Formel erzeugt.

Vigo2
08.07.2014, 15:31
Hallo zusammen!

Freut mich, dass ihr mir helft :) Danke dafür!!!

@ Mc Santa: Ja, du hast recht, das ist eine andere Aufgabe (halt durch die geänderte Herangehensweise). Wenn sich jemand nun etwas anderes einfallen lässt, darf er selber nach einer Lösung suchen!!:mad: Ich selber verlier den Überblick und euch zieh ich auch noch mit rein!
Zu deinem Vorschlag:
Das ist fast die Lösung!
Ich hab aber etwas wichtiges übersehen zu erwähnen, was diese Zeile betrifft:

Wenn das Maximum mehrfach vorkommt, dann setzte jeweils immer ein "x" in Spalte "L" ein.

Wenn das Maximum mehrfach vorkommt und der Inhalt der Zellen gleich ist, setze nur ein "x". Wenn das Maximum mehrfach vorkommt und der Inhalt der Zellen nicht gleich ist, setze jeweils ein "x". Ist das noch mit einer Formel umsetzbar?

Ich hab noch einmal die Datei mit den gesetzten "x" hochgeladen. Und einem Beispiel zu dem geschilderten Fällen (gelb markierte Zeilen)

@ Chris: deine Formel bezieht sich irgendwie nicht auf die maximale Zeichenanzahl...

chris-kaiser
08.07.2014, 15:44
Hi,

deine Formel bezieht sich irgendwie nicht auf die maximale Zeichenanzahl...

dann wäre es eigentlich vollkommen egal was in D steht? Nur die Anzahl der Zeichen ist wichtig?

Ich verstehe den Sinn davon nicht. :rolleyes:
da dies für mich keine Datensätze sind.
deine neue Mappe verwirrt jetzt noch mehr... jetzt soll ein x bei dem Minimum von Spalte N eingetragen werden?

<P><blockquote><table border=3 cellpadding=1><tr><td>&nbsp;</td><td align=center bgcolor=#C0C0C0>B</td><td align=center bgcolor=#C0C0C0>C</td><td align=center bgcolor=#C0C0C0>D</td><td align=center bgcolor=#C0C0C0>E</td><td align=center bgcolor=#C0C0C0>F</td><td align=center bgcolor=#C0C0C0>G</td><td align=center bgcolor=#C0C0C0>H</td><td align=center bgcolor=#C0C0C0>I</td><td align=center bgcolor=#C0C0C0>J</td><td align=center bgcolor=#C0C0C0>K</td><td align=center bgcolor=#C0C0C0>L</td><td align=center bgcolor=#C0C0C0>M</td><td align=center bgcolor=#C0C0C0>N</td><td align=center bgcolor=#C0C0C0>O</td></tr><tr><td align=center bgcolor=#C0C0C0>35</td><td align=center>GI</td><td>&nbsp;</td><td>S6,&nbsp;S8</td><td>&nbsp;</td><td align=center>&nbsp;</td><td align=center>&nbsp;</td><td>&nbsp;</td><td align=center>&nbsp;</td><td align=center>&nbsp;</td><td align=center>&nbsp;</td><td>x</td><td align=center>&nbsp;</td><td align=center>1</td><td align=left>hat&nbsp;dieselbe&nbsp;Zeichenl&auml;nge,&nbsp;jedoch&nbsp;Inhalt&nbsp;gleich&nbsp;--&gt;&nbsp;ein&nbsp;x&nbsp;setzen</td></tr><tr><td align=center bgcolor=#C0C0C0>36</td><td align=center>GI</td><td>&nbsp;</td><td>S6,&nbsp;S8</td><td>&nbsp;</td><td align=center>&nbsp;</td><td align=center>&nbsp;</td><td>&nbsp;</td><td align=center>&nbsp;</td><td align=center>&nbsp;</td><td align=center>&nbsp;</td><td>&nbsp;</td><td align=center>&nbsp;</td><td align=center>3</td><td align=center>&nbsp;</td></tr><tr><td align=center bgcolor=#C0C0C0>37</td><td align=center>GI</td><td>&nbsp;</td><td>S6,&nbsp;S8</td><td>&nbsp;</td><td align=center>&nbsp;</td><td align=center>&nbsp;</td><td>&nbsp;</td><td align=center>&nbsp;</td><td align=center>&nbsp;</td><td align=center>&nbsp;</td><td>&nbsp;</td><td align=center>&nbsp;</td><td align=center>5</td><td align=center>&nbsp;</td></tr></td></tr></table></blockquote></P><br><br>

sollte da nicht bei 5 ein x sein ?

Vigo2
08.07.2014, 15:52
@ Chris:

Wenn der Wert in Spalte B mehrfach vorkommt, dann suche den Wert in Spalte D mit der maximalen Zeichenanzahl und setzte in Spalte L ein "x" (auf derselbe Höhe wie das gefundene Maximum).

Hier wird nur nach der maximalen Zeichenanzahl geschaut. Erst wenn es mehrere Zellen mit maximaler Zeichenanzahl gibt, muss nach dem Inhalt der Zellen geschaut werden:

Wenn das Maximum mehrfach vorkommt und der Inhalt der Zellen gleich ist, setze nur ein "x". Wenn das Maximum mehrfach vorkommt und der Inhalt der Zellen nicht gleich ist, setze jeweils ein "x". Ist das noch mit einer Formel umsetzbar?

Hast du das Beispiel in der Datei gesehen (gelbe Zeilen)? Da sollte es deutlich werden.

Superingo2
08.07.2014, 15:55
Hallo Vigo2,

eigentlich wollte ich Dir nicht mehr helfen, aber ich versuche es noch einmal.

Diese Formel erfüllt Deine genannten Bedingungen so, wie von Dir beschrieben.

{=WENN(ODER(LÄNGE($D2)<=2;$B1:$B$2&$D1:$D$2=$B2&$D2);"";WENN(ZÄHLENWENN($B$2:$B$55;$B2)=1;"x";WENN(LÄNGE($D2)=MAX(WENN($B$2:$B$55=$B2;LÄNGE($D$2:$D$55)));"x";"")))}

Achtung Matrixformel, aber die kennst Du ja schon.

LG Ingo

chris-kaiser
08.07.2014, 16:03
@ Vigo,

Warum gibt es in der Beispielmappe die Spalte N?
Wird diese wirklich nicht gebraucht und du wolltest testen ob das wer merkt :grins:

@Ingo
Genau getroffen ^^, aber das mit der Spalte N verwirrt mich immer noch.
:top:

Vigo2
08.07.2014, 16:05
@ Ingo: Oh ja, den Umgang mit der Matrixformel hast du mir eingeimpft!
Danke für deine Formel!!! Funktioniert bestens! :)

Vielen Dank an alle, die sich der Sache angenommen haben!

Viele Grüße, Vigo2

Vigo2
08.07.2014, 16:08
@ Chris:

Achso ja, Spalte N war noch Teil des ersten Ansatzes. Ich hatte dein Kommentar übersehen!
Aber was ich nun habe reicht mir vollkommen!!!

Sry, wollt dich nicht verwirren!

Einen schönen Abend noch!

VG, Vigo2