Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

QUERY via VBA in excel

1,884 views
Skip to first unread message

mani...@interfree.it

unread,
Apr 11, 2015, 5:57:40 AM4/11/15
to
Buongiorno.

Ho un unico file excel, composto da due fogli : "Foglio1" e "Foglio2".
In Foglio1 abbiamo una tabella chiamata "Tabella 1".

Avrei bisogno di operare delle Query su "Tabella 1" mettendo i risultati in "Foglio 2", con il classico SELECT..FROM..WHERE esclusivamente via codice VBA.

Ho cercato su internet ma partono tutti da record di Access e visualizzano in Excel, mentre io vorrei, all'interno dello STESSO FILE EXCEL, fare delle query su tabelle sempre nello stesso file excel.

Dei link a qualche pagina mi sarebbero piu' che sufficienti.

Grazie

Maurizio Borrelli

unread,
Apr 11, 2015, 6:22:43 AM4/11/15
to
Ciao mani...,
vedi se in questo recente thread c'e' qualcosa che possa esserti utile.

Microsoft Community - Office
Scrivere una query in SQL per una tabella di Excel
http://answers.microsoft.com/it-it/office/forum/office_365hp-excel/scrivere-una-query-in-sql-per-una-tabella-di-excel/cbf26d89-bbab-41bf-bc75-59858c5d54e3

--
Ciao! :)
Maurizio

Maurizio Borrelli

unread,
Apr 11, 2015, 6:35:46 AM4/11/15
to
Il giorno sabato 11 aprile 2015 12:22:43 UTC+2, Maurizio Borrelli ha scritto:
> Il giorno sabato 11 aprile 2015 11:57:40 UTC+2, mani...@interfree.it ha scritto:
[...]
> vedi se in questo recente thread c'e' qualcosa che possa esserti utile.
> Microsoft Community - Office
> Scrivere una query in SQL per una tabella di Excel
> http://answers.microsoft.com/it-it/office/forum/office_365hp-excel/scrivere-una-query-in-sql-per-una-tabella-di-excel/cbf26d89-bbab-41bf-bc75-59858c5d54e3

Ciao mani...,

Un esempio anche qui:
http://answers.microsoft.com/it-it/office/forum/office_2003-excel/cerca-valori-piu-di-un-codizione/2d16235f-7e07-4741-b008-feb002eafd7b?page=1

--
Ciao! :)
Maurizio

archimede

unread,
Apr 12, 2015, 9:58:18 AM4/12/15
to
Ciao ,
usare SQL con excel è veramente eccezzionale, io lo uso spesso, perchè è comodo per interrogare i tuoi database e senza tanti passaggi che ti costringono ad usare matrici, collection o filtrare dati in piu passaggi, invece con sql hai tutto a portata di mano con delle semplici query. Anche collegandoti con altri files excel,access o database vari è molto semplice e veloce ed hai subito i dati che vuoi.
Ti mando questo codice tutto funzionante, studiatelo bene e vedrai che riuscirai ad usare da subito sql con excel,se poi conosci bene come lavorano i recordset fai tutto quello che vuoi in tempi sicuramente piu veloci che con altre procedure.

Option Explicit

Sub FareQueryInnerExcel()

'ATTIVA LIBRERIA
'MICROSOFT OFFICE14 ACCESS DATABASE ENGINE OBJECT
'O LA MICROSOFT DAO 3.6

Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim UR As Integer

Set dbs = OpenDatabase("C:\Users\....\Desktop\...GRAFICO.xlsm", _
False, False, "Excel 8.0;HDR=SI;")

UR = 50

'metti sempre ; alla fine della stringa SQL ,una volta non mettendola
'non mi dava i dati corretti

'ESEMPI CON RANGE TUTTI FUNZIONANTI
'Set rst = dbs.OpenRecordset("SELECT CATEGORIA FROM [SPECCHIO$C7:E104];") 'OK
'Set rst = dbs.OpenRecordset("SELECT * FROM [SPECCHIO$C7:E" & UR & "];") 'OK
'Set rst = dbs.OpenRecordset("SELECT A,B,C, COUNT(*) AS NR FROM [SPECCHIO$C7:E104] GROUP BY A,B,C;") 'OK
Set rst = dbs.OpenRecordset("SELECT CATEGORIA,TIPO,COUNT(*) AS NR FROM [SPECCHIO$C7:F104] GROUP BY .....;") 'OK

'ESEMPI CON NAMEs
'Set rst = dbs.OpenRecordset("SELECT * FROM ZONA;") 'OK
'Set rst = dbs.OpenRecordset("SELECT CATEGORIA FROM ZONA;") 'OK

'Set rst = dbs.OpenRecordset("SELECT DISTINCT SITUAZIONE.TIPO,count(targa) AS nr
'FROM SITUAZIONE GROUP BY tipo;") 'OK
'Set rst = dbs.OpenRecordset("SELECT * FROM[SPECCHIO$C8:E104];") 'OK

'Debug.Print rst.Fields.Count
'Debug.Print rst.Fields(0).Name

With rst
.MoveLast
'MsgBox "Questo foglio di lavoro contiene " & .RecordCount & " record."
.MoveFirst
End With

'Sheets("PROVA").Select
Sheets("PROVA").Range("A1:E200").ClearContents
Sheets("PROVA").Range("A1").CopyFromRecordset rst

Sheets("PROVA").Activate

rst.Close: Set rst = Nothing
dbs.Close: Set dbs = Nothing

End Sub





Bruno Campanini

unread,
Apr 17, 2015, 11:08:39 PM4/17/15
to
archimede brought next idea :
> Ciao ,
> usare SQL con excel è veramente eccezzionale, io lo uso spesso, perchè è
> comodo per interrogare i tuoi database e senza tanti passaggi che ti
> costringono ad usare matrici, collection o filtrare dati in piu passaggi,
> invece con sql hai tutto a portata di mano con delle semplici query. Anche
> collegandoti con altri files excel,access o database vari è molto semplice e
> veloce ed hai subito i dati che vuoi. Ti mando questo codice tutto
> funzionante, studiatelo bene e vedrai che riuscirai ad usare da subito sql
> con excel,se poi conosci bene come lavorano i recordset fai tutto quello che
> vuoi in tempi sicuramente piu veloci che con altre procedure.
[...]

Conosci anche la sintassi della clausola WHERE?
del tipo:
"SELECT CATEGORIA FROM [SPECCHIO$C7:E104] _
WHERE [SPECCHIO$D7:D104]='a22'"

ché così come l'ho scritta non funziona.

Bruno

archimede

unread,
Apr 18, 2015, 8:37:32 PM4/18/15
to
Ciao,

...WHERE NOME_CAMPO_COLONNA_D='a22'"

devi scrivere le query come se lo facessi in access con l'unica differenza che la tabella la scrivi in questa forma [SPECCHIO$C7:E104] $incluso e poi tutto il resto è uguale, Group by, Order by....inoltre rispetta sempre le " "

puoi anche fare le subquery:
" WHERE NOME = (SELECT NOME FROM [ARCHIVIO$A1:M" & AA & "] WHERE NOME='Bruno');"

Bruno Campanini

unread,
Apr 19, 2015, 5:50:41 AM4/19/15
to
on 19-04-15, archimede supposed :
La mia tabella è [Sheet1$A5:F17] e non ha Header;
la condizione è che la colonna "C" contenga la stringa "a22"

Se scrivo:
"SELECT * FROM [Sheet1$A5:F17];"
ottengo tutta la tabella.

Vorrei che funzionasse:
"SELECT * FROM [Sheet1$A5:F17] WHERE [Sheet1$C5:F17]='a22';"

ma non funziona:
Runtime error 3061.
Too few parameters. Expected 1.

Il " ...WHERE NOME_CAMPO_COLONNA_D='a22'"
che mi hai scritto non m'aiuta.

Vorresti essere più preciso?
Grazie

Bruno

Maurizio Borrelli

unread,
Apr 19, 2015, 2:58:12 PM4/19/15
to
Il giorno domenica 19 aprile 2015 11:50:41 UTC+2, Bruno Campanini ha scritto:
> on 19-04-15, archimede supposed :
> > ...WHERE NOME_CAMPO_COLONNA_D='a22'"
> > devi scrivere le query come se lo facessi in access con l'unica differenza
> > che la tabella la scrivi in questa forma [SPECCHIO$C7:E104] $incluso e poi
> > tutto il resto è uguale, Group by, Order by....inoltre rispetta sempre le " "
> > puoi anche fare le subquery:
> > " WHERE NOME = (SELECT NOME FROM [ARCHIVIO$A1:M" & AA & "] WHERE
> > NOME='Bruno');"
> La mia tabella è [Sheet1$A5:F17] e non ha Header;
> la condizione è che la colonna "C" contenga la stringa "a22"
> Se scrivo:
> "SELECT * FROM [Sheet1$A5:F17];"
> ottengo tutta la tabella.
> Vorrei che funzionasse:
> "SELECT * FROM [Sheet1$A5:F17] WHERE [Sheet1$C5:F17]='a22';"
> ma non funziona:
> Runtime error 3061.
> Too few parameters. Expected 1.

Ciao Bruno,
in una tabella senza intestazioni i campi si chiamano "F1", "F2", ...
Puoi verificarlo così:

Public Sub Test()
Const cstrDbsName As String = "D:\Percorso\Cartel1.xlsx"
Const cstrSql As String = "SELECT * FROM `Foglio1$C5:F17`;"

Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim fld As DAO.Field

Set dbs = DBEngine.OpenDatabase(cstrDbsName, _
False, _
True, _
"Excel 8.0;HDR=No;")
Set rst = dbs.OpenRecordset(cstrSql)
For Each fld In rst.Fields
Debug.Print fld.Name
Next

On Error Resume Next
rst.Close
dbs.Close
Set fld = Nothing
Set rst = Nothing
Set dbs = Nothing
End Sub

Quindi la stringa SQL nel tuo caso potrebbe essere:

SELECT * FROM `Foglio1$C5:F17` WHERE `F1`='a22';

-oppure-

SELECT * FROM `Foglio1$C5:F17` WHERE UCASE(`F1`)='A22';

se il caso.

--
Ciao! :)
Maurizio

Bruno Campanini

unread,
Apr 19, 2015, 7:13:39 PM4/19/15
to
Maurizio Borrelli expressed precisely :

[...]
> Quindi la stringa SQL nel tuo caso potrebbe essere:
>
> SELECT * FROM `Foglio1$C5:F17` WHERE `F1`='a22';
>
> -oppure-
>
> SELECT * FROM `Foglio1$C5:F17` WHERE UCASE(`F1`)='A22';
>
> se il caso.

Sì, alla fine, prova e riprova, c'ero arrivato anch'io...

SQL = "SELECT * FROM [Sheet1$H5:M17] WHERE F3='a22';"

Si possono anche sostituire/omettere i delimitatori ALT+096.

Ciao
Bruno
0 new messages