Anzeige
Archiv - Navigation
868to872
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
868to872
868to872
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Dynamisch Gefilterter Import aus Access per VBA

Dynamisch Gefilterter Import aus Access per VBA
10.05.2007 18:58:44
ulrich.engelke@gmx.net

Ich habe folgendes Problem: Ich muss aus einer Access-Datenbank Artikeldaten zur Weiterverarbeitung in ein Excel-Tool importieren und möchte die importierten Daten zur Beschränkung des Datenvolumens über die Kundennummer filtern lassen.
Das Excel Sheet hat dazu neben vielen anderen Kartenreitern einen Planungskartenreiter (nenne wir ihn "Start") und einen als Warehouse genutzten Kartenreiter (nennen wir ihn "Daten"). Auf dem Kartenreiter "Start" befinden sich die Auftragsbezogenen Stammdaten von denen die Kundennummer dazu dienen soll die kundenindividuellen Artikelsätze gefiltert auf den Kartenreiter "Daten" zu importieren.
Um den Import zu starten habe ich eine Schaltffläche angelegt, der ich ein Makro hinterlegen möchte. Mangels VBA-Kenntnissen habe ich dieses über den Makro-Recorder generiert: Es beinhaltet unter anderem folgende Zeile:
"FROM ExportExcel_ETeile_Eigfert_Kundenpreise ExportExcel_ETeile_Eigfert_Kundenpreise" & Chr(13) & "" & Chr(10) & "WHERE (ExportExcel_ETeile_Eigfert_Kundenpreise.Kundennummer=100011)"
Die Kundennummer 100011 resultiert daher, dass ich im Makrorecorder nur zwischen den vorhandenen Kundennummern auswählen konnte.
Was ich benötige ist ein Code, mit dem ich statt einer fest hinterlegten Kundennummer eine Referenz auf eine bestimmte Zelle (z.B. "C1") auf dem Kartenreiter "Start" legen kann.
Ich habe schon ein wenig rumprobiert, in dem ich
Dim KdNr As Range
Set KdNr = Range("C1")

vorangestellt habe und dann die Kundennummer 100011 einfach durch KdNr ersetzt habe. Das funktioniert aber leider nicht so einfach.
Ich bin für jede Anregung dankbar.
Gruss, Ulrich

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Dynamisch Gefilterter Import aus Access per VBA
11.05.2007 08:36:06
Luschi
Hallo Ulrich,
habe Dir mal ein kleines Beispiel dazu gemacht, um erstmal das Prinzip zu zeigen.
Wahrscheinlich muß daran aber noch gebastelt werden, um den Quell-SQL-Text der Abfrage 1 in der Access-DB zu ändern, anstatt nur von Excel aus die gefilterte Abfrage 1 zu lesen.
Es wird wahrscheinlich so sein, daß ADO-DB erst alle Daten an Excel schickt und dann erst filtert.
Aber teste doch erstmal.
https://www.herber.de/bbs/user/42413.zip
Gruß von Luschi
aus klein-Paris

AW: Dynamisch Gefilterter Import aus Access per VBA
11.05.2007 13:55:33
ulrich.engelke@gmx.net
Vielen Dank schon einmal Luschi,
jetzt besteht das Problem nur noch darin einen Filter einzubauen. Ich bin mir nicht sicher, ob Excel erst alle Daten importieren muss und dann filtert, oder ob der Filter nicht schon während des Datenimportes laufen kann.
Ich hatte über den Makrorekorder folgende Lösung bekommen. Das Problem besteht jedoch darin statt eines hart eingetragenen Filters (z.B. einer konkreten Kundennummer) einen dynamischen Bezug zu realisieren:
Ich bin weiterhin für jede Lösung bzw. Anregung dankbar.
Gruss, Ulrich
------


Sub Makro1()
Dim KdNr As Range
Set KdNr = Range("C1")
Sheets("Import").Select
Range("A1").Select
With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
"ODBC;DSN=MS Access Database;DBQ=C:\Dokumente und Einstellungen\Uli\Eigene Dateien\ _
Kalkulation.mdb;DefaultDir=C:\Dokumente und Einstellungen\Uli\Eigene Dateien\ServerId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;" _
)), Destination:=Range("A1"))
.CommandText = Array( _
"SELECT ExportExcel_ETeile_Kaufteile_Kundenpreise.Mat_Kunde_ID,  _
ExportExcel_ETeile_Kaufteile_Kundenpreise.Materialnr, ExportExcel_ETeile_Kaufteile_Kundenpreise.Kundennummer, ExportExcel_ETeile_Kaufteil" _
, _
"e_Kundenpreise.Kundenname, ExportExcel_ETeile_Kaufteile_Kundenpreise.Preis_Ang,  _
ExportExcel_ETeile_Kaufteile_Kundenpreise.Datum_Ang, ExportExcel_ETeile_Kaufteile_Kundenpreise.VBELN_Ang, ExportExcel_ET" _
, _
"eile_Kaufteile_Kundenpreise.Preis_Auf, ExportExcel_ETeile_Kaufteile_Kundenpreise. _
Datum_Auf, ExportExcel_ETeile_Kaufteile_Kundenpreise.VBELN_Auf" & Chr(13) & "" & Chr(10) & "FROM ExportExcel_ETeile_Kaufteile_Kundenpreise ExportEx" _
, _
"cel_ETeile_Kaufteile_Kundenpreise" & Chr(13) & "" & Chr(10) & "WHERE ( _
ExportExcel_ETeile_Kaufteile_Kundenpreise.Kundennummer=KdNr)" _
)
.Name = "Abfrage von MS Access Database_4"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:=False
End With
Sheets("Start").Select
End Sub


Anzeige
AW: Dynamisch Gefilterter Import aus Access per VBA
11.05.2007 15:58:19
Luschi
Hallo Ulrich,
da Access kein SQL-Server ist, werden immer erst alle Daten über's Netz geschickt und dann gefiltert, wenn der
"Select"-Befehl vom Client-Rechner gestartet wird. Deshalb braucht das bei großen Datenbeständen auch seine Zeit.
Das einzige Möglichkeit ist wohl, die Abfrage in der Access-DB anzulegen und den SQL-Quell-Quode der Abfrage zu manipulieren.
In Access mache ich das öfters. Da haben alle Berichte die selbe Abfrage als Datenquelle. Bevor aber der Bericht
gestartet wird, werden per Formular die Filterkriterien definiert und daraus dann der SQL-Code für die Abfrage konstruiert
und geschrieben.
Ob das auch per ADO-DB von Excel aus geht, die Access-Abfrage so zu manipulieren, teste ich mal morgen und gebe Bescheid.
Gruß von Luschi
aus klein-Paris

Anzeige
AW: Dynamisch Gefilterter Import aus Access per VBA
11.05.2007 17:58:45
Luschi
Hallo Ulrich,
habe nun doch schon schneller Dein Problem gelöst. Es ist mit ADOX möglich, den Quellcode einer Abfrage in MDB's zu ändern. Damit dürften dann nur die Datensätze über's Netz laufen, die von der Abfrage gefiltert werden.
https://www.herber.de/bbs/user/42433.zip
Gruß von Luschi
aus klein-Paris

AW: Dynamisch Gefilterter Import aus Access per VBA
12.05.2007 15:19:53
ulrich.engelke@gmx.net
Hallo Luschi,
vielen Dank für Deine Mühen. Wenn ich Dich richtig verstehe, soll Excel per ADOX das Filterkriterium in der Access-Abfrage ändern. In der angehangenen Excel-Datei soll dies vermutlich über das Makro "ImportFromAccess" erfolgen.
In der mir zur Verfügung gestellten Beispieldatei (zwischen denen mir am 10.05 und 11.05 geposteten Dateien konnte ich keinen Unterschied finden), konnte ich so etwas nicht finden.
Du würdest mir sehr helfen, wenn Du in Deiner Beispieldatei "MappeExcelZugriff.xls" einfach eine Zelle als Filterkriterium anlegst, die dann z.B. zur Filterung über die Postleitzahl die Daten aus der db1.mdb gefiltert importiert.
Vielen Dank und schönes Wochenende,
Ulrich

Anzeige
Sorry, falsche Datei geschickt!
12.05.2007 17:58:14
Luschi
Hallo Ulrich,
habe das Problem nochmals überarbeitet. Ja, es ist so, daß mit Hilfe von ADOX die Abfrage in der Access-Datei dauerhaft manipuliert wird; es wird der SQL-Code ausgetauscht.
https://www.herber.de/bbs/user/42446.zip
Gruß von Luschi
aus klein-Paris

PERFEKT :)))))))))
12.05.2007 19:51:29
ulrich.engelke@gmx.net
Herzlichen Dank Luschi,
die Lösung trifft vollends meine Erwartungen. Mein einziges Problem ist noch, dass meine VBA Kenntnisse noch nicht ausreichen sie vollends zu verstehen und somit richtig anzupassen. Meine hoffentlich letzte Frage/Belästigung zielt daher darauf ab die Lösung richtig zu verstehen um sie dann eigenständig in meine Excel-Datei einzuarbeiten:
Wenn ich es richtig verstanden habe ist die Abfolge wie folgt:
1) Per Klick auf die Schaltfläche wird das Makro "ImportFromACCESS" aufgerufen und die Zelle mit dem Namen "gesamtPLZ" als Wert definiert


Private Sub CommandButton1_Click()
ImportFromACCESS [gesamtPLZ].Value, 1
End Sub


2) Im Makro "ImportFromACCESS" erfolgt dann die Erstellung des SQL-Statements zwecks Übertragung an Access, wobei der Filter wie folgt definiert wird: "Where Tabelle1.PLZ = " & setChr34(Right("00000" & x_PLZ, 5))"
3) Die Verbindung zwischen dem Wert und dem Filter erfolgt in folgender Funktion:
Function setChr34(xWert As String)
setChr34 = Chr(34) & xWert & Chr(34)
End Function


Was ich jedoch noch nicht verstehe ist, wie bzw. wo aus „gesamtPLZ“ für den Filter „X_PLZ“ wird und was die Funktion zu setChr34 genau macht.
Sobald ich dies verstanden habe, hoffe ich dann die Einbettung in mein Tool alleine hinzubekommen.
Vielen Dank schon im Voraus,
ich bin sehr glücklich, dass Du eine so tolle Lösung gefunden hast :)
Ulrich

Anzeige
AW: Kurze Zusatzfrage
12.05.2007 21:07:41
ulrich.engelke@gmx.net
Noch ein Punkt: Gibt es Probleme, wenn ich (in dem Beispiel) das Format des zu filternend Feldes statt als Textfeld als Long Integer definiert habe? Reicht es dazu aus einfach im Makro das
x_PLZ As String durch x_PLZ As Long
auszutauschen, oder gibt es ansonsten Probleme mit der Chr(34)-Funktion ?
Vielen Dank im Voraus
Ulrich

AW: Kurze Zusatzfrage
13.05.2007 08:05:22
Luschi
Hallo Ulrich,
schicke Dir nochmals die Excel-Datei. Habe am Programm-Code nichts geändert, aber in "Module2"
ein paar Hinweise/Erklärungen geschrieben.
Solltest Du Probleme bei der Umsetzung haben, dann melde Dich einfach wieder.
https://www.herber.de/bbs/user/42448.zip
Gruß von Luschi
aus klein-Paris

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige