Sviluppare funzionalita su Microsoft Office con VBA [EXCEL] Problema estrazione dati da database .mdb tramite istruzione SQL

Login Registrati
Stai vedendo 13 articoli - dal 1 a 13 (di 13 totali)
  • Autore
    Articoli
  • #20168 Score: 0 | Risposta

    Aldo Ercolini
    Partecipante
      19 pts

      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.
      #20176 Score: 0 | Risposta

      vecchio frac
      Senior Moderator
        272 pts

        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.

         

        #20179 Score: 0 | Risposta

        Aldo Ercolini
        Partecipante
          19 pts

          @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.
          #20182 Score: 0 | Risposta

          vecchio frac
          Senior Moderator
            272 pts

            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=" & CellaE5

            Nel codice ci sono altre cose che andrebbero ottimizzate, ma prima dimmi se questa soluzione ti risolve il problema immediato.

             

             

            #20183 Score: 0 | Risposta

            Aldo Ercolini
            Partecipante
              19 pts

              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

               

              #20195 Score: 0 | Risposta

              vecchio frac
              Senior Moderator
                272 pts

                Non riesco a scrivere qui la mia risposta (per un errore interno del server). Riprovo più tardi

                #20197 Score: 0 | Risposta

                vecchio frac
                Senior Moderator
                  272 pts

                  Niente, questo benedetto messaggio non vuole saperne... provo a spezzarlo in più post.

                  Aldo Ercolini ha scritto:

                  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.

                  #20198 Score: 1 | Risposta

                  vecchio frac
                  Senior Moderator
                    272 pts

                    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 Sub
                    #20199 Score: 1 | Risposta

                    vecchio frac
                    Senior Moderator
                      272 pts

                      Considerazioni 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.

                      #20209 Score: 0 | Risposta

                      Aldo Ercolini
                      Partecipante
                        19 pts

                        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.

                        #20213 Score: 0 | Risposta

                        vecchio frac
                        Senior Moderator
                          272 pts

                          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 🙂

                          #20214 Score: 0 | Risposta

                          vecchio frac
                          Senior Moderator
                            272 pts

                            Aldo Ercolini ha scritto:

                            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

                            #20216 Score: 0 | Risposta

                            Aldo Ercolini
                            Partecipante
                              19 pts

                              Ma no, figurati, hai fatto anche troppo.

                              E' il rovescio della mefaglia del copia/incolla.

                              Grazie ancora.  

                            Login Registrati
                            Stai vedendo 13 articoli - dal 1 a 13 (di 13 totali)
                            Rispondi a: [EXCEL] Problema estrazione dati da database .mdb tramite istruzione SQL
                            Gli allegati sono permessi solo ad utenti REGISTRATI
                            Le tue informazioni: