Suchfunktion über rng.find() aufbauen

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
MsgBox
Bild

Betrifft: Suchfunktion über rng.find() aufbauen
von: Christian
Geschrieben am: 29.10.2003 21:44:56

Hi Leute,

ich probiere gerade, mir eine Funktion zu basteln, die nach dem vorkommen eines bestimmten Zeichens in einer frei zu wählenden Tabelle und Spalte sucht und bei einem Treffer die Zelladresse zurückgibt.

Soweit so gut. Das Problem ist nur, ich krieg das ganze nur über eine Subroutine hin, nicht aber in eine Funktion. Der Code anbei:


Sub directSearch(Sheetname As String, searchText As String, searchcol As Integer)
  
  Dim searchRange, matchCell As Range
  Dim s As String
  
  Set searchRange = ThisWorkbook.Worksheets(Sheetname).Columns(searchcol)
  searchRange.Activate
  
  Set matchCell = Selection.Find(What:=searchText, After:=ActiveCell, _
    LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, _
    SearchDirection:=xlNext, MatchCase:=False)
  
  If matchCell Is Nothing Then
    MsgBox "#NO MATCH"
  Else
    MsgBox "Found search pattern: " + CStr(searchText) + " in cell: " + _
      CStr(matchCell.Address(False, False))
  End If
  
End Sub


Hat jemand eine Idee, ob und wie ich das ganze in einer Funktion realisieren kann?

Danke im Voraus
Christian
Bild


Betrifft: AW: Suchfunktion über rng.find() aufbauen
von: Reinhard
Geschrieben am: 29.10.2003 22:21:37

Hi Christian,
das Folgende klappt über

Sub test(), als Tabellenfunktion aber noch nicht getestet.
Gruß
Reinhard

Sub test()
MsgBox directSearch2("Tabelle1", "Huhu", "2")
End Sub



Function directSearch2(Sheetname As String, searchText As String, searchcol As Integer) As String
  
  Dim searchRange, matchCell As Range
  Dim s As String
  
  Set searchRange = ThisWorkbook.Worksheets(Sheetname).Columns(searchcol)
  
  Set matchCell = searchRange.Find(What:=searchText, After:=ActiveCell, _
    LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, _
    SearchDirection:=xlNext, MatchCase:=False)
  
  If matchCell Is Nothing Then
    directSearch2 = "#NO MATCH"
  Else
    directSearch2 = "Found search pattern: " + CStr(searchText) + " in cell: " + _
      CStr(matchCell.Address(False, False))
  End If
  
End Function



Bild


Betrifft: noch teilw. offen
von: Reinhard
Geschrieben am: 29.10.2003 22:59:39

Hallo,
bei Aufruf durch die

Sub test() läuft es problemlos, findet sogar xHuhux.
Aber bei Aufruf als Tabellen

Function durch =directSearch2("Tabelle1";"Huhu";"2") ergab es #WERT brach ohne Fehlermeldung?? an der Stelle
Set Matchcase=...
ab. (Cursor als Strich stand vor der Zeile, aber keine Fehlermeldung)
Nachdem ich aus dem
Set Matchcase=...
das After:=ActiveCell,
entfernt habe, lief es immerhin problemlos durch, aber fand nichts mehr.(#NO MATCH)
Frage1: kommen bei Funktionen keine Fehlermeldungen?
Frage2: warum wird nichts gefunden bei nachfolgendem Code?
Gruß
Reinhard
Aufruf durch =directSearch2("Tabelle1";"Huhu";"2") '"2" oder 2 ist egal 

Function directSearch2(Sheetname As String, searchText As String, searchcol As Integer) As String
  
  Dim searchRange, matchCell As Range
  Dim s As String
  
  Set searchRange = ThisWorkbook.Worksheets(Sheetname).Columns(searchcol)
  
  'Set matchCell = searchRange.Find(What:=searchText,
   ' LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, _
    'SearchDirection:=xlNext, MatchCase:=False)
  Set matchCell = searchRange.Find(searchText)
  
  If matchCell Is Nothing Then
    directSearch2 = "#NO MATCH"
  Else
    directSearch2 = "Found search pattern: " + CStr(searchText) + " in cell: " + _
      CStr(matchCell.Address(False, False))
  End If
End Function





Bild


Betrifft: AW: noch teilw. offen
von: Christian
Geschrieben am: 30.10.2003 11:01:06

Hi Rainer,

hmm, genau an dem Problem bin ich auch gescheitert. Kann es sein, dass es generell nicht möglich ist, aus einer Funktion heraus einen Bereich auf einem Tabellenblatt zu markieren? Ich denke, dass der Bereich für die Suchoption markiert sein muss, was im obigen Beispiel nicht der Fall ist.
Liege ich da richtig??

Gruss Christian


Bild


Betrifft: AW: noch teilw. offen
von: Christian
Geschrieben am: 30.10.2003 11:08:22

Meine Vermutung aus dem vorigen threat scheint sich zu bestätigen. Beim Versuch den gesetzten Bereich zu aktivieren, wird ein Laufzeitfehler erzeugt. Der Versuchfall nachfolgend:


Function directSearch2(Sheetname As String, searchText As String, searchcol As Integer) As String
  
  Dim searchRange, matchCell As Range
  Dim s As String
  
  Set searchRange = ThisWorkbook.Worksheets(Sheetname).Columns(searchcol)
  On Error GoTo errHandler
  searchRange.Activate
  Set matchCell = searchRange.Find(What:=searchText, After:=ActiveCell, _
    LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, _
    SearchDirection:=xlNext, MatchCase:=False)
  
  If matchCell Is Nothing Then
    directSearch2 = "#NO MATCH"
  Else
    directSearch2 = "Found search pattern: " + CStr(searchText) + " in cell: " + _
      CStr(matchCell.Address(False, False))
  End If
  
  Exit Function
  
errHandler:
  MsgBox "Error"
End Function


FRAGE:
Ist es möglich, die Suchfunktion von Excel zu benutzen (range.find) ohne vorher einen Bereich selektiert zu haben???

Bin für jeden Hinweis dankbar
Christian


 Bild

Beiträge aus den Excel-Beispielen zum Thema " Suchfunktion über rng.find() aufbauen"