2014-12-09 17 views
26

Sono abbastanza nuovo per SQL e VBA. Ho scritto una query SQL che mi piacerebbe essere in grado di chiamare ed eseguire da un sub VBA in una cartella di lavoro Excel e quindi portare i risultati della query nella cartella di lavoro. Ho trovato alcuni sottotitoli online (stackoverflow e altri luoghi) che pretendono di farlo, ma ho difficoltà a capirli perché non contengono spiegazioni. Ad esempio, ecco un sub che ho trovato online:Utilizzo di Excel VBA per eseguire query 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 

Prima di tutto, sarebbe questo lavoro? In secondo luogo, cosa devo sostituire nel sub (sembra provider, origine dati, catalogo iniziale, ecc.) E dove trovo le informazioni per sostituirli?

Spero che questa domanda non sia troppo confusa e apprezzo il vostro aiuto!

+1

Il codice contiene commenti sopra ogni 'sezione'. Che cosa esattamente non capisci? Essenzialmente il codice; crea una connessione al database, esegue la query sulla connessione, carica i risultati in ResultSet, copia il ResultSet in una tabella a partire da "A1" ... –

+0

Se il database ha un nome utente/password, il tuo sConnString ha bisogno avere "Password = ###; ID utente = ###". Inoltre, sConnString dovrebbe avere "Origine dati = IP_ADDRESS_OF_SERVER" e se stai utilizzando lo stesso computer per database e VBA, puoi utilizzare 127.0.0.1 per IP_ADDRESS_OF_SERVER. – Michael

+0

Che tipo di database SQL stai usando? MS SQL? MySQL? SQLite? Questo determinerà se il codice VBA funzionerà o meno. – Michael

risposta

31

Di seguito è riportato il codice che attualmente utilizzo per trasferire dati da MS SQL Server 2008 in VBA. Devi assicurarti di avere il riferimento ADODB corretto [Editor VBA-> Strumenti-> Riferimenti] e assicurati di avere selezionato Libreria Microsoft ActiveX Data Objects 2.8, che è il secondo dalla riga in basso che è selezionata (sto utilizzando Excel 2010 su Windows 7, si potrebbe avere una versione ActiveX leggermente diversa, ma sarà ancora iniziare con Microsoft ActiveX):

References required for SQL

modulo Sub per la connessione a MS SQL con host remoto & Nome utente/password

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

Grazie mille per la tua risposta, dato che di recente stavo cercando una simile implementazione. Tuttavia, per curiosità, potresti dirci di più sull'utilità di Persist Security Info = True, 'Use Procedure for Prepare = 1',' Auto Translate = True', 'Packet Size = 4096',' Use Encryption for Data = False', 'Tag con regole di confronto quando possibile = False' all'interno della stringa di connessione? In realtà la query funziona senza tali informazioni aggiuntive.Best, – owner

+0

In "Persist Security Info = True", consultare http://stackoverflow.com/questions/30419627/persist-security-info-property-true-and-persist-security-info-property-false –

+0

solido esempio buono spiegazione. a Sam il motivo per cui hai inserito i criteri extra è quello di avere un ulteriore controllo sulle fixture predefinite nel caso in cui alcuni sistemi necessitino di modifiche alle impostazioni EDIT: le cose di base di cui hai bisogno nella tua stringa di connessione sono password, nome utente, nome db e db indirizzo IP –