Często zdarza mi się korzystać z zapytań sql w vba, w niektórych wypadkach taka metoda jest dużo szybsza niż korzystanie z pętli. Przykładowy kod podaję poniżej i wyjaśniam.
Sub vSelect()
Dim cConStr As String
Dim oRst As ADODB.Recordset
Dim oCon As ADODB.Connection
ThisWorkbook.Worksheets("wynik").Cells.ClearContents
ThisWorkbook.Worksheets("wynik").Range("A1").Value = "Pracownik"
ThisWorkbook.Worksheets("wynik").Range("B1").Value = "Miasto"
cConStr = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=" & _
ThisWorkbook.FullName
Set oCon = New ADODB.Connection
Set oRst = New ADODB.Recordset
oCon.Open cConStr
If oCon.State = adStateOpen Then
oRst.Open "SELECT a.nazwa, b.nazwa FROM [miasta$] b inner join [pracownicy$] a on" & _
"(b.id = a.id_miasto and b.nazwa = 'Warszawa') order by a.id", oCon
ThisWorkbook.Worksheets("wynik").Cells(2, 1).CopyFromRecordset oRst
oRst.Close
oCon.Close
End If
Set oRst = Nothing
Set oCon = Nothing
End Sub
W pliku mamy trzy zakładki: pracownicy, miasta, wynik
Arkusz pracownicy wygląda tak:
| id | nazwa | id_miasto | 
| 1 | Pracownik1 | 1 | 
| 2 | Pracownik2 | 2 | 
| 3 | Pracownik3 | 4 | 
| 4 | Pracownik4 | 3 | 
| 5 | Pracownik5 | 2 | 
| 6 | Pracownik6 | 4 | 
| 7 | Pracownik7 | 3 | 
| 8 | Pracownik8 | 1 | 
| 9 | Pracownik9 | 1 | 
| 10 | Pracownik10 | 2 | 
| 11 | Pracownik11 | 3 | 
| 12 | Pracownik12 | 4 | 
| 13 | Pracownik13 | 2 | 
| 14 | Pracownik14 | 1 | 
| id | nazwa | 
| 1 | Warszawa | 
| 2 | Kraków | 
| 3 | Wrocław | 
| 4 | Poznań | 
| Pracownik | Miasto | 
| Pracownik1 | Warszawa | 
| Pracownik8 | Warszawa | 
| Pracownik9 | Warszawa | 
| Pracownik14 | Warszawa | 
Czasem żeby zadziałało trzeba dodać referencje w Tools => References
https://msdn.microsoft.com/en-us/library/ms677497%28v=vs.85%29.aspx
Brak komentarzy:
Prześlij komentarz