Esportazione da access ad excel

Anonimo
2012-02-01T09:54:45+00:00

Ciao,

volevo avere un'indicazione sul codice che potrei utilizzare per esportare dei dati di una query di Access 2000-2002 in un foglio excel. Più precisamente in alcune righe di excel devo inserire un valore che è somma di alcune righe della query di Access ((per esempio in excel ho A = B+C+D, ma appare solo A),  mentre in Access ho B,C e D). Volevo sapere come poter esplicare questa necessità con il codice sql.

Grazie,

Andrea

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2012-02-04T09:20:28+00:00

Ciao Andrea

non esiste un comando diretto. Puoi però sfruttare un ciclo per spostarti fino al record che ti interessa.

Di eseguito un esempio banale:


Dim db As DAO.Database

Dim rst As DAO.Recordset

Dim i As Integer

Set db = CurrentDb

Set rst = db.OpenRecordset("TUATABELLA/QUERY")

With rst

    For i = 1 To 19  'ciclo spostandomi fino al record 20

        .MoveNext

    Next

End With

MsgBox rst.Fields(0)

rst.Close

db.Close

Set rst = Nothing

Set db = Nothing


David

La risposta è stata utile?

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2012-02-03T10:55:19+00:00

Non ho capito come mai non riesci a provare il codice: se è perché manca la tabella country ho riaggiornato il database su skydrive.

Non offenderti, ma Io veramente non capisco come possa funzionare quel codice. Perlomeno quello che è nel file access che metti a disposizione. Probabilmente fai un'estratto del tuo file reale ma dovresti fare in modo che comunque il codice sia funzionante. Prova a compilarlo: ci sono 2 sub con lo stesso nome (aggiorna) un paio di While senza Loop e tutto il codice che dovrebbe scrivere nel foglio excel è all'esterno di una routine.

Ieri sera non potevo provarlo semplicemente perchè dovevo prima riscriverne una parte.

Ad ogni modo, stamattina avevo un po' di tempo e l'ho sistemato in modo da rendelo operativo. Ho fatto queste modifiche per le righe 11 e 12 che, pare, funzionino. Provale anche tu.


riga = 5

  Do Until riga = 11

      For i = 7 To TabellaTRAN.Fields.Count

        DocEx.Worksheets(nometabella).Cells(riga, i - 1) = TabellaTRAN.Fields(i - 1)

      Next i

      riga = riga + 1

      TabellaTRAN.MoveNext

  Loop

'inizio modifica

riga = 11

Dim contaOccorrenze As Integer  '--> SOP+SOT+TWO+WIN+OSO

Dim vTotale() As Variant

ReDim vTotale(1 To TabellaTRAN.Fields.Count)

    For contaOccorrenze = 1 To 5    '-->SOP+SOT+TWO+WIN+OSO

        For i = 7 To TabellaTRAN.Fields.Count

            vTotale(i - 6) = vTotale(i - 6) + TabellaTRAN.Fields(i - 1)

        Next i

        TabellaTRAN.MoveNext

    Next contaOccorrenze

    For i = 7 To TabellaTRAN.Fields.Count

        DocEx.Worksheets(nometabella).Cells(riga, i - 1).Formula = vTotale(i - 6)

    Next i

riga = 12

Erase vTotale()

ReDim vTotale(1 To TabellaTRAN.Fields.Count)

    For contaOccorrenze = 1 To 10    '-->INW+MWR+MWN+PSB+BGA+BOL+BDI+OLB+NSP+CHA

        For i = 7 To TabellaTRAN.Fields.Count

            vTotale(i - 6) = vTotale(i - 6) + TabellaTRAN.Fields(i - 1)

        Next i

        TabellaTRAN.MoveNext

    Next contaOccorrenze

    For i = 7 To TabellaTRAN.Fields.Count

        DocEx.Worksheets(nometabella).Cells(riga, i - 1).Formula = vTotale(i - 6)

    Next i

'fine modifica

riga = 13

'... prosegue con il tuo codice


Nota aggiuntiva: normalmente la dichiarazione delle variabili andrebbe all'inzio del codice. Per brevità di esposizione le due dichiarazioni aggiunte

Dim contaOccorrenze As Integer  '--> SOP+SOT+TWO+WIN+OSO

Dim vTotale() As Variant

le ho inserite nella mia modifica. Sarebbe opportuno spostarle all'inzio della routine.

David

La risposta è stata utile?

0 commenti Nessun commento

71 risposte aggiuntive

Ordina per: Più recente
  1. Anonimo
    2013-05-02T14:17:05+00:00

    Ciao David,

    la riga di comando

    If Len(tabellaCAP.Fields(i - 1) & "") = 0 Then Exit For

    è stata inserita per effettuare ciò che dici tu negli ultimi anni di aggiornamento perché non tutti i Paesi hanno tutti i dati e si vogliono mantenere in questo caso gli nd presenti negli anni successivi perché ad essi sono collegate le formule presenti in altre celle. 

    Il problema è che prendendo spunto da codici già fatti (in alcuni anni il primo anno è il 1970 e non il 1960) ho mantenuto

    For i = 47 ....

    invece che inserire

    For i = 57 ....

    che mi permette di copiare dal 2009 in avanti e quindi gli ultimi anni (2010, 2011) e non dal 1999. Attuando questa modifica, i valori delle due celle vengono inseriti. Probabilmente la casualità mi permetteva di copiare i dati per tutti i Paesi tranne che per Italia per la quale c'era il problema da te espostomi.

    Grazie ancora per l'aiuto!

    Ciao,

    Andrea

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2013-05-02T13:31:20+00:00

    Ciao Andrea,

    il problema nasce dall'istruzione

    If Len(tabellaCAP.Fields(i - 1) & "") = 0 Then Exit ForIn sostanza se il campo nel recordset non contiene un valore (è nullo o stringa vuota) esci dal ciclo For, conseguentemente non aggiorni gli altri anni.

    Se apri la query origine dati imponendo Italy come criterio country vedrai che a partire dal campo "SommaDi2000" del record 25 (che corrisponde alla riga 42 di Excel) il campo è vuoto.

    Ora, ci sarebbero diverse soluzioni, una delle quali consiste nell'eliminazione della riga che sopra ti ho evidenziato, oppure nella modifica della query in modo che tenga conto di questa evenienza.

    Tuttavia mi urge una domanda: che motivo hai di scrivere 2 volte nelle stesse celle, la prima volta con il ciclo


        riga = 18

        Do Until riga = 44

            For i = 8 To tabellaCAP.Fields.Count - 41

                DocEx.Worksheets(nometabella).Cells(riga, i - 1) = tabellaCAP.Fields(i - 1)

            Next i

            riga = riga + 1

            tabellaCAP.MoveNext

        Loop


    che come visto si ferma al 2009, e la seconda volta con il ciclo


        riga = 18

        Do Until riga = 44

            For i = 47 To tabellaCAP.Fields.Count

                'If Len(tabellaCAP.Fields(i - 1) & "") = 0 Then Exit For

                DocEx.Worksheets(nometabella).Cells(riga, i - 1) = tabellaCAP.Fields(i - 1)

            Next i

            riga = riga + 1

            tabellaCAP.MoveNext

        Loop


    che scrive le celle a partire dall'anno 1999?

    Non puoi raggruppare tutto in un'unico ciclo


        riga = 18

        Do Until riga = 44

            For i = 8 To tabellaCAP.Fields.Count - 41

                DocEx.Worksheets(nometabella).Cells(riga, i - 1) = tabellaCAP.Fields(i - 1)

            Next i

            riga = riga + 1

            tabellaCAP.MoveNext

        Loop

    ---   

    ???

    David

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2013-05-02T12:33:03+00:00

    Ciao David,

    ho scritto un'imprecisione per quanto riguarda gli anni, in quanto nel caso che ho esposto (query ELE_capacity da cui prendo i dati da copiare) i dati li ho SOLO fino al 2010 (era in altri casi che avevo anche il 2011).

    Per quanto riguarda la tua indicazione, nel prosieguo del codice c'è anche questa parte:


    tabellaCAP.MoveFirst

     riga = 18

      Do Until riga = 44

          For i = 47 To tabellaCAP.Fields.Count

          If Len(tabellaCAP.Fields(i - 1) & "") = 0 Then Exit For

            DocEx.Worksheets(nometabella).Cells(riga, i - 1) = tabellaCAP.Fields(i - 1)

          Next i

          riga = riga + 1

          tabellaCAP.MoveNext

      Loop


    Con questa copio anche gli anni successivi al 2009.

    Per tutti i Paesi non mi crea problemi, mentre per Italy non mi copia i valori nelle celle (BE42 e BE43) mentre i restanti di quella colonna sì.

    Questo fatto di non copiare alcune celle di Italy avviene anche per altre celle/fogli (anni 2010 e 2011 quando ho i dati), che comunque utilizzano una struttura "identica" di codice come quello presente nella maschera nel db.

    Grazie,

    Andrea

    La risposta è stata utile?

    0 commenti Nessun commento