2017-09-21 2 views
0

Ich versuche, Daten aus Access mithilfe einer Spalte von Excel zu extrahieren.Daten aus Access mit VBA mit Daten von Excel erhalten

Ich habe den folgenden Code versucht, aber es dauert nicht zu viel Zeit, wenn Anzahl der Zeilen in Excel 5k Zeilen überschreiten. Kennt jemand einen besseren Weg, um die Excel-Daten zu verweisen, die Ergebnisse zu erhalten:

Sub ddd() 
Const dbloc As String = "C:\Users\mysystem\Downloads\Database11.accdb" 
Dim db As DAO.Database 
Dim rs As DAO.Recordset 
Dim xlbook As Workbook 
Dim xlsheet As Worksheet 
Dim a As Long 
Dim SQL As String 


Set xlbook = ActiveWorkbook 
Set xlsheet = xlbook.Worksheets(1) 
xlsheet.Range("B2:Z100000").ClearContents 

Set db = OpenDatabase(dbloc) 

SQL = "SELECT Material, MPN " 
SQL = SQL & "FROM Sheet2 " 

SQL = SQL & "WHERE Material IN (" 
Dim r As Range 
For Each r In Range("A2:A19098") 
    SQL = SQL & r.Text & "," 
Next r 
SQL = Left(SQL, Len(SQL) - 1) 'Drop last comma 
SQL = SQL & ")" 

' i want to change this for loop because my range might vary from 80-100k 
    rows and this method is not working. i got a suggestion here that i can 
    use a table for this. But i am new to macros and access and not sure of 
    the syntax. Can anyone please help with the syntax. Assuming tablename for 
    the excel data is column1 and ranges from a2:a100000 


Set rs = db.OpenRecordset(SQL) 
', dbOpenSnapshot) 
If rs.RecordCount = 0 Then 
MsgBox "No data retrieved from database", vbInformation + vbOKOnly, "No 
Data" 
    GoTo SubExit 
Else 
    rs.MoveLast 
    recCount = rs.RecordCount 
    rs.MoveFirst 
End If 
xlsheet.Range("C2").CopyFromRecordset rs 

End Sub 

Jede Hilfe werde ich sehr geschätzt. Vielen Dank!!

+0

was meinst du 'eine Spalte verwenden'? .... Ich denke, dass Sie sagen wollten ... aber es dauert zu viel Zeit ... '... bitte aktualisieren Sie Ihre Frage – jsotola

+0

Ich implementierte ähnliche Operation in Access - Daten in Tabelle basierend auf gefilterten Recordset von aktualisieren Schlüsselwerte. Die beste Leistung, die ich erzielt habe, wenn für jede Abfrage Stücke von 100 Schlüsseln verwendet wurden. Sie verwenden einen Block mit 19000 Schlüsseln, der langsam sein kann. Überprüfen Sie, ob die Zugriffstabelle einen Index im Schlüsselfeld hat. Auch SQL-Text kann in Ihrem Fall 64K überschreiten. –

+0

Hallo @jsotola, mit einer Spalte hier bedeutet, ich überprüfe Einträge aus einer Spalte in meinem Excel wb, um Ergebnisse aus der Access-Datenbank abrufen. Du hast Recht, aber es braucht zu viel Zeit ... Weißt du, dass es ein besserer Weg ist, um das zu erreichen? Ich bin neu auf Zugang und Makro, also bitte helfen Sie mit der Syntax auch danke! –

Antwort

1

Wenn Sie sich für einen alternativen Weg suchen, um eine Excel-Spalte zu verweisen, können Sie die folgenden Befehle verwenden:

SQL = "SELECT Material, MPN " 
SQL = SQL & "FROM Sheet2 " 

SQL = SQL & "WHERE Material IN (" 
SQL = SQL & "SELECT * FROM [A1:A19098] IN '" 
SQL = SQL & ActiveWorkbook.FullName & "'" 
SQL = SQL & " 'Excel 12.0 Macro;')" 

Dies ermöglicht die DAO-Datenbank-Engine direkt abzufragen Ihre Excel über OleDb Datei, statt des Führens jede Zeile als Text, was effizienter sein sollte.

Die Excel-Datei sollte gespeichert werden, bevor Sie dies tun (und es ist besser, es aus einer anderen Datei auszulösen, aber funktioniert für mich, wenn Sie aus der gleichen Datei auslösen).

Beachten Sie, dass ich absichtlich 1 Zeile mehr hinzufügen, da die erste Zeile Spaltennamen enthält, wenn Sie dies verwenden.

Ich nehme an, Sie verwenden eine .xlsm Datei.

Verwandte Themen