Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1920to1924
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
Inhaltsverzeichnis

VBA Find über 2 Spalten

VBA Find über 2 Spalten
08.03.2023 17:19:44
Herbert_Grom
Hallo,
in Spalte B habe ich Objektdaten und in Spalte C Firmennamen. Über eine zweispaltige Userform wähle ich die gewünschte Datensatzkombination Objekt & Firma aus:
      sText0 = .List(.ListIndex, 0)
      sText1 = .List(.ListIndex, 1)

Wie kann ich diese Kombi nun in beiden Spalten suchen/finden?
Servus und vielen Dank im Voraus

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Find über 2 Spalten
08.03.2023 17:24:25
GerdL
Hallo Herbert,
falls diese Möglichkeit besteht:
.ColumnCount = 3
.List(.ListIndex, 2) = Zeile des Datensatzes in der Tabelle
Gruß Gerd
AW: VBA Find über 2 Spalten
08.03.2023 17:28:20
Herbert_Grom
Hallo Gerd,
leider verstehe ich nicht, was du meinst? Ich probiers noch mal so:
In Spalte B steht u. a. "Bau1" und in Spalte B "Maier". Nun soll Excel VBA die Zeile finden, in der diese Suchbegriffe in B & C zu finden sind.
Servus
AW: VBA Find über 2 Spalten
08.03.2023 17:49:29
Rudi
Hallo Herbert,
beide Spalten in ein Array und per Schleife abklappern.
Gruß
Rudi
AW: VBA Find über 2 Spalten
08.03.2023 17:51:54
Rudi
wenn die LBx die beiden Spalten als Datenquelle hat, kannst du doch einfach den .ListIndex+1 nehmen.
Gruß
Rudi
Anzeige
AW: VBA Find über 2 Spalten
08.03.2023 18:17:28
Herbert_Grom
Hallo Rudi,
das müsste gehen, doch weiß ich jetzt nicht, wie dann die Codezeile dafür lauten müsste! Damit baue ich den Suchstring zusammen:
sText1u2 = .List(.ListIndex, 0) & .List(.ListIndex, 1)
Wie muss die Zeile richtig lauten?
lRowFound = ?
Servus
AW: VBA Find über 2 Spalten
09.03.2023 09:23:35
Rudi
Hallo,
z.B.
  Dim lRowFound As Long
  Dim vntArr
  vntArr = Range(Cells(1, 2), Cells(Rows.Count, 3).End(xlUp))
  For lRowFound = 2 To UBound(vntArr)
  If vntArr(lRowFound, 1) & vntArr(lrow, 2) = sText1u2 Then Exit For
  Next lRowFound
  MsgBox lRowFound
oder, wenn die LBx dem Bereich entspricht
lRowFound=ListBox1.ListIndex+2
da die Überschriften wahrscheinlich nicht enthalten sind
Gruß
Rudi
Anzeige
AW: VBA Find über 2 Spalten
09.03.2023 09:38:00
Herbert_Grom
"Rudi, Rudi noch einmal, es ist so wunderschön..."! Danke Rudi, dass wars! Have a nice Day!
Und danke auch an Gerd und Yal!
Servus
AW: VBA Find über 2 Spalten
08.03.2023 18:51:23
Yal
Hallo Herbert,
die etwa komplizierte Variante geht über einen Dictionary.
Public Dic As Object
Const cTrenner = ";"
Public Sub Dic_herstellen()
Dim Z As Range
Dim Key As String
'sammeln
    Set Dic = CreateObject("Scripting.Dictionary")
    With Worksheets("xyz")
        For Each Z In Range(.Range("A1"), .Cells(Rows.Count, "A").End(xlUp))
            Key = Z.Value & cTrenner & Z.Offset(0, 1).Value
            Dic(Key) = Dic(Key) & cTrenner & Z.Row
        Next
    End With
End Sub
Function SpalteAundB_suchen(ByVal TextA As String, ByVal TextB As String) As Long()
Dim Key As String
    SpalteAundB_suchen = Array() 'Dummy Init, UBound ist dann -1. Das ist die Default-Value
    Key = TextA & cTrenner & TextB
    If Dic.Exists(Key) Then
        SpalteAundB_suchen = Split(Mid(Dic(Key), Len(cTrenner) + 1), cTrenner) 'ohne führende Trenner
    End If
End Function
Sub Test()
Dim Erg
    with ...
        Erg = SpalteAundB_suchen(.List(.ListIndex, 0), .List(.ListIndex, 1))
        Select Case UBound(Erg)
        Case -1: MsgBox "nichts vorhanden"
        Case 0: MsgBox "nur eine Zeile gefunden: " & Erg(0)
        Case Else: MsgBox "mehrere Ergebnisse: " & Join(Erg, ", ")
        End Select
    End With
End Sub
Diese macht nur Sinn, wenn die Liste lang ist, mehrfach nacheinander abgefargt wird und sich während eine Verarbeitung nicht ändert (sonst muss neu erzeugt werden). Diese Version ist so aufgestellt, dass es mehrere Treffer geben könnte.
Ansonsten sollte die von Gerd vorgeschlagene Methode auch recht schnell sein :
Function SpalteAundB_inArr_suchen(ByVal TextA As String, ByVal TextB As String) As Long
Dim Arr
Dim i
    With Worksheets("Tabelle1")
        Arr = Range(.Range("B1"), .Cells(Rows.Count, "A").End(xlUp)) 'top-right / bottom-left-Definition, Falls B nicht vollständig befüllt wäre.
        For i = 1 To UBound(Arr, 1)
            If LCase(Arr(i, 1)) = LCase(TextA) And LCase(Arr(i, 2)) = LCase(TextB) Then
                SpalteAundB_inArr_suchen = i
                Exit For
            End If
        Next
    End With
End Function
VG
Yal
Anzeige
AW: VBA Find über 2 Spalten
09.03.2023 09:23:51
Herbert_Grom
Hallo Yal,
vielen Dank für deinen Vorschlag. Ich habe deinen ANsatz verstanden und er ist eigentlich das, was ich suche. Doch leider bekomme ich bei dieser Zeile einen Laufzeitfehler 13:
   SpalteAundB_suchen = Array()
Servus
AW: VBA Find über 2 Spalten
09.03.2023 10:24:38
Yal
Hallo Herbert,
ja, mein Fehler. Liegt daran, dass die Funktion den Rückgabetyp Long() hat.
Einfach den As Long() weglassen.
VG
Yal
AW: VBA Find über 2 Spalten
09.03.2023 11:20:45
Herbert_Grom
Hallo Yal,
alles klar! Hätte ich aber auch selbst drauf kommen können. Manchmal hat man aber ein Brett vor Augen! ;o)=)
Servus

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige