Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HUAWEI MatePad Air recensione: OLED opaco e tastiera dedicata per lavorare meglio
HUAWEI MatePad Air recensione: OLED opaco e tastiera dedicata per lavorare meglio
HUAWEI MatePad Air combina diverse carte molto interessanti: un OLED PaperMatte da 12 pollici, un corpo sottile e una tastiera molto comoda. Durante la prova abbiamo apprezzato fluidità, audio e comfort visivo, mentre i test hanno chiarito pregi e qualche limite nelle prestazioni. L'autonomia ha convinto anche nell'uso intermittente; la scelta passa dalla compatibilità delle proprie app e dal valore del pacchetto con accessori, proposto a 749 euro
NVIDIA RTX Spark: il PC Windows on ARM costruito per l'IA agentica
NVIDIA RTX Spark: il PC Windows on ARM costruito per l'IA agentica
Debuttano ufficialmente i primi sistemi notebook basati su piattaforma NVIDIA RTX Spark, abbinati a Windows on ARM e pensati per l'intelligenza artificiale agentica. Architettura integrata tra CPU e GPU che condividono la memoria di sistema, capace di gestire in locale modelli molto grandi ma al contempo anche di spiccare con la grafica e l'elaborazione
Motorola razr fold, dalla conchiglia al formato a libro. La recensione
Motorola razr fold, dalla conchiglia al formato a libro. La recensione
Abbiamo provato Motorola razr fold, il pieghevole a libro con display interno LTPO da 8,09 pollici, Snapdragon 8 Gen 5 e batteria da 6000 mAh in 243 grammi. Pennino e custodia sopno già nella confezione, per un foldable che si caratterizza per il pannello luminoso, l'autonomia ottima per la categoria e le fotocamere coerenti e ben sfruttabili. Il listino è di 1999 euro, ma in vendita si trova già a molto meno
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 07-01-2009, 12:49   #1
ciopin83
Member
 
L'Avatar di ciopin83
 
Iscritto dal: Nov 2003
Città: Torino
Messaggi: 122
[VBA+SQL] Macro in Excel con estrazione SQL

Ciao a tutti. Avrei bisogno di un aiutino con questa macro, che ho trovato su internet e ho personalizzato (anche perché sono un novizio di VBA). Dovrei fare un'estrazione da un foglio di Excel, prendendo tutte le voci non duplicate di una colonna; questa è la macro che ho al momento, ma mi dà errore alla riga "objRs.Open sql, objConn, 3, 3, 1"; appena creata, avevo provato a far girare la macro in un foglio nuovo e funzionava, tranne se cambiavo la riga fldDate = "Data" modificando il numero di caratteri tra virgolette (es. se anziché Data scrivevo anche solo Datas, mi dava errore e si bloccava nello stesso punto). Ecco l'errore che mi restituisce:

Errore di run-time '-2147217900 (80040e14)':
L'istruzione SELECT include una parola riservata o un argomento scritto in modo errato o mancante oppure la punteggiatura non è corretta


Sub raggruppa()
Dim objConn
Dim objRs
Dim shToGroup As String
Dim shDestination As String
Dim fldDate As String
Dim wrk As Workbook
Dim cont As Long
Set wrk = ThisWorkbook
shToGroup = "Foglio1"
shDestination = "Foglio2" 'Foglio di destinazione
fldDate = "Data"
Dim sql As String
sql = "SELECT distinct [" & fldDate & "] As DATE, count(*) As CONTATORE FROM [" & shToGroup & "$] group by DATE order by DATE"
Set objConn = CreateObject("ADODB.Connection")
objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & wrk.FullName & ";Extended Properties=Excel 8.0;"
Set objRs = CreateObject("ADODB.Recordset")
objRs.Open sql, objConn, 3, 3, 1
cont = 0
Do Until objRs.EOF
cont = cont + 1
Sheets(shDestination).Cells(cont, 1) = objRs.Fields("DATE").Value
Sheets(shDestination).Cells(cont, 2) = objRs.Fields("CONTATORE").Value
objRs.MoveNext
Loop
MsgBox "Raggruppamento eseguito nel foglio '" & shDestination & "' !"
End Sub
ciopin83 è offline   Rispondi citando il messaggio o parte di esso
Old 07-01-2009, 13:32   #2
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da ciopin83 Guarda i messaggi
...
Dim wrk As Workbook
Dim cont As Long
Set wrk = ThisWorkbook
...
Prima di capire cosa vada storto, c'è una ragione particolare nell'usare ADO per leggere dati dallo stesso Workbook ?
ADO lo si usa soprattutto per leggere da Books esterni senza doverli aprire ( e non è l'unico metodo, tra l'altro... ).
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 07-01-2009, 13:55   #3
ciopin83
Member
 
L'Avatar di ciopin83
 
Iscritto dal: Nov 2003
Città: Torino
Messaggi: 122
Quote:
Originariamente inviato da MarcoGG Guarda i messaggi
Prima di capire cosa vada storto, c'è una ragione particolare nell'usare ADO per leggere dati dallo stesso Workbook ?
ADO lo si usa soprattutto per leggere da Books esterni senza doverli aprire ( e non è l'unico metodo, tra l'altro... ).
Sto muovendo i primi passi in VBA e, quando mi è stato chiesto se era possibile creare una macro che estraesse dati non duplicati, mi è venuto in mente il select distinct in sql; ho trovato una macro in vba che faceva una cosa simile e l'ho leggermente personalizzata... quindi, no, non c'è una ragione particolare o meglio la ragione è che non avrei saputo cos'altro fare, ma se ci sono alternative più semplici, ben vengano!
ciopin83 è offline   Rispondi citando il messaggio o parte di esso
Old 07-01-2009, 15:01   #4
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da ciopin83 Guarda i messaggi
Sto muovendo i primi passi in VBA e, quando mi è stato chiesto se era possibile creare una macro che estraesse dati non duplicati, mi è venuto in mente il select distinct in sql; ho trovato una macro in vba che faceva una cosa simile e l'ho leggermente personalizzata... quindi, no, non c'è una ragione particolare o meglio la ragione è che non avrei saputo cos'altro fare, ma se ci sono alternative più semplici, ben vengano!
Metodi ce ne sono a bizzeffe, comincio col consigliarti questo, che secondo me è abbastanza compatto e sicuramente flessibile in quanto carica in un array ( che poi si può leggere e usare come si vuole ) tutti i valori presenti in un dato Range di celle ( nel mio esempio, la colonna A, da 1 a 10 ), e senza duplicati :

Codice:
    Dim arrayValori() As Variant
    Dim AllCells As Range
    Dim Cell As Range
    Dim NoDupes As New Collection
    Dim i As Long
    i = 0
    Dim Item As Variant
    Set AllCells = Sheets("Foglio1").Range("A1:A10")
    On Error Resume Next
    For Each Cell In AllCells
        NoDupes.Add Cell.Value, CStr(Cell.Value)
    Next Cell
    On Error GoTo 0
    Dim cnt As Long
    cnt = 0
    For Each Item In NoDupes
        ReDim Preserve arrayValori(cnt)
        arrayValori(cnt) = Item
        cnt = cnt + 1
    Next Item
   
    For i = 0 To UBound(arrayValori)
        MsgBox arrayValori(i)
    Next i
Prova...
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 07-01-2009, 17:54   #5
ciopin83
Member
 
L'Avatar di ciopin83
 
Iscritto dal: Nov 2003
Città: Torino
Messaggi: 122
Ottimo! Funge. Grazie mille. Nei prossimi giorni vedo di fare qualche piccola modifica e ti faccio sapere se ci sono riuscito; il "grosso" sarà fare un ciclo for che partendo dalla prima riga dei dati, vada avanti fino alla prima cella vuota della colonna
ciopin83 è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2009, 09:18   #6
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da ciopin83 Guarda i messaggi
Ottimo! Funge. Grazie mille. Nei prossimi giorni vedo di fare qualche piccola modifica e ti faccio sapere se ci sono riuscito; il "grosso" sarà fare un ciclo for che partendo dalla prima riga dei dati, vada avanti fino alla prima cella vuota della colonna
Eh eh, il "grosso" ?
No, il "grosso" sono 2 righe di codice. E così per la colonna A senza dover sapere dove finisce il Range :

Codice:
    Dim indiceUltima As Long
    indiceUltima = Range("A65536").End(xlUp).Row

    Dim arrayValori() As Variant
    Dim AllCells As Range
    Dim Cell As Range
    Dim NoDupes As New Collection
    Dim i As Long
    i = 0
    Dim Item As Variant
    Set AllCells = Sheets("Foglio1").Range("A1:A" & indiceUltima)
    On Error Resume Next
    For Each Cell In AllCells
        NoDupes.Add Cell.Value, CStr(Cell.Value)
    Next Cell
    On Error GoTo 0
    Dim cnt As Long
    cnt = 0
    For Each Item In NoDupes
        ReDim Preserve arrayValori(cnt)
        arrayValori(cnt) = Item
        cnt = cnt + 1
    Next Item

    For i = 0 To UBound(arrayValori)
        MsgBox arrayValori(i)
    Next i
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2009, 10:11   #7
ciopin83
Member
 
L'Avatar di ciopin83
 
Iscritto dal: Nov 2003
Città: Torino
Messaggi: 122
Dicevo "grosso" per dire... beh, più o meno; mi sto impigrendo con queste vacanze
Io pensavo a un ciclo do until con condizione cell<>""; sono circa 800 righe. Secondo te può andare bene come soluzione? Escluderei l'InputBox, che ho usato in un'altra situazione.
ciopin83 è offline   Rispondi citando il messaggio o parte di esso
Old 08-01-2009, 10:37   #8
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da ciopin83 Guarda i messaggi
Io pensavo a un ciclo do until con condizione cell<>""; sono circa 800 righe. Secondo te può andare bene come soluzione? Escluderei l'InputBox, che ho usato in un'altra situazione.

No, ma usa appunto le due righe che ho suggerito :

Codice:
    Dim indiceUltima As Long
    indiceUltima = Range("A65536").End(xlUp).Row
indiceUltima ti ritorna proprio l'indice di riga dell'ultima cella non-vuota.

Se invece usi Excel 2007, non hai più il limite di 65536 righe, ma potresti avere un indiceUltima = Range("A1000000").End(xlUp).Row !
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 09-01-2009, 17:56   #9
ciopin83
Member
 
L'Avatar di ciopin83
 
Iscritto dal: Nov 2003
Città: Torino
Messaggi: 122
Quote:
Originariamente inviato da MarcoGG Guarda i messaggi

No, ma usa appunto le due righe che ho suggerito :

Codice:
    Dim indiceUltima As Long
    indiceUltima = Range("A65536").End(xlUp).Row
indiceUltima ti ritorna proprio l'indice di riga dell'ultima cella non-vuota.

Se invece usi Excel 2007, non hai più il limite di 65536 righe, ma potresti avere un indiceUltima = Range("A1000000").End(xlUp).Row !
A1000000! Peccato che non usi ancora il 2007, altrimenti già mi immaginavo il capo a bestemmiare per il pc impallato!
ciopin83 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


HUAWEI MatePad Air recensione: OLED opaco e tastiera dedicata per lavorare meglio HUAWEI MatePad Air recensione: OLED opaco e tast...
NVIDIA RTX Spark: il PC Windows on ARM costruito per l'IA agentica NVIDIA RTX Spark: il PC Windows on ARM costruito...
Motorola razr fold, dalla conchiglia al formato a libro. La recensione Motorola razr fold, dalla conchiglia al formato ...
Recensione Google Pixel Watch 5: sembra lo stesso, ma al polso la differenza si sente Recensione Google Pixel Watch 5: sembra lo stess...
Nokia Innovation Day 2026: la sovranità europea passa dal mercato unico e dai laboratori italiani del gruppo Nokia Innovation Day 2026: la sovranità e...
Blue Origin continua l'espansione: nuove...
Intel prepara un SoC da 700 TOPS: Razor ...
I nuovi Xreal 1 Pro+ arrivano in Europa ...
La GeForce RTX 5090 non è morta: ...
HONOR Win2 si mostra online: potenza da ...
Clamoroso dietrofront di Sony: cancellat...
GeForce NOW, tante novità con l'u...
Il mercato smartphone rallenta nel Q3 20...
Addio al Valve Index: fine della produzi...
Seggiolini auto i-Size da 0 a 12 anni in...
Amazon determina i prezzi di tutto il we...
Robot aspirapolvere ECOVACS in offerta s...
Bodywel F20PRO o DEEPOWER A5? Due fat bi...
Gli agenti AI non diventano pazzi, sono ...
Kenwood Chef XL 6,7L a 239€ su Amazon: u...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 19:59.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v