Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Userform
BildScreenshot zu Userform Userform-Seite mit Beispielarbeitsmappe aufrufen

Suche in mdb sowie End of DB erreicht?

Betrifft: Suche in mdb sowie End of DB erreicht? von: Ronald Wälty
Geschrieben am: 23.10.2020 14:49:43

Hallo an alle!

Wie kann ich die ganze Access-Datenbank oder auch nur eine Tabelle per VBA nach einem Schlüsselwort
durchsuchen lassen?
Ich habe es mit Recordset.Seek versucht, jedoch ohne Erfolg. Das sah dann so aus:

Public Sub Suche_KV()

    Dim i As Integer
    Dim strQuery As String

    If frmMain.txtSuchbegriff_KV.Text = "" Then
    Else
        strSuchbegriff = frmMain.txtSuchbegriff_KV.Text
    
        cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\_Privat\HOLZZZWERK\Büro\ _
Holzzzwerk ERP\HOLZZZWERK_ERP.mdb;Persist Security Info=False;"
        Set rs = cn.Execute("SELECT * FROM tKunden")

          Do While Not rs.EOF
          rs.Seek KeyValues:=strSuchbegriff, _
                  SeekOption:=adSeekFirstEQ
          If Not rs.EOF Then
            MsgBox Prompt:="Der Suchbegriff " & strSuchbegriff & _
                  " ist bereits in der Datenbank vorhanden." _
                  & vbNewLine & _
                  "Es wird keine Aktualisierung durchgeführt."
            
          End If
          'ze = ze + 1
        Loop
         cn.Close
    End If
End Sub

Als Meldung bekam ich Der aktuelle Provider unterstützt nicht die erforderliche Schnittstelle
für die Indexfunktion.

Für diese Suche ist mir auch nicht klar, wozu ich bei der Suche einen Index brauche, resp. wieso ich
einen Primärschlüssel angeben muß.

Also hab ichs ein bissl angepaßt:
Public Sub Suche_KV()

    Dim i As Integer
    Dim strQuery As String

    If frmMain.txtSuchbegriff_KV.Text = "" Then
    Else
        strSuchbegriff = frmMain.txtSuchbegriff_KV.Text

    cn.Open ConnectionString:= _
        "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=C:\_Privat\HOLZZZWERK\Büro\Holzzzwerk ERP\HOLZZZWERK_ERP.mdb;" & _
        "Mode=Share Exclusive"
    Set rs = New ADODB.Recordset
        rs.CursorLocation = adUseServer
        rs.Open Source:="tKunden", _
        ActiveConnection:=cn, _
        CursorType:=adOpenStatic, _
        LockType:=adLockPessimistic, _
        Options:=adCmdTableDirect
        rs.Index = "fKdNummer"

          Do While Not rs.EOF
          rs.Seek KeyValues:=strSuchbegriff, _
                  SeekOption:=adSeekFirstEQ
          If Not rs.EOF Then
            MsgBox Prompt:="Der Suchbegriff " & strSuchbegriff & _
                  " ist bereits in der Datenbank vorhanden." _
                  & vbNewLine & _
                  "Es wird keine Aktualisierung durchgeführt."
            
          End If
        Loop
         cn.Close
    End If
End Sub 
und bekam nun eine neue Meldung:
'fKdNummer' ist in dieser Tabelle kein Index.
Was mache ich falsch? Wäre schön, wenn jemand einen Tip für mich hat.

Desweiteren habe ich 2 Buttons, um von Datensatz zu Datensatz entweder vorwärts oder rückwärts zum
jeweils nächsten zu springen. Wie kann ich es hier abfangen, wenn das Ende der Tabelle erreicht ist?
Wenn ich beispielsweise die Kundennummer immer eins erhöhe und hierfür neu abrufe, um diesen Daten-
satz anzeigen zu lassen, funktioniert das gut. Wenns aber eins höher ist, als ich überhaupt Datensätze
drin habe, sollte dies abgefangen werden. Nur wie?

Vielen Dank im Voraus.
Gruß Ronald

Betrifft: AW: Suche in mdb sowie End of DB erreicht?
von: onur
Geschrieben am: 23.10.2020 17:11:21

Wie wäre es mit einem Acces-Forum?

Betrifft: AW: Suche in mdb sowie End of DB erreicht?
von: Ronald Wälty
Geschrieben am: 23.10.2020 17:20:01

Ich programmiere das ja in Excel VBA. Meine Access-Version unterstützt keine Userforms.

Gruß Ronald

PS: Wäre toll, wenn Du ein paar Tips für meine beiden Fragen hast.

Betrifft: AW: Suche in mdb sowie End of DB erreicht?
von: Ronald Wälty
Geschrieben am: 23.10.2020 17:35:03

Habe vergessen, den Haken zu setzen, daß das Problem noch nicht erledigt ist. Sorry.

Betrifft: AW: Suche in mdb sowie End of DB erreicht?
von: Luschi
Geschrieben am: 23.10.2020 18:02:38

Hallo Ronald,

wie man den Recordset richtig öffnet, daß man den 'Seek'-Befehl auch nutzen kann, zeigt diese Beispielseite: h i e r
Meist wird der Index auf den 'Primary Kex' gesetzt, so daß man auch nur nach diesen suchen kann.
Ich öffne den Recordset als Dynaset und benutze dann FindFirst/FindNext.
Der Aufwand mit '.Seek' lohnt sich erst bei sehr großen Tabellen.

Gruß von Luschi
aus klein-Paris

Warum Deine Access-Version keine Formularprogrammierung ermöglicht, bleibt mir schleierhaft.

Betrifft: AW: Suche in mdb sowie End of DB erreicht?
von: Ronald Wälty
Geschrieben am: 23.10.2020 21:34:51

Grüß Dich Luschi

Danke für Deine Antwort.
Formulare geht schon, aber keine UserForm. Ich habe im Internet eine Seite gefunden, die erklärt, wie
man dem Kontextmenü bei "Hinzufügen" den Menüpunkt "UserForm" hinzufügen kann. Aber es ging bei mir nicht, egal wie oft ich es ausgeführt und wie oft ich neugestartet habe. Ich kann nur ein Modul und
ein Klassenmodul hinzufügen. Keine UserForm. Also blieb mir nur der Schritt zum Excel. Bereut habe
ich es bisher nicht.

Das einzige, was ich jetzt nur noch wissen muß, ist
1. wie ich nach einem Suchbegriff die DB durchsuchen lassen kann, also beispielsweise die Kundennummer
KD-00003 auf Vorhandensein prüfen kann und
2. wie ich das Ende des Recordset abfangen kann (Beispiel: Ich habe einen Button, mit dem ich mich
vorwärts und rückwärts durch das Recordset durchdrücken kann und er zeigt mir dann jeweils den
vorherigen oder nachfolgenden Datensatz an. Dafür nutze ich die Kundennummer. String zerlegt zu reinen
Zahlen und diese jeweils um eins reduziert oder um eins erweitert. Wenn ich bei 0 bin, kann ich dies
abfangen. Aber beim Vorwärtsdrücken durchs Recordset sehe ich ja nicht, wann Schluß ist.
Kundennummer KD-00345 ist beispielsweise der letzte Eintrag. Da ich nicht weiß, wie ich das abfangen
kann, weiß die Software das nicht und erhöht um eins und lädt etwas, was es nicht gibt. Oder kam
sogar eine Fehlermeldung? Ich weiß es nicht mehr. Abfangen möchte ich es gerne.

Wenn ich diese beiden "Probleme" lösen kann, habe ich dann alles Handwerkszeug, um meine Software
zu beenden.

Gruß Ronald

Betrifft: AW: Suche in mdb sowie End of DB erreicht?
von: Luschi
Geschrieben am: 23.10.2020 21:59:45

Hallo Ronald,

wenn Du eine kleine Access-DB mit Demodaten bereitstellst, dann zeige ich Dir, wie das geht.

Gruß von Luschi
aus klein-Paris

Betrifft: AW: Suche in mdb sowie End of DB erreicht?
von: Ronald Wälty
Geschrieben am: 23.10.2020 22:26:31

https://www.herber.de/bbs/user/141049.zip

Hat ein bißchen gedauert :-)

Gruß Ronald

Betrifft: AW: Suche in mdb sowie End of DB erreicht?
von: Ronald Wälty
Geschrieben am: 27.10.2020 10:19:06

Grüß Dich Luschi

Bist Du schon dazu gekommen, Dir die Datenbank mal anzuschauen? Ist sie brauchbar für Dich?

Gruß Ronald

Betrifft: AW: Suche in mdb sowie End of DB erreicht?
von: Dieter Klemke
Geschrieben am: 27.10.2020 15:54:24

Hallo Ronald,

die Existenzprüfung zu einer bestimmten Kundennummer kannst du mit der Find-Methode folgendermaßen machen:
  rs.Find Criteria:="fKdNummer='" & kdNummer & "'", _
          SkipRecords:=0
  If Not rs.EOF Then
    MsgBox kdNummer & vbNewLine & "existiert"
  Else
    MsgBox kdNummer & vbNewLine & "existiert nicht"
  End If

Das vollständige Programm findest du in der beiliegenden Arbeitsmappe unter dem Namen "Existenz".
In der Arbeitsmappe sind noch 3 weitere Programme, die ich aus meinem Demo-Material an deine Datenbank angepasst habe.
Das Programm "ADO_Move_vorwärts" geht mit MoveFirst und MoveNext einmal vorwärts durch das gesamte Recordset, analog geht "ADO_Move_rückwärts" rückwärts durch das Recordset.
Das Programm "ADO_Find" sucht alle Sätze. die ein bestimmtes Kriterium erfüllen, z.B. "Geschäftskunde".
Du siehst an diesen Beispielen auch, wie du das Erreichen des Endes des Recordsets erkennst.
Die Methode MoveNext z.B. setzt die Recordset-Eigenschaft EOF auf True, wenn sie sich über den letzten Satz hinaus bewegt hat. Analog bei Find.

https://www.herber.de/bbs/user/141130.xlsm

Viele Grüße
Dieter

Betrifft: AW: Suche in mdb sowie End of DB erreicht?
von: Ronald Wälty
Geschrieben am: 27.10.2020 16:48:57

Grüß Dich Dieter

Danke für das Beispielprojekt. Auch der Hinweis mit dem EOF auf true, wenn es über
den letzten Satz hinausgeht, ist Gold wert. Vielen Dank!

Ich werde das heute Abend mal anschauen und umsetzen.

Gruß Ronald