SELECT na jednym zakresie   strona główna:
A po co ten Excel ;-)
 
Robimy powtórkę z SELECT :-)  
   W pliku Baza.xlsx w Ark.Faktury mamy dane…   baza.xlsx
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Będziemy importować do pliku zeszyt1.xlsm całość lub część tych danych poprzez ADO i zapytania SQL z klauzulą SELECT.  
    Co będzie nam potrzebne?  
 - do modułu Standardowego modFConn wstawiam funkcję XLSConnectionString   Funkcja XLSConnectionString
 - do modułu Standardowego modSubSelect  
 
Option Explicit  
Const adUseClient = 3  
Const adModeRead = 1  
Const adCmdText = 1  
Const adStateOpen = 1  
Const adEditNone = 0  
 
Public Sub ExecuteSQLCommand_ADO(strConnectionString As String, _  
                                 strSQL As String, _  
                                 rngKomCel As Excel.Range)  
                                   
    On Error GoTo ExecuteSQLCommand_ADO_Error  
    Dim objConnection As Object, objRecordset As Object  
               
    Set objConnection = CreateObject("ADODB.Connection")  
    With objConnection  
        .CursorLocation = adUseClient  
        .Mode = adModeRead  
        .Open strConnectionString  
        Set objRecordset = .Execute(strSQL, , adCmdText)  
        With objRecordset  
            If Not (.BOF And .EOF) Then rngKomCel.CopyFromRecordset objRecordset  
        End With  
    End With  
              
ExecuteSQLCommand_ADO_Exit:  
    On Error Resume Next  
    CloseRSObject objRecordset  
    CloseConObject objConnection  
    Exit Sub  
              
ExecuteSQLCommand_ADO_Error:  
    MsgBox "Byk nr: - " & Err.Number & vbCrLf & vbCrLf & _  
            Err.Description, vbExclamation, "VBAProject - ExeSQLComADO"  
    Resume ExecuteSQLCommand_ADO_Exit  
            
    End Sub  
 
Public Sub CloseConObject(Cnn As Object)  
    If Not (Cnn Is Nothing) Then  
        If Cnn.State = adStateOpen Then Cnn.Close  
        Set Cnn = Nothing  
    End If  
End Sub  
         
Public Sub CloseRSObject(Rs As Object)  
    If Not (Rs Is Nothing) Then  
        With Rs  
            If CBool(.State And adStateOpen) Then  
                If .EditMode <> adEditNone Then .CancelUpdate  
                .Close  
            End If  
        End With  
        Set Rs = Nothing  
    End If  
End Sub  
 
   To mój standardowy zestaw procedur do importu danych z najróżniejszych źródeł. Tak samo będzie on wyglądał przy imporcie  
z plików Excela, baz danych Access'a, czy MySQL. To dość uniwersalne narzędzie. :-)  
 
I teraz sama procedura importu danych.. (modStart)  
 
Option Explicit  
 
Sub StartSELECT()  
    Dim xlWks As Excel.Worksheet, strSQL As String  
      
    Const strBazaXLSFileFullName As String = "C:\Users\MiTKuchta\Desktop\Baza.xlsx"  
    Const strRngAddress As String = "[Faktury$A:E]"  
      
    Set xlWks = ThisWorkbook.Worksheets("Arkusz1")  
      
    strSQL = "SELECT * " & _  
             "FROM " & strRngAddress & ";"  
      
    ExecuteSQLCommand_ADO XLSConnectionString(strBazaXLSFileFullName), _  
                          strSQL, xlWks.[A1]  
                            
    Set xlWks = Nothing  
      
End Sub  
 
No chyba do bólu proste ;-P Jednak długo polegałem włąśnie na tym prostym "SELECT * FROM [tabela]" :lol: i żeby np. coś z tych  
danych "wyłuskać" zamiast procedury ExecuteSQLCommand_ADO pisałem funkcję która dane zwracała do tablicy, a w tablicy to już  
mogłem wszystko B-)  
    Jak jednak poznałem trochu SQL okazało się że wygodniej jest importować nie wszystkie dane ale zawęzić je do oczekiwanych już  
na etapie zapytania. Poniższe przykłady strSQL wyjaśnią chyba większość :-)  
 
    strSQL = "SELECT [Kontrahent], [Wartość] " & _  
             "FROM " & strRngAddress & " " & _  
             "WHERE [Wartość] > 300;"  
 
Dane z kolumn Kontrahent i Wartość jeżeli Wartość > 300, będą to zatem wszystkie f-ry których wartość > 300.  
 
             'YEAR, MONTH, DAY  
    strSQL = "SELECT * " & _   SQL Date Functions
             "FROM " & strRngAddress & " " & _  
             "ORDER BY MONTH([Data]) DESC;"  
      
Dane ze wszystkich kolumn jednak posortowane malejąco po miesiącu ich wystawienia  
 
            'BETWEEN  
    strSQL = "SELECT * " & _  
             "FROM " & strRngAddress & " " & _  
             "WHERE [Data] BETWEEN #2011-01-01# AND #2011-03-31#;"   SQL BETWEEN Operator
      
Operator BETWEEN i jego składnia dla dat. Zapytanie zwróci wszystkie dane z faktur z pierwszego kwartału.  
 
    strSQL = "SELECT DISTINCT [Kontrahent] " & _   SQL SELECT DISTINCT Statement
             "FROM " & strRngAddress & " " & _  
             "WHERE [Kontrahent] <> NULL;"  
 
Unikaty z kolumny Kontrahent. To "WHERE [Kontrahent] <> NULL" po to żeby zapytanie nie zwracało pustych komórek.  
 
             ' IN  
    strSQL = "SELECT * " & _   SQL IN Operator
             "FROM " & strRngAddress & " " & _  
             "WHERE [Opis] IN ('Opis1','Opis3');"  
               
Operator IN. Coś lepszego od OR ;-)  
 
             'LIKE * -> %, ? to (znak podkreślenia)   SQL LIKE Operator
    strSQL = "SELECT * " & _   SQL Wildcards
             "FROM " & strRngAddress & " " & _  
             "WHERE [Opis] LIKE 'opis%';"  
 
Operator LIKE i wyrażenia wieloznaczne  
  SQL GROUP BY Statement
             'SUM, MIN, MAX, COUNT, AVG (średnia), ROUND(wart,zaokr), FIRST, LAST   SQL Aggregate Functions
    strSQL = "SELECT [Kontrahent], SUM(ROUND([Wartość],0)), COUNT(*), LAST([Data]) " & _  
             "FROM " & strRngAddress & " " & _  
             "GROUP BY [Kontrahent];"  
                   
Grupowanie i Funkcje Agregujące.  
 
             ' UCASE, LCASE, _  
               MID, LEFT i RIGHT (drugi parametr NIE opcionalny), _  
               LEN, TRIM (również działa LTRIM, RTRIM)  
 
Funckcje działające na ciągach tekstowych - bez przykładu :-P  
                  
             'HAVING  
    strSQL = "SELECT [Kontrahent], SUM([Wartość]) " & _   SQL HAVING Clause
             "FROM " & strRngAddress & " " & _  
             "GROUP BY [Kontrahent] " & _  
             "HAVING SUM([Wartość]) > 200;"  
 
Klauzula HAVING a więc stawianie warunków podczas grupowania.   plik z przykładami do ściągnięcia..
  zeszyt1.xlsm