› Sviluppare funzionalita su Microsoft Office con VBA › [EXCEL] Problema estrazione dati da database .mdb tramite istruzione SQL
-
AutoreArticoli
-
Buongiorno,
ho creato un foglio di excel che devo aggiornare prelevando i dati da un database Acces .mdb
Ho scritto la stringa SQL per l'esecuzione della query come sempre ma mi da l'errore come da allegato.
Premetto che e' la prima volta che uso Vba su excel.
Grazie in anticipo per l'eventuale aiuto.
Allegati:
You must be logged in to view attached files.Difficile poterti aiutare così. Allegare un'immagine non serve. Anche perchè faccio gran fatica a leggere un carattere così piccolo 🙂
Comunque se c'è errore di sintassi ("operatore mancante"), vuol dire che la stringa SQL è stata scritta male... Vedo troppe parentesi in strSQL. Allega il file Excel e vediamo se si riesce senza base dati a darti una risposta corretta.
@vecchio frac
Grazie per la risposta,
ti giuro che ho riletto diverse volte l'struzione SQL senza trovare errori, poi ho fatto una query con Access e ho copiato il codice SQL, sostituendo soltanto i parametri di selezione con le variabili, ma niente da fare.
Ti allego il file di excel.
Allegati:
You must be logged in to view attached files.Nella stringa sql leggi da ORDIN2 ma la condizione è impostata su ordin. Inoltre ci sono troppe parentesi.
Secondo me devi correggere così:
strSQL = "SELECT * FROM ORDIN2 WHERE orsigpos='" & CellaC5 & "' AND orannpos=" & CellaD5 & " AND ornumpos=" & CellaE5Nel codice ci sono altre cose che andrebbero ottimizzate, ma prima dimmi se questa soluzione ti risolve il problema immediato.
Risolto.
il problema era nel riferimento a ordin invece che ordin2, visto che l'errore diceva operatore mancanre mi ero concentrato solo sulle parentesi sui ; cerchi le formiche e ti passano gli elefanti.......
Comunque ho lasciato la tua versione, molto piu' snella e leggibile.
Visto che ci sei se mi dici anche le altre ottimizzazioni.......
Grazie mille
Non riesco a scrivere qui la mia risposta (per un errore interno del server). Riprovo più tardi
Niente, questo benedetto messaggio non vuole saperne... provo a spezzarlo in più post.
Visto che ci sei se mi dici anche le altre ottimizzazioni
Mi permetto di riscrivere il tuo codice, sfrondando le cose che secondo me sono ridondanti.
Codice del pulsante riscritto:
Sub Pulsante1_Click() Dim StringaDiConnessione As String Dim OggettoConnessione As Object, OggettoRecordset As Object Dim strSQL As String Dim Numero As Integer Dim myCell As Range Const NomeDB As String = "\\MAIL\Utenti\Scambio\RiepilogativoTrasporti.mdb" StringaDiConnessione = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & NomeDB & ";'" Set OggettoConnessione = CreateObject("ADODB.Connection") OggettoConnessione.Open StringaDiConnessione Set OggettoRecordset = CreateObject("ADODB.Recordset") strSQL = "SELECT * FROM ORDIN2 WHERE orsigpos='%1' AND orannpos=%2 AND ornumpos=%3" strSQL = Replace(strSQL, "%1", Range("C5")) strSQL = Replace(strSQL, "%2", Range("C5")) strSQL = Replace(strSQL, "%3", Range("C5")) Set OggettoRecordset = OggettoConnessione.Execute(strSQL) Range("B7") = OggettoRecordset("orragdes") Range("B8") = OggettoRecordset("orinddes") Range("B9") = OggettoRecordset("orcapdes") & " " & OggettoRecordset("orlocdes") & " (" & OggettoRecordset("orprodes") & ")" Range("C14") = OggettoRecordset("ortotcol") Range("C15") = OggettoRecordset("ortotpel") Range("C16") = OggettoRecordset("ortotpel") Range("D11") = OggettoRecordset("orcompag") & "-" & OggettoRecordset("ornumawb") Range("D12") = OggettoRecordset("ornumhaw") OggettoRecordset.Close Set OggettoRecordset = Nothing OggettoConnessione.Close Set OggettoConnessione = Nothing End SubConsiderazioni finali:
Il codice andava bene, ma in linea generale tieni presente che non serve pre-selezionare una cella per attribuirvi un valore: puoi assegnare il valore direttamente alla cella (così non si sposta nemmeno il cursore, e l'esecuzione migliora in velocità).
Ho dichiarato tutte le variabili come locali, dentro la sub cui si riferiscono. Potresti tener fuori i riferimenti alla connessione e agli oggetti di connessione e recordset, ma solo se prevedi di utilizzarli in altri punti del programma (e allora li dichiarerei in modulo standard As Public).
Osserva come ho costruito strSQL in un modo più furbo, per non perdermi con le concatenazioni delle stringhe (quando riuscirò a scrivere quel benedetto articolo sui parametri?... speriamo presto)
Verifica che sia corretto (anche nel tuo file originale è così) assegnare a C15 e C16 il valore del campo "ortotpel" del database.
Perfetto.
Funziona tutto (nel pubblicare il post ci e' venuto qualche amp; di troppo).
Ancora grazie, per la dritta di come costriure la stringa SQL e per avermi insegnato che si puo' attribuire un valore direttamente ad una cella.
Se mai ci sara' occasione a buon rendere.
Ciao.
Errata corrige (c'è sempre da sistemare qualche refuso quando si fanno le cose in fretta):
strSQL = Replace(strSQL, "%1", Range("C5")) strSQL = Replace(strSQL, "%2", Range("C5")) strSQL = Replace(strSQL, "%3", Range("C5"))deve invece essere (come da originale):
strSQL = Replace(strSQL, "%1", Range("C5")) strSQL = Replace(strSQL, "%2", Range("D5")) strSQL = Replace(strSQL, "%3", Range("E5"))Comunque il concetto lo hai capito 🙂
nel pubblicare il post ci e' venuto qualche amp; di troppo
Vero. Ma ho avuto problemi col post, non so perchè. Se vuoi ti allego il file finale
Ma no, figurati, hai fatto anche troppo.
E' il rovescio della mefaglia del copia/incolla.
Grazie ancora.
-
AutoreArticoli
