Il blog di Gianni Giaccaglini

Blog su VBA e VSTO
Gianni Giaccaglini

My Links

News

NB - V. anche gli ARTICOLI (in fondo a questa barra)
Solo quesiti validi a: giannigiac@tin.it
Il mio Best seller su VBA
(v. www.hoepli.it)


Il mio ultimo libro su Open XML
(v. www.FAG.it):



La mia nipotina ELISA

Foto con dedica a ME di
Bill Gates giovanissimo
nei mitici anni 80!

Categorie Post

Categorie Articoli

Archivio

Immagini

Blog Stats

lunedì 24 maggio 2010 #

Subtotali per mese con un semplice ma utile trucco

Subtotali per mese con un semplice ma utile trucco

Prima di procedere, segnalo un utile articolo Microsoft che descrive come velocizzare WINDOWS 7, semplicemente sfruttando una chiavetta USB di adeguata capacità:

http://www.microsoft.com/italy/pmi/comefare/tecnologia/readyboost/default.mspx

Ma torniamo a bomba, con il tema del titolo.

Si abbia un intervallo database del tipo seguente:

 

A

B

C

D

E

F

G

1

DATA

TIPO

QUANT

PREZZO

RICAVO

2

04/01/2010

AA01

              21,00

10

          210,00

3

13/01/2010

AA02

              15,00

15

          225,00

4

14/01/2010

AA01

              42,00

10

          420,00

5

21/01/2010

AA02

              22,00

10

          220,00

6

02/02/2010

AA02

              34,00

10

          340,00

7

04/02/2010

AA01

              12,00

15

          180,00

8

15/02/2010

AA03

              50,00

15

          750,00

9

18/02/2010

AA03

              33,00

5

          165,00

10

22/02/2010

AA01

              42,00

5

          210,00

11

01/03/2010

AA01

              32,00

5

          160,00

12

03/03/2010

AA03

              42,00

10

          420,00

Si desiderano totali parziali relativi a ciascun mese. Premesso che in ogni caso è necessario che sia applicato l’ordinamento (sort) secondo la data, si possono percorrere almeno due vie: estrazione dei record specifici mediante un filtro opportuno o, più comodamente, sfruttando i subtotali. Ma come fare, visto che non esiste in origine un campo del mese?

La soluzione, cui probabilmente molti (ma non tutti) avranno pensato, consiste nell’inserimento, sulla sinistra di un altro campo intestato MESE (giustappunto, e a causa di sfrenata fantasia letteraria):

 

A

B

C

D

E

F

G

H

1

MESE

DATA

TIPO

QUANT

PREZZO

RICAVO

2

Gennaio

04/01/2010

AA01

              21,00

10

          210,00

3

Gennaio

13/01/2010

AA02

              15,00

15

          225,00

4

Gennaio

14/01/2010

AA01

              42,00

10

          420,00

5

Gennaio

21/01/2010

AA02

              22,00

10

          220,00

6

Febbraio

02/02/2010

AA02

              34,00

10

          340,00

7

Febbraio

04/02/2010

AA01

              12,00

15

          180,00

8

Febbraio

15/02/2010

AA03

              50,00

15

          750,00

9

Febbraio

18/02/2010

AA03

              33,00

5

          165,00

10

Febbraio

22/02/2010

AA01

              42,00

5

          210,00

11

Marzo

01/03/2010

AA01

              32,00

5

          160,00

12

Marzo

03/03/2010

AA03

              42,00

10

          420,00

 

Inoltre nelle celle da A2 in giù va messa una formula del tipo seguente:

=SCEGLI(MESE(B2);"Gennaio";"Febbraio";"Marzo";"Aprile";"Maggio";. . . ;"Novembre";"Dicembre")

Nota per i primo-armigeri. La formula precedente si può inserire in A2 e poi copiare in basso o più astutamente in tre mosse: 1. Selezionare l’intero campo da A2 in basso; 2. Inserire la predetta formula in A2; 3. Premere Ctrl+Invio anziché l’usuale Invio.

L’applicazione e rimozione dei subtotali agognati si può infine meccanizzate con il codice macro qui sotto riportato:

Dim swMettiTogli As Boolean ' Definizione a livello modulo: conserva il suo valore

 

Sub MettiTogliSubtotali()

  swMettiTogli = Not swMettiTogli ' True/False in alternanza

  With Range("A1") ' Così la macro opera "a distanza"

                   ' cioè pure se A1 NON è selezionato

    If swMettiTogli Then

      .Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(6), _

          Replace:=True, PageBreaks:=False, SummaryBelowData:=True

    Else

      .RemoveSubtotal

    End If

  End With

End Sub

 

La macro può essere consumata da tutti come ricetta, mentre ai più esperti suggerisco l’esegesi autogestita.


NOTA BENE. I subtotali NON si applicano a una tabella - oggetto ListObject in VBA - ma solo a un normale intervallo dotato di intestazioni. Altrimenti la nostra bella macro fallisce...

?>

?>

posted @ 11.24 | Feedback (0)