Anzeige
Archiv - Navigation
1100to1104
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

Match mehere treffer OK

Match mehere treffer OK
chris
Hallo VBA Profis,
ich muss um Hilfe bitten.Hoffe ihr habt kurz zeit für mich.
Ich habe eine Makro(siehe unten) mit diesem Makro finde ich in einem Datenbereich einen Wert.
in dem Datenbereich Range Range("CI1:CI50000") kommt aber der suchbegriff öfter vor als 1 mal.
Z.b in Zelle C1 und C100 und c44000 usw.Wie kann ich jetzt alle zellen in denen ein treffer gefunden ist in einer msgbox ausgeben lassen.
Alle zusammen oder nacheinander.oder muss ich eine schleife laufen lassen und immer den datenbereich der Matrix ändern.
Vielen dank für eure Hilfe.
lg chris
Option Explicit
Sub start()
MsgBox WorksheetFunction.Match("MB175366", Range("C1:C50000"), 0)
End Sub

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Match mehere treffer OK
15.09.2009 10:07:14
Rudi
Hallo,
und immer den datenbereich der Matrix ändern

die Idee ist gut und rattenschnell.
Sub tt3()
Dim r As Range, s As String, x
Set r = Columns(3)
x = Application.Match("x", r, 0)
Do While Not IsError(x)
s = s & x + r.Row - 1 & "; "
Set r = Range(Cells(r.Row + x, 3), Cells(Rows.Count, 3))
x = Application.Match("x", r, 0)
Loop
MsgBox s
End Sub
Gruß
Rudi
AW: Match mehere treffer OK
15.09.2009 10:15:20
chris
Danke Rudi.
Klappt !
ich habe es so gelöst.
Option Explicit
Sub start()
Dim x As Integer
Dim s As Integer
s = 1
For x = 1 To Cells(Rows.Count, 1).End(xlUp).Row
On Error GoTo ende
MsgBox WorksheetFunction.Match("MB366", Range("CI" & s + 1 & ":CI50000"), 0) + s
s = WorksheetFunction.Match("MB366", Range("CI" & s & ":CI50000"), 0) + s
Next
ende:
End Sub

Anzeige
AW: offen
15.09.2009 10:19:17
chris
Hallo Rudi,
nur noch eine frage.
warum geht das nicht ?
Range("CI" & s + 1 & ":CK50000")
Also als Datenbereich eine mehrspaltige Matrix ?
Wie könnte ich das lösen ?
Danke Dir noch einmal !
lg Chris
AW: offen
15.09.2009 10:33:10
Rudi
Hallo,
Match kann nur eine einspaltige Matrix durchsuchen.
Nutze die Find-Methode.
Sub tt5()
Dim r As Range, f As String, s As String
Set r = Columns("CI:CK").Find("x", LookIn:=xlValues, lookat:=xlWhole)
If Not r Is Nothing Then
f = r.Address
Do
s = s & r.Address & "; "
Set r = Columns("CI:CK").FindNext(r)
Loop While Not r Is Nothing And r.Address  f
End If
Msgbox s
End Sub

Gruß
Rudi
Anzeige
AW: offen
15.09.2009 10:42:30
chris
Hallo Rudi, danke Dir noch einmal !
Wohl eher NICHT mehr offen! owT
15.09.2009 10:51:40
Luc:-?
:-?
hier mal eine Möglichkeit mit ...Match...
15.09.2009 14:18:02
Tino
Hallo,
dies mit dieser Funktion Match (Vergleich) zu machen.
Du kannst im Suchtext Platzhalter verwenden,
beachte aber dass auf Groß u. Kleinschreibung nicht geachtet wird.
Sub Match_Ueber_Zellbereich(Bereich As Range, SuchWert As Variant)
Dim rZellen As Range
Dim LCol As Long, tempCol As Long
Dim varRow

    For LCol = 1 To Bereich.Columns.Count
       
       tempCol = 1
       
       Do While IsNumeric(varRow)
         
            varRow = Application.Match(SuchWert, Bereich.Columns(LCol).Range(Cells(tempCol, 1), Cells(Bereich.Rows.Count, 1)), 0)
            
               If IsNumeric(varRow) Then
                  If rZellen Is Nothing Then
                   Set rZellen = Bereich(varRow + tempCol - 1, LCol)
                   tempCol = tempCol + varRow
                  Else
                   Set rZellen = Union(rZellen, Bereich(varRow + tempCol - 1, LCol))
                   tempCol = tempCol + varRow
                  End If
               End If
       
       Loop
    
       varRow = 0
    Next LCol

If Not rZellen Is Nothing Then
 Set Bereich = rZellen
Else
 Set Bereich = Nothing
End If

End Sub

Sub BeispielVerwendung()
Dim ErgebisZellen As Range, vSuchwert

'Suchwert für nur ein Teil eines Wortes Platzhalter verwenden Bsp. "Apfel*" 
vSuchwert = "Apfel"
'Suchbereich 
Set ErgebisZellen = Tabelle1.Range("A1:Z100")

Match_Ueber_Zellbereich ErgebisZellen, vSuchwert

If Not ErgebisZellen Is Nothing Then
 MsgBox "Suchwert '" & vSuchwert & "' wurde in den Zellen " & ErgebisZellen.Address & " gefunden"
Else
 MsgBox "nix gefunden"
End If

End Sub
Gruß Tino
Anzeige
fehlt noch was...
15.09.2009 14:24:56
Tino
Hallo,
tausche noch die Zeile
            varRow = Application.Match(SuchWert, Bereich.Columns(LCol).Range(Cells(tempCol, 1), Cells(Bereich.Rows.Count, 1)), 0)

gegen diese aus, sonst funktioniert die Suche auf einer anderen Tabelle nicht.
         With Sheets(Bereich.Parent.Name)
            varRow = Application.Match(SuchWert, Bereich.Columns(LCol).Range(.Cells(tempCol, 1), .Cells(Bereich.Rows.Count, 1)), 0)
         End With
Gruß Tino
Anzeige
AW: fehlt noch was...
16.09.2009 07:30:11
chris
Hallo Tino,
zwar etwas verspätet aber besser zu spät als nie :)
Vielen dank für deinen Code !
AW: fehlt noch was...
16.09.2009 09:06:33
chris
Hallo Tino,
habe mich ja schon einmal bedankt für Deinen code.
Habe aber nch eine frage dazu zu einer zeile ?
Vielleicht kannst du Sie mir noch beantworten?
Was macht diese Zeile
varRow = Application.Match(SuchWert, Bereich.Columns(LCol).Range(.Cells(tempCol, 1), .Cells(Bereich.Rows.Count, 1)), 0)
suchwert übergabe verstehe ich noch.Aber den rest also die übergabe des bereichs nicht ganz.
Danke im voraus für Deine Hilfe !!!
AW: fehlt noch was...
16.09.2009 10:13:51
Tino
Hallo,
varRow ist als Variant Deklariert und die Funktion sucht im angegebenen Bereich nach diesem Wert.
Wird der Wert gefunden, steht in varRow die gefundene Zeilennummer.
Wird der Wert nicht gefunden, steht in varRow 'Fehler 2042' also ein Fehlerwert.
Da ein Fehlerwert nicht nummerisch ist, kann ich nun feststellen ob gefunden oder nicht.
Ich könnte auch auf Error prüfen, würde auch funktionieren. If not IsError(aa) then
(Match ist die Excelfunktion Vergleich)
Gruß Tino
Anzeige
AW: fehlt noch was...
16.09.2009 10:20:04
chris
Danke Tino.
ich habe etwas anderes gemeint.Was die zeile macht habe ich selbst gesehen.
Habe aber jetzt ein bnischen getestet und weiß jetzt wie die zeile Arbeitet.
Also woher er die Row liest und die Letzte zeile also Rows.count.
Er nimmt nicht die Rows.count der ganzen Tabelle nur aus dem angegebenen bereich "Bereich"
Danke noch einmal ! gruß Chris
AW:Erklärung
16.09.2009 14:19:50
chris
Hallo Tino,
ich stelle noch einmal offen und hoffe Du nimmst dir noch einmal die Zeit.
Es gehtz um die Ausgabe der zelladdressen in denen "Apfel" gefunden wurde.
Die Ausgabe erfolgt ja hier:
MsgBox "Suchwert '" & vSuchwert & "' wurde in den Zellen " & ErgebisZellen.Address & " gefunden"
Aber wie klappt das ? Als erstes wird das Makro Sub BeispielVerwendung gestartet.dieses makro ruft dann die Sub "Match_Ueber_Zellbereich" auf.Es werden übergeben der Zellbereich mit "ErgebisZellen", und der Wert nach dem gesucht werden soll "vSuchwert"
Woher kommt dan dieser Wert in der Sub der als msg ausgegeben wird ? "ErgebisZellen.Address"
Es wird soch in der zweiten Sub am Ende das gemacht
"
If Not rZellen Is Nothing Then
Set Bereich = rZellen
Else
Set Bereich = Nothing
End If
"
Was passiert da ? Woher kommen die Werte in ErgebisZellen.Address ?
ich hoffe Du versteh´st meine frage.Wäre klasse wenn Du mir das etwas erklären könntest.
Dafür vielen Dank
Anzeige
AW: AW:Erklärung
16.09.2009 16:49:47
Tino
Hallo,
der Zellbereich wird in der Sub Match_Ueber_Zellbereich
in der Zeile
If Not rZellen Is Nothing Then
Set Bereich = rZellen
Else
Set Bereich = Nothing
End If
übergeben und weil Bereich mit ByRef deklariert ist (ByRef ist Standard),
ist dass die Variable die ich an die Sub übergeben.
Gruß Tino
AW: AW:Erklärung
17.09.2009 11:36:31
chris
verstehe ich nicht.
Aber trotzdem Danke !
verständlicher...
17.09.2009 12:07:02
Tino
Hallo,
vielleicht ist besser an zwei Beispielen den Unterschied bei byRef u. byVal zu verstehen
'Beipiel1 byRef ************************************ 
'könnte auch Sub Bsp1(byRef Wert As Long) lauten 
'byRef die Variable wird nicht neu erstellt 
Sub Bsp1(Wert As Long)
 Wert = Wert + 10
End Sub

Sub AufrufBsp1()
Dim Wert As Long

    Bsp1 Wert
    
    MsgBox Wert & " Wert bei byRef wird geändert"
End Sub


'Beipiel2 byVal, muss angegeben werden ************** 
'byVal die Variable wird neu erstellt 
Sub Bsp2(ByVal Wert As Long)
 Wert = Wert + 10
End Sub

Sub AufrufBsp2()
Dim Wert As Long

    Bsp2 Wert
    
    MsgBox Wert & " Wert bei byVal wird nicht geändert"
End Sub
Gruß Tino
Anzeige
AW: verständlicher...
17.09.2009 14:09:37
chris
VieleN dank Tino !

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige