Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
784to788
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
784to788
784to788
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

MakroSnippet? ;-)

MakroSnippet? ;-)
01.08.2006 09:59:41
alex
Hallo Profis ;-)
Mit etwas Glück verfügt jemand von euch über ein CodeSnippet folgender Anforderung und wäre so hoflich, dieses mir zu senden.. bzw.. vielleicht gibt es grunstätzliche überlegungen die ich nicht sehe und hilft mir mit tips.
Gruppe--Untergruppe--KategorieI--KategorieII--usw
A--------------1----------------X---------------S
A--------------1----------------Y---------------V
B--------------1----------------X---------------S
B--------------2----------------Y---------------V
Idee:
Ich habe in einer Spalte mehrere Gruppen. Jede dieser Gruppen verfügt über eine Untergruppe. Alle Gruppen haben die selben Untergruppen. Jede Untergruppe hat unterschiedliche Kategorien.
Wenn ich nun ein Makro schreiben möchte, welches mir stets nur die eine gesuchte Kategorie einer gewählten Untergruppe bzw Gruppe findet, wie wäre das am besten zu schreiben? Ich unterscheide grundsätzlich drei mögliche Lösungen.
1.Lösung:
Ich durchsuche die Gruppenspalte nach dem ersten und letzten Aufkommen meiner gesuchten Gruppe (zb A) und schränke einfach den Suchbereich ein.
2.Lösung:
Ich suche immer nach der gesuchten Gruppe und liefere die Zeilennummer zurück. Dann suche ich in der Zeile ob diese meiner gesuchten Untergruppe und Kategorie entspricht. Wenn nicht, iteriere ich (findNext)
3.Lösung:
Es gibt ein Code Snippet, welches jeweils solange nach einer Zeile sucht, in welcher in Zelle1 UND Zelle2 UND Zelle3 meine Suchwörter enthalten sind.
welche Lösung wäre die Beste? Es handelt sich um eine relativ große Liste mit 1500 Zeilen.
Für alle Tips & Tricks dankbar,
alex

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: MakroSnippet? ;-)
03.08.2006 16:12:35
christian
Hallo Alex,
also wenn ich das richtig verstanden habe brauchst du in etwa so etwas:

Sub xy()
For i = 4 To 1500 'zeilen die durchsucht werden sollen
If Cells(i, 1) = Cells(1, 1) And Cells(i, 2) = Cells(1, 2) And Cells(i, 3) = Cells(1, 3) And Cells(i, 4) = Cells(1, 4) Then
Rows(i).Select
Exit For
End If
Next i
End Sub

In diesem Beispiel startest du die suche erst ab zeile 4 darüber ev. Überschriften und in die Range a1, b1, c1, d1 gibts du die gesuchten werte ein.
achtung: diese Makro sucht nur im aktiven sheet, wenn du mehrere sheets durchsuchen musst, sollten wir das anpassen :-)
hoffe das hilft
lg
christian
Anzeige
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
    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige