Modyfikowanie danych w zamkniętym pliku Excela   strona główna:
A po co ten Excel ;-)
 
    Chciałbym teraz pokazać procedurę którą będzimy modyfikować dane w pliku baza.xlsx bez otwierania tego pliku poprzez ADO.   baza.xlsx
Do realizacji tego zadania będziemy wykorzystywać procedurę ExecuteNoRecords_ADO której przekażemy: nazwę pliku na którym  
chcemy pracować (nasza baza.xlsx) oraz polecenie SQL realizujące zadanie.  
 
Sub ExecuteNoRecords_ADO(strConnStr As String, strSQL As String)  
    On Error GoTo ExecuteNoRecords_Error  
    Dim objCommand As Object  
      
    Const adCmdText = 1  
    Const adExecuteNoRecords = 128  
      
    Set objCommand = CreateObject("ADODB.Command")  
      
    With objCommand  
        .ActiveConnection = strConnStr  
        .CommandType = adCmdText  
        .CommandText = strSQL  
        .Execute Options:=adExecuteNoRecords  
    End With  
      
ExecuteNoRecords_Exit:  
    On Error Resume Next  
    Set objCommand = Nothing  
    Exit Sub  
 
ExecuteNoRecords_Error:  
    MsgBox "Błąd Numer - " & Err.Number & vbCrLf & vbCrLf & _  
           Err.Description, vbExclamation, "VBAProject - ExecuteNoRecords"  
    Resume ExecuteNoRecords_Exit  
End Sub  
 
 
Sub Start()  
    Dim strSQL As String  
      
    Const strBazaXLSFileFullName As String = "C:\Documents and Settings\jr\Pulpit\Baza.xlsx"  
    Const strRngAddress As String = "[Faktury$A:E]"  
      
    'strSQL = "..."  
      
    ExecuteNoRecords_ADO XLSConnectionString(strBazaXLSFileFullName), _   Funkcja XLSConnectionString
                         strSQL  
End Sub  
 
 
I przykładu strSQL:  
 
 - Aktualizowanie danych. Zmiana dokonywana w kolumnie pod pewnym warunkiem  
 
    strSQL = "UPDATE " & strRngAddress & " " & _   SQL UPDATE Statement
             "SET [Opis] ='Test' " & _  
             "WHERE [Wartość] > 300;"  
      
 
 - Wstawienie do istniejącej Tabeli/Zakresu kolejnego rekordu.  
      
    strSQL = "INSERT INTO " & strRngAddress & " " & _   SQL INSERT INTO Statement
             "VALUES ('FS000026/2011', " & _   International Dates in Access
                      Format(Date, "\#mm\/dd\/yyyy\#") & " ," & _  
                      "'Kontrahent 15'," & _  
                      "'Opis 6', " & _  
                      "100.01);" _  
 
Procedura nie nadaje się jednak na wstawianie do naszej bazy wielu rekordów. Czemu?    BeginTrans, CommitTrans, and RollbackTrans Methods (ADO)
 - 1. Ze względu na wydajność procedury. Tworzenie połączenia tyle razy ile rekordów chcemy wysłać będzie dość długotrwałe.  
 - 2. Wysyłanie do bazy wielu rekordów powinno się robić w ramach Transanakcji, żeby w razie błędu można było całość "odkręcić" :-)  
Zadanie takie trzeba by realizować poprzez INSERT INTO ale zapytanie trzeba parametryzować.. Przykład dla mySQL ->>>   zasilenie-danymi-z-xlsa (www.excelforum.pl)
 
 - Utwórzmy nowy Arkusz o nazwie NowySheet i kolumny o określonych nagłówkach  
 
    strSQL = "CREATE TABLE [NowySheet] ([Nazwa1] char(255), [Nazwa2] char(255));"   The CREATE TABLE Statement
       SQL Data Types
 - Możemy utworzyć nowy Arkusz i wstawić do niego dane z np.: podzapytania :-)  
 
    strSQL = "SELECT * " & _  
             "INTO [NowySheet] " & _   The SQL SELECT INTO Statement
             "FROM (SELECT [Kontrahent], SUM([Wartość]) " & _  
                   "FROM " & strRngAddress & " " & _  
                   "GROUP BY [Kontrahent] " & _  
                   "HAVING SUM([Wartość]) > 200);"  
      
 - Polecenie DROP TABLE powinno usunąć Tabelę - w XLS to jednak Arkusz a tego nie da siętak łatwo usunąć. Polecenie usuwa dane!  
 
    strSQL = "DROP TABLE [NowySheet];"   SQL DROP INDEX, DROP TABLE, and DROP DATABASE
 
 - Nie wszystkie jednak polecenia SQL których można uzywać w różnych bazach danych będądziałać dla plików Excela. Np.:  
 
    strSQL = "DELETE FROM " & strRngAddress & " " & _   SQL DELETE Statement
             "WHERE [Opis] = 'Opis1'"  
 
Skutkuje błędem nr: "-2147467259. Deleting data in a linked table is not supported by this ISAM"  
Nie znam sposobu na obejście tego kłopotu.