2014-12-09 35 views
26

Jestem całkiem nowy w SQL i VBA. Napisałem zapytanie SQL, które chciałbym wywołać i uruchomić z subskrypcji VBA w skoroszycie programu Excel, a następnie przenieść wyniki zapytania do skoroszytu. Znalazłem niektóre subs online (stackoverflow i inne miejsca), które twierdzą, że to robią, ale mam problem ze zrozumieniem ich, ponieważ nie zawierają żadnego wyjaśnienia. Na przykład tutaj znajduje się sub, który znalazłem online:Używanie programu Excel VBA do uruchamiania kwerend SQL

Sub ConnectSqlServer() 

    Dim conn As ADODB.Connection 
    Dim rs As ADODB.Recordset 
    Dim sConnString As String 

    ' Create the connection string. 
    sConnString = "Provider=SQLOLEDB;Data Source=INSTANCE\SQLEXPRESS;" & _ 
        "Initial Catalog=MyDatabaseName;" & _ 
        "Integrated Security=SSPI;" 

    ' Create the Connection and Recordset objects. 
    Set conn = New ADODB.Connection 
    Set rs = New ADODB.Recordset 

    ' Open the connection and execute. 
    conn.Open sConnString 
    Set rs = conn.Execute("SELECT * FROM Table1;") 

    ' Check we have data. 
    If Not rs.EOF Then 
     ' Transfer result. 
     Sheets(1).Range("A1").CopyFromRecordset rs 
    ' Close the recordset 
     rs.Close 
    Else 
     MsgBox "Error: No records returned.", vbCritical 
    End If 

    ' Clean up 
    If CBool(conn.State And adStateOpen) Then conn.Close 
    Set conn = Nothing 
    Set rs = Nothing 

End Sub 

Po pierwsze, czy to działa? Po drugie, co muszę zastąpić w podsieci (wygląda na dostawcę, źródło danych, początkowy katalog itp.) I gdzie mogę znaleźć informacje, aby je zastąpić?

Mam nadzieję, że to pytanie nie będzie zbyt skomplikowane i doceniam Twoją pomoc!

+1

Kod zawiera komentarze nad każdą "sekcją". Czego dokładnie nie rozumiesz? Zasadniczo kod; tworzy połączenie z bazą danych, wykonuje zapytanie względem połączenia, ładuje wyniki do ResultSet, kopiuje ResultSet do tabeli zaczynającej się od zakresu "A1" ... –

+0

Jeśli twoja baza danych ma nazwę użytkownika/hasło, to twoje potrzeby sConnString mieć "Hasło = ###; ID użytkownika = ###". Podobnie, sConnString powinien mieć "Data Source = IP_ADDRESS_OF_SERVER" i jeśli używasz tego samego komputera dla bazy danych i VBA, możesz użyć 127.0.0.1 dla IP_ADDRESS_OF_SERVER. – Michael

+0

Jakiego typu bazy danych SQL używasz? MS SQL? MySQL? SQLite? Pozwoli to ustalić, czy kod VBA będzie działał. – Michael

Odpowiedz

31

Poniżej znajduje się kod, którego obecnie używam do pobierania danych z MS SQL Server 2008 do VBA. Musisz upewnić się, że masz odpowiednie odniesienie ADODB [Edytor VBA-> Narzędzia-> Referencje] i upewnij się, że masz Microsoft ActiveX Data Objects 2.8 Biblioteka, która jest druga z dolnego wiersza, który jest sprawdzany (Używam programu Excel 2010 na Windows 7, może mieć nieco inną wersję ActiveX, ale nadal będzie ona rozpocząć Microsoft ActiveX):

References required for SQL

Sub moduł do Łączenie z MS SQL Remote Host & Nazwa użytkownika/hasło

Sub Download_Standard_BOM() 
'Initializes variables 
Dim cnn As New ADODB.Connection 
Dim rst As New ADODB.Recordset 
Dim ConnectionString As String 
Dim StrQuery As String 

'Setup the connection string for accessing MS SQL database 
    'Make sure to change: 
     '1: PASSWORD 
     '2: USERNAME 
     '3: REMOTE_IP_ADDRESS 
     '4: DATABASE 
    ConnectionString = "Provider=SQLOLEDB.1;Password=PASSWORD;Persist Security Info=True;User ID=USERNAME;Data Source=REMOTE_IP_ADDRESS;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False;Initial Catalog=DATABASE" 

    'Opens connection to the database 
    cnn.Open ConnectionString 
    'Timeout error in seconds for executing the entire query; this will run for 15 minutes before VBA timesout, but your database might timeout before this value 
    cnn.CommandTimeout = 900 

    'This is your actual MS SQL query that you need to run; you should check this query first using a more robust SQL editor (such as HeidiSQL) to ensure your query is valid 
    StrQuery = "SELECT TOP 10 * FROM tbl_table" 

    'Performs the actual query 
    rst.Open StrQuery, cnn 
    'Dumps all the results from the StrQuery into cell A2 of the first sheet in the active workbook 
    Sheets(1).Range("A2").CopyFromRecordset rst 
End Sub 
+2

Wielkie dzięki za odpowiedź, ponieważ ostatnio szukałem takiej implementacji. Jednak dla ciekawości, możesz powiedzieć nam więcej o przydatności 'Persist Security Info = True',' Użyj procedury dla Przygotuj = 1', 'Auto Translate = True',' Rozmiar pakietu = 4096', 'Użyj szyfrowania dla danych = Fałsz', 'Tag z kolumną, gdy jest to możliwe = Fałsz' w ciągu połączenia? Właściwie zapytanie działa bez tych dodatkowych informacji.Best, – owner

+0

W 'Persist Security Info = True', zobacz http://stackoverflow.com/questions/30419627/persist-security-info-property-true-and-persist-security-info-property-false –

+0

solidny przykład dobry wyjaśnienie. w Sam, powód, dla którego dodajesz dodatkowe kryteria, to mieć dodatkową kontrolę nad domyślnymi urządzeniami, na wypadek gdyby niektóre systemy musiały mieć zmienione ustawienia. EDYCJA: podstawowe rzeczy, których potrzebujesz w łańcuchu połączenia to hasło, nazwa użytkownika, nazwa i db adres IP –

Powiązane problemy