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