Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema CheckBox
BildScreenshot zu CheckBox CheckBox-Seite mit Beispielarbeitsmappe aufrufen
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
Informationen und Beispiele zum Thema Label
BildScreenshot zu Label Label-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema TextBox
BildScreenshot zu TextBox TextBox-Seite mit Beispielarbeitsmappe aufrufen

1. ADODB und Recordset; 2. Userform und Textbox

Betrifft: 1. ADODB und Recordset; 2. Userform und Textbox von: Martin K.
Geschrieben am: 14.08.2004 12:29:12

Hallo,

folgende Ausgangssituation:

Es gibt eine (extern eingekaufte) Access-Anwendung, mit der bestimmte Kunden- und Referenzdaten bearbeitet werden. Die eigentlichen Daten sind in einer MDB-Datei abgelegt. Die MDB liegt auf einem Server in unserer Firma, dass mehrere Leute von unterschiedlichen Standorten damit arbeiten können (ja ich weiß, ne SQL-Server-Variante wäre besser, aber unser Chef will da kein Geld für ausgeben). Leider stellt die Access-Anwendung nicht alle spezifischen Funktionen bereit, die ich für Controlling-Zwecke benötige. Eine Anpassung ist nicht möglich. Deshalb habe ich ein Excel-Frontend entwickelt, das mir spezifische Abfragen und Auswertungen ermöglicht. Soweit so klar?

Nun meine 1. Frage:
Die Access-Daten der MDB-Datei werden von mir per ODBC und nem SQL-Query "abgeholt" und in einen Recordset geschrieben. Aus dem Recordset werden die Daten dann in mein Tabellenblatt "Daten" geschrieben. Ich verwende dabei folgende Lösung, wobei ich die aus diesem Board hier habe (ob es schnellere und elegantere gibt, weiß ich nicht, die hier funktioniert über "ActiveX Data Objects 2.x"):


Sub ADO_Recordset_komplett_uebernehmen(vblQuery)

' Ein Recordset wird mit sämtlichen Feldern
' in eine Tabelle übernommen
Application.ScreenUpdating = False
Dim con As ADODB.Connection
Dim datei As String
Dim fld As Field
Dim rs As ADODB.Recordset
Dim spalte As Long
Dim accTab As String
Dim ws As Worksheet
Dim zeile As Long

' (0) SQL-String
accTab = "SELECT * FROM tblKunde WHERE (tblkunde.KdNr Like '%" & vblQuery & "%')"

' (1) Verbindung zur Datenbank herstellen

datei = "k:\SGB2Anw\SGB2_dat.mdb"

Set con = New ADODB.Connection
con.Open ConnectionString:= _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & datei

' (2) Recordset erstellen

Set rs = New ADODB.Recordset
rs.CursorLocation = adUseServer
rs.Open Source:=accTab, _
ActiveConnection:=con, _
CursorType:=adOpenKeyset, _
LockType:=adLockReadOnly, _
Options:=adCmdTableDirect

' (3) Recordset auflisten

' (3a) Tabellenblatt vorbereiten

Set ws = ThisWorkbook.Worksheets("Daten")
ws.UsedRange.ClearContents

' (3b) Spaltenüberschriften schreiben

'spalte = 1
'For Each fld In rs.Fields
'ws.Cells(1, spalte) = fld.Name
'spalte = spalte + 1
'Next fld

' (3c) Sätze des Recordsets auflisten

ws.Range("A2").CopyFromRecordset _
Data:=rs, _
MaxRows:=ws.Rows.Count - 1, _
MaxColumns:=ws.Columns.Count

' (3d) Tabellenblatt formatieren

'ws.UsedRange.Columns.AutoFit

' (4) Recordset und Verbindung schließen

rs.Close
con.Close
Set rs = Nothing
Set con = Nothing
Application.ScreenUpdating = True
End Sub

Die konkrete Frage lautet nun: in Office XP dauert die Abfrage nicht sehr lange, aber das Einlesen des Recordsets in die Tabelle. Während des Einlesens erscheint immer wieder in der Statuszeile Dinge wie "Zeile...". Kann man das irgendwie beschleunigen oder verhindern, dass die Statuszeile geändert wird? Gibt es eine schnellere Variante zur Abfrage der Daten mittels SQL-Query?


Nun die 2. Frage:
In einer TextBox in einer UserForm gebe ich als Suchkriterium z.B. die Kundennummer ein (in der UserForm wird es unterschiedliche Suchkriterien geben). Daraus wird ein Query-String erzeugt (z.B. SELECT * from tblKunde WHERE KNR="%050%") und an die unter 1. genannte Abfrage geschickt. Das Ergebnis wird im Tabellenblatt Daten dargestellt. Mit folgendem Code habe ich das mal versucht umzusetzen:

Private Sub txtKNR_Change()
ADO_Recordset_komplett_uebernehmen (txtKNR)
End Sub


Das klappt auch. Aber leider wird dabei eben bei jeder Eingabe in diesem Feld die Query durchgeführt. Ich möchte aber, dass die Query erst dann ausgeführt wird, wenn innerhalb von 1 Sekunde keine weitere Eingabe im Feld erfolgt, sodass man die Chance hat, den zu suchenden Kunden(teil)string vollständig einzugeben, bevor gesucht wird.

Konkret stellt sich die Frage: Wie schaffe ich, dass erst dann die Query ausgelöst wird, wenn die letzte Änderung/Eingabe in dem Feld 1 Sekunde her ist?

Ich hoffe Ihr könnt mir helfen, ich stehe nämlich auf dem Schlauch.

Danke und Gruß

Martin
  


Betrifft: AW: 1. ADODB und Recordset; 2. Userform und Textbox von: Ulf
Geschrieben am: 14.08.2004 13:23:31

zu1: zeitweilig alle Excel- Events ausschalten.

zu2: das Change-Ereignis wird bei jeder Änderung ausgelöst, verwende ein anderes Ereignis, z.B. exit.

Ulf


  


Betrifft: AW: 1. ADODB und Recordset; 2. Userform und Textbox von: Martin K.
Geschrieben am: 14.08.2004 13:54:15

Danke.

Zu 1.: Wie schalte ich alle Events aus?

Zu 2.: Ich will aber das Feld nicht extra verlassen müssen. Auch will ich keine Schaltfläche "Suchen" oder so verwenden. Es soll just-in-time gesucht werden, sobald die letzte Eingabe länger als 1 Sekunde zurückliegt.

Martin


  


Betrifft: AW: 1. ADODB und Recordset; 2. Userform und Textbox von: Thomas Risi
Geschrieben am: 14.08.2004 14:05:34

Hallo Martin

1; Application.EnableEvents = False

2; Schau Dir mal das TimerControl auf meiner Webseite an, damit ist es ganz einfach.


      
Option Explicit

Dim Blocked As Boolean

Private Sub TextBox1_Change()
    Blocked = 
False
    TimerControl1.Deactivate
    TimerControl1.Start
End Sub

Private Sub TimerControl1_OnTime()
    
If Not Blocked Then
        MsgBox 
"TEST"
        Blocked = 
True
    
End If
End Sub 




Gruß
Thomas

Risi Thomas Softwareentwicklung




  


Betrifft: AW: 1. ADODB und Recordset; 2. Userform und Textbox von: Martin K.
Geschrieben am: 14.08.2004 15:17:42

Hallo Thomas,

super, danke für Deine Hilfe und Deinen Tipp.

Grüße

Martin


  


Betrifft: AW: 1. ADODB und Recordset; 2. Userform und Textbox von: Ulf
Geschrieben am: 14.08.2004 14:29:58

"Es soll just-in-time gesucht werden, sobald die letzte Eingabe länger als 1 Sekunde zurückliegt."

Könntest du auch so ausdrücken: Sofort, halt nur später!

Ulf


  


Betrifft: AW: 1. ADODB und Recordset; 2. Userform und Textbox von: Martin K.
Geschrieben am: 14.08.2004 15:16:08

"Könntest du auch so ausdrücken: Sofort, halt nur später!"

Da vergleichst Du Äpfel mit Birnen.

Just-In-Time heißt übersetzt soviel wie "gerade rechtzeitig", also dann wenn man es braucht. Die Suche auslösen ist dann gerade rechtzeitig, wenn seit der letzten Eingabe 1 Sekunde vergangen ist.

Anders ausgedrückt: genau dann, wenn ein Kriterium erfüllt ist, soll gesucht werden. Die Suche soll ohne weiter Schritte des Nutzers ausgelöst werden, wenn das Kriterium Zeitverlauf erfüllt ist.


  


Betrifft: AW: 1. ADODB und Recordset; 2. Userform und Textbox von: Ulf
Geschrieben am: 14.08.2004 15:30:33

Na ja, Hauptsache, du hast jetzt eine Lösung.

Ulf


  


Betrifft: AW: 1. ADODB und Recordset; 2. Userform und Textbox von: Martin K.
Geschrieben am: 14.08.2004 15:36:32

Stimmt, da hast Du Recht. ;-)

Deshalb nochmal ein dickes Dankeschön für Deine Hilfe!

Martin


 

Beiträge aus den Excel-Beispielen zum Thema "1. ADODB und Recordset; 2. Userform und Textbox"