Condividi tramite

Macro per riepilogare dati del Foglio1 in Foglio2 (excel2010)

Anonimo
2013-11-06T09:26:18+00:00

Ciao a tutti :)

Mi chiamo Luca Puglia e sono un n00bbo sia di questo forum che di sviluppo macro in excel.

Ho comunque cercato nei vari thread soluzioni utili, ma fino ad ora non ho raggiunto l'obiettivo, per cui riposto domanda, sperando non fare eccessiva ripetizione d'argomento (nel qual caso chiedo venia!!!! ._.')

Ho un foglio (Confronto) in cui effettuo un confronto di altri due fogli di lavoro (mese precedente e mese corrente).

I fogli 'mese precedente' e 'mese corrente' contengono 4 colonne con 4 tipi di dati x n righe

Nel foglio 'Confronto' vengono riportati solo i dati differenti, mettendo, ad esempio, nella colonna A alla riga 'X' (ovvero la riga esatta) il dato del mese precedente e nella colonna B (sempre alla stessa riga) il dato del mese corrente.

In pratica il foglio'Confronto' è composto da otto colonne, divise due a due.

I confronti sono quindi colonna per colonna (A di foglio 'mese precedente' con A di 'mese corrente' ecc.) e vengono trascritti, alla riga relativa, solo le celle che presentano differenze (può quindi esserci il caso in cui alla riga 2 le celle di colonna A e B siano vuote, ma quelle delle colonne C e D presentino i valori relativi a mese precedente e mese corrente, se differenti tra loro).

Fino a qui tutto bene. Sono riuscito a costruirmi una macro partendo da definizioni trovate in rete ed altri lavori pregressi in azienda.

Il problema è che il foglio 'Confronti' ha circa 3000 (tremila) righe e devo scorrere tutto il foglio per vedere se ci sono celle scritte.

L'idea sarebbe quindi quella di creare un quarto foglio di lavoro definito 'RIEPILOGO', in cui copiare le righe (partendo dalla numero 2, essendo alla 1 le intestazioni di colonna) con almeno un dato variato, ma eliminando completamente le righe che non presentano alcuna variazione in alcuna colonna.

Il foglio 'RIEPILOGO' dovrebbe avere 9 colonne e non 8, in quanto nella prima colonna andrebbe il numero di riga relativo al foglio 'Confronti' (che poi corrisponde al numero effettivo in cui quel dato si trova nel db di origine)

In pratica dovrei avere, ad esempio:

Colonna A: Tupla XX (anche solo il numero mi basta)

Colonna B: dato mese prec

Colonna C: dato mese corr

Colonna D: dato mese prec

Colonna E: dato mese corr

Colonna F: dato mese prec

Colonna G: dato mese corr

Colonna H: dato mese prec

Colonna I: dato mese corr

esempio di tabella 'RIEPILOGO' restituita che dovrei ottenere:

A        B        C        D        E        F        G        H        I

1     INTESTAZIONI INTESTAZIONI INTESTAZIONI INTESTAZIONI

2      35                          FR      GH

3      621                                                              TIZIO      CAIO

4      2001  FR      GH                       GINO    PINO

5      2541                                                            TIZIO      CAIO

6      3000   lino  dino

Il confronto, attivabile con apposito tasto (su questo non ho problemi a gestirlo), dovrebbe azzerare i contenuti di cella ogni volta venga lanciato (ovvero ogni primo del mese, ndr ^_^)

Infine una successiva macro che permette di stampare il riepilogo fermandosi, però alla pagina di conferma opzioni di stampa (per ora riesco solo a lanciare la stampa automaticamente, ma vorrei poter definire le preferenze manualmente ogni volta)

Spero di essere stato chiaro...

Grazie delle info che saprete sicuramente darmi :)

Luca Puglia da Ravenna

Microsoft 365 e Office | Excel | 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
2013-11-07T12:59:39+00:00

Ho provato ad implementarla, ma non ottengo alcun risultato...

in ogni caso chiedo se ho capito alcune sintassi:

Set rNonEmpty = .Cells.SpecialCells(xlCellTypeConstants).EntireRow -> è il comando per copiare la riga intera se almeno una cella qualunque della riga non è vuota?

.Cells(riga, 1).Value = a.Row -> definisce il numero della tupla e lo mette in colonna 1 dello sheet riepilogo? (ovvero definito in dichiarazione variabili/costanti ad inizio sub "a" come oggetto definente il numero di riga in sheet CONFRONTO, diviene elemento di cella in successivo loop?)

.Cells(riga, 2).Resize(, 8).Value = Sheets("CONFRONTO").Cells(a.Row, 1).Resize(, 8).Value -> qui penso la comprensione sia piuttosto semplice, ovvero in sheet RIEPILOGO, dato il range di colonna da 2 ad 8 inserisci in cella relativa elemento relativo a sheet CONFRONTO

domanda1: sapevo che VBA è case sensitive... vale anche per i nomi degli sheet?

domanda2: perchè avviare un loop sugli errori runtime? non capisco il perchè di questa macro... scusate l'estrema ignoranza! probabile che questa mia domanda evidenzi la mia totale incompetenza in programmazione... ma io credevo che la funzione On Error fosse relativa ad interruzioni di macro che si volevano evitare... ovvero quando una condizione non soddisfa i requisiti di macro e genera un blocco della stessa, la funziona permette di uscire dal loop di errore prendendo una strada alternativa... o sono completamente fuori strada? (più che possibile!!! ^_^)

Io necessito di una macro che semplicemente copi le righe con almeno una cella dato non vuota dello sheet confronto in sheet riepilogo, senza righe vuote tra loro, con prima colonna indicante numero di tupla e possibilità di stampa dati da tasto...

Ciao Luca,

io l'ho testata sul tuo file e funziona. Prima di fare qualsiasi implementazione l'hai eseguita anche tu, così com'è? La macro può essere eseguita separatamente dal tuo codice e non necessità di alcuna implementazione se i dati sui quali va a lavorare sono quelli del file di esempio.

Risposta 1. No.

Risposta 2. Non viene avviato nessun loop di gestione errori essendo esternamente al ciclo For/Next. La questione non è così semplice e per approfondire l'argomento, ti invito a leggere questo ottimo wiki.

Una volta verificato il corretto funzionamento sarò a disposizione per commentarlo e spiegare le parti che non ti sono chiare.

Andrea.

La risposta è stata utile?

0 commenti Nessun commento

8 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2013-11-07T07:59:14+00:00

    Ho lasciato anche le notazioni che un amico mi ha messo nella correzione del codice che avevo scritto... se riuscite a fare altrettanto ve ne sarei grato... così almeno comprendo l'errore :)

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2013-11-07T07:57:54+00:00

    Ho sbagliato qualcosa nell'upload e non mi riporta la macro di gestione del foglio Confronto... od almeno io non la vedo se faccio una prova di download...

    per cui la riporta di seguito:

    Sub ESEMPIO_CONF()

    For riga = 2 To Numero_Parametri

    For colonna = 1 To 8

    Cells.Clear

    Next

    Next

    Numero_Parametri = 3000

    '*****************************

    'AZZERA I VALORI DEL CONFRONTO

    '*****************************

    For riga = 2 To Numero_Parametri

    For colonna = 1 To 8

    'Al posto del trattino ci puoi mettere il carattere che vuoi, per esempio puoi già impostare la casella a OK

    'e verrà poi cambiata solo se il confronto tra le colonne e' negativo .. risparmiando codice

    Sheets("CONFRONTO").Cells(riga, colonna).Value = "-"

    Sheets("CONFRONTO").Cells(riga, colonna).Interior.ColorIndex = FF

    Next

    Next

    '**** NOTA *********

    ' Sheets("CONFRONTO").Cells(Riga, Colonna).Value

    ' Puoi puntare ad un oggetto del foglio di excel come se fosse un indirizzo : NAZIONE - REGIONE - PROVINCIA - Comune e così via.. la struttura è uguale

    ' Sheets("Confronto") ---> REGIONE

    ' Cells(x,y) ------------> PROVINCIA

    ' Value -----------------> Comune

    ' Con questo concetto puoi anche cambiare il colore del testo o il colore del background o l' allinemaento etct etc

    ' Addirittura prima di Sheets potresti mettere anche il percorso del file e pescare un foglio di lavoro di un altra directory... lo sconsiglio perchè potrebbe diventare lento...

    '**************************************************************************

    'CONFRONTA LA COLONNA SYMBOL (colonna 2): MESE PRECEDENTE CON MESE CORRENTE

    '**************************************************************************

    colonna = 1

    'Riga = 0  NON SERVE IMPOSTARE OGNI VOLTA IL VALORE DI RIGA: Ci pensa il ciclo FOR a reimpostarla ogni volta

    For riga = 1 To Numero_Parametri

    If Sheets("MESE_PRECEDENTE").Cells(riga, colonna).Value <> Sheets("MESE_CORRENTE").Cells(riga, colonna).Value Then

    Sheets("CONFRONTO").Cells(riga + 1, 1).Value = Sheets("MESE_PRECEDENTE").Cells(riga, colonna).Value

    Sheets("CONFRONTO").Cells(riga + 1, 1).Interior.ColorIndex = 6

    Sheets("CONFRONTO").Cells(riga + 1, 2).Value = Sheets("MESE_CORRENTE").Cells(riga, colonna).Value

    Sheets("CONFRONTO").Cells(riga + 1, 2).Interior.ColorIndex = 6

    Else

    Sheets("CONFRONTO").Cells(riga + 1, 1).Value = " "

    Sheets("CONFRONTO").Cells(riga + 1, 2).Value = " "

    End If

    ' NEL CASO SIANO UGUALI POTRESTI NON SCRIVERE NIENTE.. ALLA FINE A TE INTERESSA SAPERE QUELLI DIVERSI

    ' COSI RISPARMI CODICE INUTILE.

    ' NON CREDO CHE NEI TUOI CONFRONTI TI SERVA SALVARE PARA_NOME: CREDO ABBIA SENSO SOLO NEL CONFRONTO DEI PARAMETRI FORMULA DA DOVE HAI COPIATO IL CODICE

    Next

    '**************************************************************************

    'CONFRONTA LA COLONNA ADDRESS (colonna 3): MESE PRECEDENTE CON MESE CORRENTE

    '**************************************************************************

    colonna = 2

    For riga = 1 To Numero_Parametri

    If Sheets("MESE_PRECEDENTE").Cells(riga, colonna).Value <> Sheets("MESE_CORRENTE").Cells(riga, colonna).Value Then

    Sheets("CONFRONTO").Cells(riga + 1, 3).Value = Sheets("MESE_PRECEDENTE").Cells(riga, colonna).Value

    Sheets("CONFRONTO").Cells(riga + 1, 3).Interior.ColorIndex = 7

    Sheets("CONFRONTO").Cells(riga + 1, 4).Value = Sheets("MESE_CORRENTE").Cells(riga, colonna).Value

    Sheets("CONFRONTO").Cells(riga + 1, 4).Interior.ColorIndex = 7

    Else

    Sheets("CONFRONTO").Cells(riga + 1, 3).Value = " "

    Sheets("CONFRONTO").Cells(riga + 1, 4).Value = " "

    End If

    Next

    '**************************************************************************

    'Puoi andare avanti per tutte le colonne che desideri

    '**************************************************************************

    colonna = 3

    For riga = 1 To Numero_Parametri

    If Sheets("MESE_PRECEDENTE").Cells(riga, colonna).Value <> Sheets("MESE_CORRENTE").Cells(riga, colonna).Value Then

    Sheets("CONFRONTO").Cells(riga + 1, 5).Value = Sheets("MESE_PRECEDENTE").Cells(riga, colonna).Value

    Sheets("CONFRONTO").Cells(riga + 1, 5).Interior.ColorIndex = 8

    Sheets("CONFRONTO").Cells(riga + 1, 6).Value = Sheets("MESE_CORRENTE").Cells(riga, colonna).Value

    Sheets("CONFRONTO").Cells(riga + 1, 6).Interior.ColorIndex = 8

    Else

    Sheets("CONFRONTO").Cells(riga + 1, 5).Value = " "

    Sheets("CONFRONTO").Cells(riga + 1, 6).Value = " "

    End If

    Next

    colonna = 4

    For riga = 1 To Numero_Parametri

    If Sheets("MESE_PRECEDENTE").Cells(riga, colonna).Value <> Sheets("MESE_CORRENTE").Cells(riga, colonna).Value Then

    Sheets("CONFRONTO").Cells(riga + 1, 7).Value = Sheets("MESE_PRECEDENTE").Cells(riga, colonna).Value

    Sheets("CONFRONTO").Cells(riga + 1, 7).Interior.ColorIndex = 10

    Sheets("CONFRONTO").Cells(riga + 1, 8).Value = Sheets("MESE_CORRENTE").Cells(riga, colonna).Value

    Sheets("CONFRONTO").Cells(riga + 1, 8).Interior.ColorIndex = 10

    Else

    Sheets("CONFRONTO").Cells(riga + 1, 7).Value = " "

    Sheets("CONFRONTO").Cells(riga + 1, 8).Value = " "

    End If

    Next

    MsgBox ("Confronto Effettuato")

    End Sub

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2013-11-07T07:54:39+00:00

    Questo il file di esempio:

    https://skydrive.live.com/#!/?cid=9144377F357A9B19&id=9144377F357A9B19%21105

    Spero si riesca a vedere (è la prima volta che utilizzo skydrive)

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2013-11-06T17:21:04+00:00

    Ciao a tutti :)

    Mi chiamo Luca Puglia e sono un n00bbo sia di questo forum che di sviluppo macro in excel.

    Ho comunque cercato nei vari thread soluzioni utili, ma fino ad ora non ho raggiunto l'obiettivo, per cui riposto domanda, sperando non fare eccessiva ripetizione d'argomento (nel qual caso chiedo venia!!!! ._.')

    Ho un foglio (Confronto) in cui effettuo un confronto di altri due fogli di lavoro (mese precedente e mese corrente).

    I fogli 'mese precedente' e 'mese corrente' contengono 4 colonne con 4 tipi di dati x n righe

    Nel foglio 'Confronto' vengono riportati solo i dati differenti, mettendo, ad esempio, nella colonna A alla riga 'X' (ovvero la riga esatta) il dato del mese precedente e nella colonna B (sempre alla stessa riga) il dato del mese corrente.

    In pratica il foglio'Confronto' è composto da otto colonne, divise due a due.

    I confronti sono quindi colonna per colonna (A di foglio 'mese precedente' con A di 'mese corrente' ecc.) e vengono trascritti, alla riga relativa, solo le celle che presentano differenze (può quindi esserci il caso in cui alla riga 2 le celle di colonna A e B siano vuote, ma quelle delle colonne C e D presentino i valori relativi a mese precedente e mese corrente, se differenti tra loro).

    Fino a qui tutto bene. Sono riuscito a costruirmi una macro partendo da definizioni trovate in rete ed altri lavori pregressi in azienda.

    Il problema è che il foglio 'Confronti' ha circa 3000 (tremila) righe e devo scorrere tutto il foglio per vedere se ci sono celle scritte.

    L'idea sarebbe quindi quella di creare un quarto foglio di lavoro definito 'RIEPILOGO', in cui copiare le righe (partendo dalla numero 2, essendo alla 1 le intestazioni di colonna) con almeno un dato variato, ma eliminando completamente le righe che non presentano alcuna variazione in alcuna colonna.

    Il foglio 'RIEPILOGO' dovrebbe avere 9 colonne e non 8, in quanto nella prima colonna andrebbe il numero di riga relativo al foglio 'Confronti' (che poi corrisponde al numero effettivo in cui quel dato si trova nel db di origine)

    In pratica dovrei avere, ad esempio:

    Colonna A: Tupla XX (anche solo il numero mi basta)

    Colonna B: dato mese prec

    Colonna C: dato mese corr

    Colonna D: dato mese prec

    Colonna E: dato mese corr

    Colonna F: dato mese prec

    Colonna G: dato mese corr

    Colonna H: dato mese prec

    Colonna I: dato mese corr

    esempio di tabella 'RIEPILOGO' restituita che dovrei ottenere:

    A        B        C        D        E        F        G        H        I

    1     INTESTAZIONI INTESTAZIONI INTESTAZIONI INTESTAZIONI

    2      35                          FR      GH

    3      621                                                              TIZIO      CAIO

    4      2001  FR      GH                       GINO    PINO

    5      2541                                                            TIZIO      CAIO

    6      3000   lino  dino

    Il confronto, attivabile con apposito tasto (su questo non ho problemi a gestirlo), dovrebbe azzerare i contenuti di cella ogni volta venga lanciato (ovvero ogni primo del mese, ndr ^_^)

    Infine una successiva macro che permette di stampare il riepilogo fermandosi, però alla pagina di conferma opzioni di stampa (per ora riesco solo a lanciare la stampa automaticamente, ma vorrei poter definire le preferenze manualmente ogni volta)

    Spero di essere stato chiaro...

    Grazie delle info che saprete sicuramente darmi :)

    Luca Puglia da Ravenna

    Ciao Luca,

    la cosa migliore, oltre alla tua dettagliata spiegazione, sarebbe allegare un file, magari 'camuffando' i dati se possono essere sensibili.

    Se non sai come pubblicarlo, leggi Come pubblicare file ed immagini nei forum di Microsoft Answers

    Andrea.

    La risposta è stata utile?

    0 commenti Nessun commento