PDA

Vollständige Version anzeigen : Verweise und Suche


frontloop
15.07.2014, 12:43
Hi,

ich hab folgendes Problem, für das ich im VBA keine Lösung finde:

Ich habe in den Spalten A und B verschiedene Werte stehen.
Machen möchte ich folgendes:
Suche den kleinsten Wert aus den Spalten A und B.
Ist dieser kleinste Wert ein Wert aus Spalte A, dann schreibe in die entsprechende Zelle (d.h. gleiche Zeile) in Spalte "C"(!) einen Vermerk.
ist dieser Wert aber auch Spalte B, dann schreibe in Spalte D einen Vermerk.

Das ganze dann für alle Werte in den Spalten A und B durchlaufen. Also erst der kleinste, dann der zweitkleinste usw.

Wie mache ich das am besten?

Hajo_Zi
15.07.2014, 13:05
ich hätte es ja über Formeln gelöst.
<br/><b><em>Bezug</em></b><table border="1" cellspacing="0" cellpadding="0" style="border-color:#000000; border-width: 1px; font-size:11pt; background-color:#ffffff; padding-left:2pt; padding-right:2pt; "><colgroup><col style="font-weight:bold; width:40px;" /><col style="width:126px;" /><col style="width:126px;" /></colgroup><tr style="background-color:#99CCFF; text-align:center; font-weight:bold; "><td>&nbsp;</td><td>C</td><td>D</td></tr><tr><td style="background-color:#99CCFF; text-align:center; font-weight:bold; ">1</td><td style="border-color:#000000; color:#000000; border-color:#000000; background-color:#FFFFFF ;; text-align:left; ">&nbsp;</td><td style="border-color:#000000; color:#000000; border-color:#000000; background-color:#FFFFFF ;; text-align:left; ">&nbsp;</td></tr><tr><td style="background-color:#99CCFF; text-align:center; font-weight:bold; ">2</td><td style="border-color:#000000; color:#000000; border-color:#000000; background-color:#FFFFFF ;; text-align:left; ">&nbsp;</td><td style="border-color:#000000; color:#000000; border-color:#000000; background-color:#FFFFFF ;; text-align:left; ">&nbsp;</td></tr><tr><td style="background-color:#99CCFF; text-align:center; font-weight:bold; ">3</td><td style="border-color:#000000; color:#000000; border-color:#000000; background-color:#FFFFFF ;; text-align:left; ">&nbsp;</td><td style="border-color:#000000; color:#000000; border-color:#000000; background-color:#FFFFFF ;; text-align:left; ">&nbsp;</td></tr><tr><td style="background-color:#99CCFF; text-align:center; font-weight:bold; ">4</td><td style="border-color:#000000; color:#000000; border-color:#000000; background-color:#FFFFFF ;; text-align:left; ">Vermerk</td><td style="border-color:#000000; color:#000000; border-color:#000000; background-color:#FFFFFF ;; text-align:left; ">&nbsp;</td></tr><tr><td style="background-color:#99CCFF; text-align:center; font-weight:bold; ">5</td><td style="border-color:#000000; color:#000000; border-color:#000000; background-color:#FFFFFF ;; text-align:left; ">Vermerk</td><td style="border-color:#000000; color:#000000; border-color:#000000; background-color:#FFFFFF ;; text-align:left; ">&nbsp;</td></tr><tr><td style="background-color:#99CCFF; text-align:center; font-weight:bold; ">6</td><td style="border-color:#000000; color:#000000; border-color:#000000; background-color:#FFFFFF ;; text-align:left; ">Vermerk</td><td style="border-color:#000000; color:#000000; border-color:#000000; background-color:#FFFFFF ;; text-align:left; ">&nbsp;</td></tr><tr><td style="background-color:#99CCFF; text-align:center; font-weight:bold; ">7</td><td style="border-color:#000000; color:#000000; border-color:#000000; background-color:#FFFFFF ;; text-align:left; ">Vermerk</td><td style="border-color:#000000; color:#000000; border-color:#000000; background-color:#FFFFFF ;; text-align:left; ">&nbsp;</td></tr><tr><td style="background-color:#99CCFF; text-align:center; font-weight:bold; ">8</td><td style="border-color:#000000; color:#000000; border-color:#000000; background-color:#FFFFFF ;; text-align:left; ">Vermerk</td><td style="border-color:#000000; color:#000000; border-color:#000000; background-color:#FFFFFF ;; text-align:left; ">&nbsp;</td></tr><tr><td style="background-color:#99CCFF; text-align:center; font-weight:bold; ">9</td><td style="border-color:#000000; color:#000000; border-color:#000000; background-color:#FFFFFF ;; text-align:left; ">Vermerk</td><td style="border-color:#000000; color:#000000; border-color:#000000; background-color:#FFFFFF ;; text-align:left; ">&nbsp;</td></tr><tr><td style="background-color:#99CCFF; text-align:center; font-weight:bold; ">10</td><td style="border-color:#000000; color:#000000; border-color:#000000; background-color:#FFFFFF ;; text-align:left; ">Vermerk</td><td style="border-color:#000000; color:#000000; border-color:#000000; background-color:#FFFFFF ;; text-align:left; ">Vermerk</td></tr><tr><td style="background-color:#99CCFF; text-align:center; font-weight:bold; ">11</td><td style="border-color:#000000; color:#000000; border-color:#000000; background-color:#FFFFFF ;; text-align:left; ">Vermerk</td><td style="border-color:#000000; color:#000000; border-color:#000000; background-color:#FFFFFF ;; text-align:left; ">Vermerk</td></tr><tr><td style="background-color:#99CCFF; text-align:center; font-weight:bold; ">12</td><td style="border-color:#000000; color:#000000; border-color:#000000; background-color:#FFFFFF ;; text-align:left; ">Vermerk</td><td style="border-color:#000000; color:#000000; border-color:#000000; background-color:#FFFFFF ;; text-align:left; ">Vermerk</td></tr></table><br/><table border="1" cellspacing="0" cellpadding="0" style="border-color:#000000; border-width: 1px;font-size:11pt; background-color:#ffffff; width:800px;padding-left:2pt; padding-right:2pt; "><tr style="background-color:#FFCC66; text-align:center; font-weight:bold; "><td colspan="3" > verwendete Formeln </td><td> </td></tr><tr valign="top" style="background-color:#FFCC66; text-align:center; font-weight:bold; "><td> Zelle </td><td> Formel</td><td> Bereich </td> <td>N/A</td></tr><tr><td>C1:C12</td><td>=WENN(ZÄHLENWENN(A:A;KKLEINSTE(B:B;ZEILE()))=0;"Vermerk";"")</td><td>&nbsp;</td><td>&nbsp;</td></tr><tr><td>D1:&nbsp;D12</td><td>=WENN(ZÄHLENWENN(B:B;KKLEINSTE(A:A;ZEILE()))=0;"";"Vermerk")</td><td>&nbsp;</td><td>&nbsp;</td></tr></table><table cellspacing="0" cellpadding="0"><tr style="text-align:left; font-weight:bold; " class="style21"><td style="text-align:left; font-size: xx-small" ><a href="http://excel-inn.de/dateien/vba_beispiele/tabellenanzeige_in_html_addin.zip" >Excel-Inn.de</a></td></tr> <tr style="text-align:left; font-weight:bold; " class="style21"><td style="text-align:left; font-size: xx-small" ><a href='http://Hajo-Excel.de/tools.htm' >Hajo-Excel.de</a></td></tr><tr style="text-align:left; font-weight:bold;" ><td style="text-align:left; font-size: xx-small" >XHTML-Tabelle zur Darstellung in Foren, einschl. der neuen Funktionen ab Version 2007</td></tr><tr style="text-align:left; font-weight:bold; " ><td style="text-align:left; font-size: xx-small" > Add-In-Version 18.08 einschl. 64 Bit</td></tr></table><br/>

<img src="http://Hajo-Excel.de/images/grusz1.gif" align="middle" height="40" alt="Grußformel"><a href="http://Hajo-Excel.de/index.htm"><img border="0" src="http://Hajo-Excel.de/images/logo_hajo3.gif" align="middle" height="40" alt="Homepage"></a>

EarlFred
15.07.2014, 13:15
Hallo Name?,

ungenau und unvollständig:
Suche den kleinsten Wert aus den Spalten A und B.
Fall 1: Der kleinste Wert ist in A, und kommt nicht in B vor -> Vermerk in C (OK)
Fall 2: Der kleinste Wert ist in A, kommt aber auch in B vor -> Vermerk in D (OK) und in C nicht? Oder auch?
Fall 3: Der kleinste Wert ist in B, aber nicht in A -> und nun?
Fall 4: Der kleinste Wert ist in B und auch in A -> analog Fall 2

Auch wenn Du meinst, die Aufgabe sei trivial zu erklären, gilt das noch lange nicht für das Verstehen des Beschriebenen. Es hilft immer, ein paar Gedanken mehr darauf zu verwenden, eine solche Aufgabe zu durchdenken, bevor man sie beschreibt. Eine Mustermappe mit ein paar Daten für das Verständnis und von Hand eingetragenen Ergebnissen (mit Begründung warum) kann dabei enorm helfen.
Ich finde es extrem anstrengend, dass Du solche Hinweise einfach nicht aufnimmst.

Zudem finde ich es ein Unding, dass man auf Hilfestellungen kein Feedback erhält.

Grüße
EarlFred

frontloop
16.07.2014, 07:38
ich habs jetzt mit der "match"-funktion probiert.
und zwar schaut das ganze so aus:
Option Explicit

Sub finden()

Dim kriterium As Variant
Dim maxg As Single
Dim maxh As Single
Dim laufende_nummer As Single

laufende_nummer = 1


Do While laufende_nummer < 17 'schleife um alle Werte durchzugehen

kriterium = Application.WorksheetFunction.Large(Sheets("Tabelle2").Range("G2:H9"), laufende_nummer) 'nimm die kgrößte Zahl aus dem Bereich G2 bis H9

On Error GoTo in_spalte_h 'die Match-Funktion liefert einen Fehler, wenn der Wert nicht gefunden wird, daher diese Anweisung
maxg = Application.WorksheetFunction.Match(kriterium, Sheets("Tabelle2").Range("G2:G9"), 0) 'Suche den kgrößten Wert in Spalte g
Sheets("Tabelle2").Cells(laufende_nummer + 15, 7) = maxg 'schreibe den Wert in Spalte G ab Zeile 16

Exit Sub

in_spalte_h: 'wie oben für Spalte h
maxh = Application.WorksheetFunction.Match(kriterium, Sheets("Tabelle2").Range("G2:G9"), 0)
Sheets("Tabelle2").Cells(laufende_nummer + 15, 8) = maxh

laufende_nummer = laufende_nummer + 1

Loop

End Sub


Problem noch dabei:
Die Fehlerbehandlung: Die Anweisund "Exit sub" beendet mir die Routine, ohne dass die Schleife durchlaufen wird. Habe ich dieses "Exit sub" aber nicht drin, macht er mit der Zeile "in_spalte_h" einfach weiter. Wie steige ich hier so aus, dass er die Schleife weiterläuft, wenn er den Wert in Spalte g gefunden hat aber auch in Spalte h weitersucht, wenn der Wert nicht in Spalte g ist?

Geht das auch mit einer if - Abfrage?
Also wenn mir die Match-Funktion bei Spalte g einen Fehler liefert, dann mache die Match-Funktion in Spalte h?


Edit:
Mit if-Anweisung versucht:
Option Explicit

Sub finden()

Dim kriterium As Variant
Dim maxg As Single
Dim maxh As Single
Dim laufende_nummer As Single

laufende_nummer = 1


Do While laufende_nummer < 17 'schleife um alle Werte durchzugehen

kriterium = Application.WorksheetFunction.Large(Sheets("Tabelle2").Range("G2:H9"), laufende_nummer) 'nimm die kgrößte Zahl aus dem Bereich G2 bis H9

If IsError(Application.WorksheetFunction.Match(kriterium, Sheets("Tabelle2").Range("G2:G9"), 0)) Then
maxh = Application.WorksheetFunction.Match(kriterium, Sheets("Tabelle2").Range("G2:G9"), 0)
Sheets("Tabelle2").Cells(laufende_nummer + 15, 8) = maxh

Else
maxg = Application.WorksheetFunction.Match(kriterium, Sheets("Tabelle2").Range("G2:G9"), 0) 'Suche den kgrößten Wert in Spalte g
Sheets("Tabelle2").Cells(laufende_nummer + 15, 7) = maxg 'schreibe den Wert in Spalte G ab Zeile 16

End If

laufende_nummer = laufende_nummer + 1

Loop

End Sub


Liefer mir aber trotzdem einen Fehler, wenn der Wert nicht in der Spalte g zu finden ist (also das Iserror eigentlich stimmt)

Das ganze gibt mir ja dann insgesamt die Zeile des jeweiligen Maximums aus, so dass ich mit dieser Zeilennummer weitermachen kann.

frontloop
16.07.2014, 08:02
so gehts jetzt:
Option Explicit

Sub finden()

Dim kriterium As Variant
Dim maxg As Single
Dim maxh As Single
Dim laufende_nummer As Single

laufende_nummer = 1


Do While laufende_nummer < 17 'schleife um alle Werte durchzugehen

kriterium = Application.WorksheetFunction.Large(Sheets("Tabelle2").Range("G2:H9"), laufende_nummer) 'nimm die kgrößte Zahl aus dem Bereich G2 bis H9

If IsError(Application.Match(kriterium, Sheets("Tabelle2").Range("G2:G9"), 0)) Then
maxh = Application.Match(kriterium, Sheets("Tabelle2").Range("h2:h9"), 0)
Sheets("Tabelle2").Cells(laufende_nummer + 15, 8) = maxh

Else
maxg = Application.Match(kriterium, Sheets("Tabelle2").Range("G2:G9"), 0) 'Suche den kgrößten Wert in Spalte g
Sheets("Tabelle2").Cells(laufende_nummer + 15, 7) = maxg 'schreibe den Wert in Spalte G ab Zeile 16

End If

laufende_nummer = laufende_nummer + 1

Loop

End Sub


Damit kann ich jetzt weitermachen

Mc Santa
16.07.2014, 08:02
Hallo,

ich verstehe immer noch nicht ganz, was du genau lösen willst.
Bitte lade einmal eine kleine Beispieldatei hoch mit Zustand Vorher und Zustand Nacher sowie einer Erklärung, wie man von Vorher zu Nacher kommt.
Dann bin ich gerne bereit dazu den Code zu liefern :)

Da ich vermute, dass man es auch mit Formel lösen kann: Welche Variante ist dir lieber, wenn beides geht?
VG

Edit:
OK super, du hast schon eine Lösung :)