AW: MakroSnippet? ;-)
03.08.2006 18:19:45
Uwe
Hallo, alex,
auch wenn die Profis hier von dir angesprochen wurden, wage ich eine Zwischenfrage, deren Beantwortung vieleicht hilft, das Ziel des Projektes mir besser zu verdeutlichen ;)
Deine Struktur stellst Du so vor:
Gruppe | Unter- | Kat.| Kat.| usw
| gruppe | I | II |
A | 1 | X | S |
A | 1(?) | Y | V |
B | 1 | X | S |
B | 2 | Y | V |
Also je Zeile läßt sich eine Ordnungsschlüssel anschreiben, der so aussieht:
Key(i) = {G}.{UG}.{K.I}.{K.II}. ...
Meine Fragen nun dazu:
In der Datenzeile 2 ist die Untergruppe mit 1 angegeben. Wenn jedoch ein Bildungsgesetz hinter der Bezeichnung steht, dann wäre m.E. dort eine 2 zu vermuten. Sind die Elemente einer Spalte eindeutig einem Bereich zuzuorden, also z.B. Key = {G | e A...F}.{UG | e 1..2}.{K.I | e X...Z}.{K.II | e S...V}?
Sind die die Kombinationen (Key's) von einer Zeile einzigartig in der Liste?
liegt die Liste sortiert vor?
sind alle Zellen einer Zeile belgt?
Du formulierst die Aufgabenstellung so:
und später ergänzend dazu:
so läuft die Suche auf ein verschachtelte Abfrage hinaus.
Bei einer nach SpalteA sortierten Liste, ist Dein vorbereitender Schritt nach Lösung 1 zu empfehlen, wobei allerdings nur nach dem ersten vorkommen des Gruppensuchwortes gesucht werden braucht und danach jede weitere Zeile auf den Inhalt der Gruppenzelle geprüft werden, bis die Zelle nicht mehr das Gruppensuchwiort enthält.
Deine Lösung 2 ist notwendig, wenn die Liste nicht sortiert ist.
Bei 1500 Zeilen ist m.E. die frage nach dem "Besten" weg im Sinne der Ausführungszeitoptimierung eher zweitrangig bei der derzeitigen hohen Rechengeschwindigkeiten.
Hier ein Lösungsgerüst für eine sortierte Tabelle im Bereich C8:G... (G.UG.KI,KII.KIII)
mit den Such-Teilschlüsseln in dem Bereich C1:C5
Sub SearchKey()
Dim rng As Range, rngT As Range
Dim i As Integer, r As Long, c As Integer
Dim GKey As String, SubKey(4) As String, found As Boolean
Dim SearchPatter As String
Worksheets("Tabelle1").Activate
Range("C2").Select ' Hier steht der Suchwert des Gruppenschlüssels
GKey = ActiveCell
c = ActiveCell.Column + 1 ' erste Spalte der Unterschlüsselwerte
SearchPatter = GKey
For i = 0 To 3
SubKey(i) = ActiveCell.Offset(0, i + 1) 'die Suchwerte der Unterschlüssel
SearchPatter = SearchPatter & "." & SubKey(i)
Next
Range("C8").Select 'Hier ist die obere linke Ecke der Key-Tabelle
'Selectionsbereich des Hauprschlüssels
Set rngT = Range("C8:C" & ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row)
'sucht Zeile des ersten Vorkommen des Haupschlüssels
r = rngT.Find(What:=GKey, After:=ActiveCell, LookIn:=xlValues, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) _
.Row
'Selectionsbereich mit erstem Vorkommen des gesuchten Hauptschlüssels
'entfällt bei unsortierter Liste
Set rngT = Range("C" & r & ":C" & ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row)
For Each rng In rngT
If rng = GKey Then
'IF-Abfrage entfällt bei unsortierter Liste
found = True
i = 0
Do
If Cells(rng.Row, c + i) <> SubKey(i) Then found = False
i = i + 1
Loop Until Not found Or i = 4
If found Then
MsgBox ("Schlüssel" & SearchPatter & " in Zeile " & rng.Row & " gefunden")
Exit For
End If
End If 'IF--Begrenzer entfällt bei unsortierter Liste
Next
If Not found Then
MsgBox "Kein Eintrag mit Suchmuster " & SearchPatter & " gefunden!"
End If
End Sub
Je nach Aufbau des Schlüssels können die Abfragen anders gestallten werden. Denkbar wäre auch, die Teilschlüssel einer Zeile zu einem String zusammenzufassen (siehe z.B anlaog zum Inhalt von SearchPatter) und dann diesen Zeilenstring mit dem Suchstring zu vergleichen. Ensprechend könnte man auch vorgehen bei einer EXCEL-Zellenformellösung. In einer Spalte werden die Spalteninhalte einer Tabellenzeile verkettet und dann mit den Suchmiuster verglichen.
Gruß,
Uwe