# Datagrid Durchsuchen



## Joi1981 (1. Oktober 2007)

Hallo Leute!

Zunächst einmal: Tolles Forum!

Habe mich neu angemeldet und freue mich schon auf konstruktiven Austausch zu Visual Basic 6.

Und hier kommt schon meine erste Frage,
an deren Lösung ich schon fast verzweifle!

Aber es ist sicherlich nur eine Kleinigkeit.

Ich habe in meinem Aktuellen Projekt ein MS DatagridControl 6.0 eingefügt.
Dieses Datagrid lädt die Daten einer externen Excel-Tabelle in sich hinein.

In Excel gibt es ja mit STRG+F die Möglichkeit einer Textsuche.
Wie kann ich das in Visual Basic mit disem Datagrid realsieren.

Das Gesamte Datagrid soll also nach einem einzugebenden Schlüsselwort (z.B. Name) durchsucht werden und dann auf den Match des ersten Suchergebnisen via Cursor o. ä. springen bzw. die Betreffende Zeile in der sich die Zelle mit dem Schlüsselwort befindet markieren.

Könnt Ihr mir helfen?

Besten Dank!


----------



## ronaldh (2. Oktober 2007)

Eine wirkliche Suchfunktion hat das Datagrid nicht. Das musst Du selbst programmieren. 
Du kannst wohl nur die einzelnen Rows und Columns durchsuchen, und dann mit der "Instr"-Funktion prüfen, ob der gesuchte Text enthalten ist.

Grüsse
Ronald


----------



## Joi1981 (2. Oktober 2007)

Danke Ronald.
Das ist schonmal ein Ansatz.
Kannst Du mir einen Code-Ansatz für eine Schleife geben,
die die Instr Anweisung die gesamte Tabelle durchsucht?
Ich muss dann noch die Zelle ermitteln, um den Cursor Focus
darauf zu setzen, oder?

Danke!
Gruß


----------



## ronaldh (2. Oktober 2007)

Das Datagrid ist ein gebundenes Control, welches in der Regel immer an einem Recordset hängt. Füllst Du Dein Grid über ADO, oder wie machst Du es? 

Vielleicht hilft Dir dieser Link weiter. Und auch hier findest Du interessante Informationen über das Datagrid.

Ronald


----------



## Joi1981 (3. Oktober 2007)

Ja ich fülle das Datagrid mit den Daten einer bestehenden Excel Tabelle
für ADODB mit einem Recordset.

Die beiden Links waren sehr interessant,
jedoch für mein Projekt nicht geeignet.
Gerade der Code des ersten Links führt bei mir zu keinem Ergebnis.
Aber vielleicht stelle ich mich auch nur zu dumm an 

==========================================================
LÖSUNGSMÖGLICHKEIT GEFUNDEN:
**********************************************

Ich habe es jetzt anders realisiert:
Ich vergleiche mit einem Timer-Control das von Zelle zu Zelle "springt" die datagrid1.text
Inhalte jeder Zelle mit dem Suchbegriff;

Zuerst die erste Zeille und die Gewünschte Spalte
mit datagrid1.Row = ? und .Col = ? auswählen als Startpunkt für die Suche, dann:

If datagrid1.text = searchtext.text then ....
else:
datagrid1.row = datagrid1.row +1
GoTo Loop usw...

Ich habe es erst mit Sendkey (Pfeil Ab) usw. versucht,
aber bei einer schnellen Suche (TimerInterval 10 ms) bzw. bei ungleichen Dateninhalten in der Tabelle "verschluckt" sich diese Methode und ist nicht sehr zuverlässig. 

Bei Übereinstimmung löst das Resultat weitere Funktionen aus.

Danke für die Anregungen und Ansätze. 

Jetzt suche ich nur noch eine Möglichkeit, beim Vergleichen "flexibler" zu sein, 
damit z.b. das Resultat auch TRUE wird, wenn nur Teile des TextStrings zusammenpassen bzw. Leerzeichen und die Groß/Kleinschreibung zu ignorieren.

Gruß
Jochen


----------



## ronaldh (4. Oktober 2007)

Die "Flexibilität" kannst Du vergrössern, wenn Du z.B. nur Buchstaben analysierst. Zum Beispiel so:


```
Private Function TextVergleich(TextZelle As String, Suche As String) As Boolean
     If 0 < Instr(Ucase$(LetterChar(TextZelle)), Ucase$(LetterChar(Suche))) Then
          TextVergleich = True
     Else
          TextVergleich = False
     End If
End Function

Private Function LetterChar(ByVal x As String) As String
'Funktion String zurück, der nur aus Buchstaben besteht

   Dim i As Integer
   Dim CP As String
   Dim NewStr As String
   NewStr = ""
   For i = 1 To Len(x)
      CP = Mid$(x, i, 1)
      If (CP >= "A" And CP <= "Z") Or (CP >= "a" And CP <= "z") Or 0 < InStr("äöüÄÖÜß", CP) Then
         NewStr = NewStr + CP
      End If
   Next
   LetterChar = NewStr
End Select
End Function
```

Das ganze kannst Du natürlich nach Belieben erweitern.

Ronald


----------



## Joi1981 (6. Oktober 2007)

Danke für den Tipp!
Werde ich gleich mal ausprobieren.

VG
Jochen


----------

