pivot



  • pivot
    di MarcoD (utente non iscritto) data: 10/04/2014 21:35:04

    Si può da un unico foglio contenete dati creare più tabelle pivot ( su fogli diversi) e allacciare ad ogni pivot un grafico a doc?. Poi posso modificare il foglio base e continuare ad estrapolare i dati sempre dalle pivot collegate.
    Devo consegnare mensilmente delle analisi e tutte le volte ( perchè sono un dilettante ) rifare il file di excel.
    Grazie a tutti quelli che mi possono aiutare



  • di Grograman data: 11/04/2014 08:47:56

    Assolutamente sì!

    Direi che è anzi un ottim modo per snellirsi il lavoro.

    Ci ho campato per anni con questa tecnica!
    Caso semplice:
    Un foglio con i DATI, 4-5 fogli con le pivot, ogni pivot pesca dai DATI, ed alimenta un proprio grafico.
    Il mese prossimo, a patto ovviamente che la struttura dei DATI sia la maedesima, sovrascriverai i DATI, aggiornerai le pivot e i grafici ad esse collegate andranno a posto da soli.
    Piccolo consiglio, ricordati di variare l'origine dati delle pivot in caso i DATI del t2 siano maggiori (più righe) dei DATI del t1.

    Caso Elaborato:
    Usi un foglio DATI1, un foglio DATI2, nei quali getti i dati grezzi, e poi un foglio DATITOT con formule che pescano dai due fogli precedenti, e a cascata tabelle e grafici.
    Qui puoi sfruttare il fatto che rielaborando i dati con delle formule puoi trascinarti un margine di qualche migliaio di righe in modo che la base dati delle piovt sia già "pronta" per accogliere una mole maggiore di dati.


    Poi ovviamente si potrebbe ricorrere a qualche riga di codice per aggiornare le pivot, importare i dati, un domani crearle ex novo le tabelle, ma andiamo per ordine



  • di MarcoD (utente non iscritto) data: 11/04/2014 13:49:30

    Grazie.
    Problema 1 : trovare l'origine dei dati. quando creo un pivot non riesco ( me culpa ) a variarne l'origine.
    se seleziono più celle o colonne rispetto ai dati immessi la pivot mi genera delle caselle vuote. Si possono togliere ma l'operazione deve essere effettuata su ogni campo.
    Ho scopiazzato qua e la un pò di codici VBA ma come puoi capire o ci fai o ci sei. ( e io ci sono )
    Ti allego quello che sono riuscito a fare.
    La mia speranza sarebbe quella di creare un foglio base da salvare mese per mese. mi manca ancora molto soprattutto la creazione del grafico allegato con codici VBA.
    grazie ancora per la pazienza

     
    Sub Creo_Pivot()      Dim wb As Workbook
        Dim ws As Worksheet
        Dim oPvtCch As PivotCache
        Dim oPvtTbl As PivotTable
        Dim rng As Range
        Dim r As Long
        
        
    
        Set wb = ThisWorkbook
        Set ws = wb.Worksheets("Dbase")
        r = ws.Cells(Rows.Count, 25).End(xlUp).Row    sono le colonne che importo 
        Set rng = ws.Range("A1:Y" & r)
        Set oPvtCch = wb.PivotCaches.Add(SourceType:=xlDatabase, SourceData:=rng)    'crea cache per tabella dal range
        Set oPvtTbl = oPvtCch.CreatePivotTable("")    'crea pivot in nuovo foglio
        With oPvtTbl.Parent
            .PivotTableWizard TableDestination:=oPvtTbl.Parent.Cells(3, 1)
            .Name = "Ore famiglia"    'controlla che la pivot sia quella giusta
        End With
        With oPvtTbl
            .Name = "Ore famiglia" 'rinomino la tabella, serve per la seconda routine
             .PivotFields("Famiglia").Orientation = xlPageField 'campo in filtro di rapporto
            .PivotFields("Famiglia").Position = 1 'posizione 1
            .PivotFields("Causale Doc.").Orientation = xlRowField ' campo in etichette di riga
            .PivotFields("Causale Doc.").Position = 1
            .PivotFields("Attività").Orientation = xlRowField 'campo in etichette di riga
            .PivotFields("Attività").Position = 2 'posizione 2
            .AddDataField .PivotFields("Tempo"), "Somma di tempo", xlSum 'aggiungo somma del campo ("")
            .ColumnGrand = False ' tolgo i totali per colonna
            .RowGrand = False     ' tolgo i totali per riga
          End With
             'poi mi fermo perchè non riesco a creare altri fogli.



  • di Grograman (utente non iscritto) data: 11/04/2014 16:22:11

    Chissa come mai quel codice non mi è nuovo



  • di MarcoD (utente non iscritto) data: 11/04/2014 16:59:41

    Sicuramente viene da fonti a te conosciute.



  • di Grograman (utente non iscritto) data: 11/04/2014 17:02:25

    Direi da me medeimo

    Lunedì vediamo di approfondire, ma seza un file di esempio non prometto nulla di buono!!



  • di Grograman (utente non iscritto) data: 11/04/2014 17:03:53

    p.s. dagli appunti
     
    Option Explicit
    
    Sub Pivot_Saldat()
    
      Dim oPvtCch As PivotCache
      Dim oPvtTbl As PivotTable
      Dim ptField As PivotField
      Dim ptItem As PivotItem
      Dim wsDati As Worksheet
      Dim rngDati As Range
      
      Set wsDati = Worksheets("Foglio1") '"iltuofoglio"
      Set rngDati = wsDati.Range("A1:R10") '"iltuorange"
      Set oPvtCch = wsDati.Parent.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=rngDati)   'crea cache per tabella dal range
      Set oPvtTbl = oPvtCch.CreatePivotTable(wsDati.Parent.Worksheets.Add.Cells(2, 2))  'crea pivot in nuovo foglio
    
      With oPvtTbl
        .RowAxisLayout xlOutlineRow
        .Name = wsDati.Name
        .PivotFields(7).Orientation = xlRowField    'Lato
        .PivotFields(7).Position = 1    'Lato come primo elemento
        .PivotFields(1).Orientation = xlRowField    'Conto
        .PivotFields(1).Position = 2    'Conto secondo elemento
        .PivotFields(2).Orientation = xlRowField    'Descrizione
        .PivotFields(2).Position = 3    'Descrizione terzo elemento
        .PivotFields(4).Orientation = xlRowField    'Segno
        .PivotFields(4).Position = 4    'Segno quarto elemento
        .PivotFields(4).Caption = "Segno "    'Nome campo segno
            For Each ptItem In .PivotFields(4).PivotItems
                 If ptItem.Caption = "(blank)" Then ptItem.Visible = False
            Next
        '.PivotFields(6).PivotItems("(blank)").Visible = False
        .AddDataField .PivotFields(5), "Importo", xlSum    'Somma importo
        .PivotFields("Importo").NumberFormat = "_(* #,##0.00_);_(* (#,##0.00);_(* ""-""??_);_(@_)"    'formatto importi
        .RowAxisLayout xlTabularRow
        .TableStyle2 = "PivotStyleMedium9"
        .PivotFields(7).PivotItems(1).Position = 1    'Metto in Testa Attivo
        'Modifica del 07/02/2013, in testa i Transitori
        .SubtotalLocation xlAtTop
        For Each ptField In .RowFields    'elimino i subtotali
          If ptField.Name <> "Lato" Then
            On Error Resume Next
            ptField.Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False)
          End If
        Next ptField
      End With
      
      Set rngDati = Nothing
      Set wsDati = Nothing
      Set oPvtCch = Nothing
      Set oPvtTbl = Nothing
    End Sub



  • di Marcod (utente non iscritto) data: 11/04/2014 18:08:28

    Buon week end



  • di MarcoD (utente non iscritto) data: 14/04/2014 10:33:21

    Buongiorno. Rieccoci.
    Da come ci siamo lasciati venerdì allego il mio file.( se ho capito come si fa)
    Il risultato è il lavoro manuale che metto a disposizione del mio superiore per il controllo dei dati.
    Ad ogni Dbase corrisponde una pivot ( così mi è stato detto) quindi ho creato più fogli.
    Con il codice "scopiazzato" da me (ingiusta ma utilissima impropriazione) credo di aver capito che invece posso creare, su più fogli, le pivot da un unica tabella dati.
    Resta il probelma di farlo funzionare. Ma una cosa alla volta.
    Le altre routine servono solo per semplificare la lettura dei vari grafici.
    Grazie



  • di Grograman (utente non iscritto) data: 14/04/2014 17:59:14

    Ciao!

    Scusa, ma oggi è stata una giornata infernale, quindi non ho avuto modo di riprendere il discorso.

    Ad ogni modo manca il file di esempio!
    Domani se riesco butto giù due righe basandomi su quel codice per aggiornare la cache della pivot in base all'ultima riga valorizzata.




  • di MarcoD (utente non iscritto) data: 14/04/2014 19:15:05

    Ok non devi scusarti. Anche per me e stata una giornataccia. Il file l'ho allegato con il pulsante allega file. Domani come torno in ufficio ci riprovo.
    Buona serata e buon riposo
    A domani se hai tempo



  • di Grograman data: 15/04/2014 09:56:36

    Ciao!

    Allora, tieni conto che è abbastanza mirato il codice che sto per proporti, quindi funzionerà esclusivamente su quel file, o su qualunque altro file abbia i “database” che alimentano le pivot che rispecchino queste due condizioni:
    1) Hanno il file di origine uguale a quello della pivot (NO collegamento esterno dati)
    2) Iniziano dalla cella A1 (questo è modificabile ma non l’ho implementato)
    A questo punto cosa succede.
    Cicla tutti i fogli del workbook in cui lanci il codice, e per ogni foglio cicla tutte le tabelle.
    Poi, partendo dalla proprietà “Sourcedata” di ogni tabella va a cercarsi il foglio di origine dati (quella parte non è proprio bella, ma pare funzionare, non so se ci sono modi più agili per farlo), ne calcola l’ultima riga piena e modifica l’origine dati sulla base del nuovo range individuato.

    Tradotto in parole povere, significa che se la tua tabella “Ore per famiglia” attualmente ha una sourcedata:
    Dbasefamiglia!R1C1:R499999C16
    Dopo il ciclo diventa:
    'Dbasefamiglia'!R1C1:R1409C16

    (gli apostrofi li ho previsti in caso di nomi foglio contenenti spazi, male non fanno!).

    Ed ecco il codice (per inciso, non ci vedo nulla di male a copiare codici altrui, l’importante è arrivare a comprenderli! e magari fare riferimento alla fonte)

    Prova a mettere dove ti serve quella routine, poi bisognerebbe capire come aggiorni le basi dati, ma vedendo il file fatto e finito mi è più difficile.

     
    Sub aggiorna()
      Dim wb As Workbook
      Dim ws As Worksheet, wsPvC As Worksheet
      
      Dim oPvTbl As PivotTable
      Dim oPvFld As PivotField
      Dim sCache As String
      Dim x As Long, y As Long
      Dim ass As String
      Set wb = ActiveWorkbook
      Set ws = wb.ActiveSheet
    '  On Error Resume Next
      For Each ws In wb.Worksheets
        For Each oPvTbl In ws.PivotTables
          With oPvTbl
          
            'troviamo il nome del foglio di origine dati e diamogli una ripulita da caratteri speciali
            sCache = Replace(Left(.SourceData, InStr(1, .SourceData, "!", vbTextCompare) - 1), "'", "")
            x = Right(.SourceData, (Len(.SourceData) - InStrRev(.SourceData, "C", , vbTextCompare))) 'per trovare il numero ultima colonna della sourcedata
            
            'individuato il foglio di origine troviamo l'ultima riga piena di colonna A
            'questa parte è da implementare, il range di origine potrebbe non iniziare dalla prima
            'colonna e quindi bisognerebbe individuarla sempre dalla proprietà "Sourcedata" della pivot
            Set wsPvC = wb.Worksheets(sCache)
            With wsPvC
              y = .Range("A" & .Rows.Count).End(xlUp).Row
              
              'in maniera probabilmente maccheronica ricostruiamo la nuova pivotcache sulla base
              'dell'ultima riga trovata
              sCache = "'" & .Name & "'!R1C1:R" & y & "C" & x
            End With
            Set wsPvC = Nothing
            
            .SourceData = sCache 'qui il vero "refresh", sostituiamo la sourcedata
          End With
        Next oPvTbl
      Next ws
      Set ws = Nothing
      Set wb = Nothing
    End Sub



  • di Grograman data: 15/04/2014 10:01:15

    P.s. appena ho tempo mi metto sotto per trovare un buon modo per adattare l'aggiornamento indipendentamente dalla posizione dei dati che alimentano la pivot perchè mi serve per un componente aggiuntivo motlo blando che uso per aggiornare le tabelle che potrei incrementare di questa "funzione"
     
    Option Explicit
    
    Sub Cache_Pivot()
      Dim wb As Workbook
      Dim ws As Worksheet
      Dim pvtTbl As PivotTable
      
      On Error Resume Next
    
      Set wb = ActiveWorkbook
      For Each ws In wb.Worksheets
        For Each pvtTbl In ws.PivotTables
          pvtTbl.PivotCache.Refresh
        Next pvtTbl
      Next ws
      Set wb = Nothing
    End Sub
    



  • di Grograman (utente non iscritto) data: 15/04/2014 10:30:39

    Ci sono!
    Nel codice di prima manca una cosa fondamentale...

    Dopo ".sourcedata = scache" va aggiunto
    .PivotCache.Refresh

    Il nuovo componente aggiuntivo siffatto diventa quindi (valido solo per le pivot con i dati nel foglio di destinazione):
     
    Option Explicit
    
    Sub Cache_Pivot()
      Dim wb As Workbook
      Dim ws As Worksheet, wsPvC As Worksheet
      
      Dim oPvTbl As PivotTable
      Dim oPvFld As PivotField
      Dim sCache As String, sCol As String
      Dim x As Long, y As Long, k As Long
      Dim ass As String
      Set wb = ActiveWorkbook
      Set ws = wb.ActiveSheet
      On Error Resume Next
      For Each ws In wb.Worksheets
        For Each oPvTbl In ws.PivotTables
          If oPvTbl.Parent.Parent.Name = wb.Name Then
            With oPvTbl
              sCol = Right(.SourceData, Len(.SourceData) - InStr(1, .SourceData, "!", vbTextCompare))
              sCol = Left(sCol, InStr(1, sCol, ":", vbTextCompare) - 1)
              
              'troviamo il nome del foglio di origine dati e diamogli una ripulita da caratteri speciali
              sCache = Replace(Left(.SourceData, InStr(1, .SourceData, "!", vbTextCompare) - 1), "'", "")
              
              x = Right(.SourceData, (Len(.SourceData) - InStrRev(.SourceData, "C", , vbTextCompare))) 'per trovare il numero ultima colonna della sourcedata
              
              Set wsPvC = wb.Worksheets(sCache)
              With wsPvC
                y = .Range("A" & .Rows.Count).End(xlUp).Row
                sCache = "'" & .Name & "'!" & sCol & ":R" & y & "C" & x
              End With
              Set wsPvC = Nothing
              
              .SourceData = sCache 'qui il vero "refresh", sostituiamo la sourcedata
              .PivotCache.Refresh
            End With
          End If
        Next oPvTbl
      Next ws
      Set ws = Nothing
      Set wb = Nothing
    End Sub
    



  • di MarcoD (utente non iscritto) data: 15/04/2014 11:18:41

    Scusa il ritardo nella risposta, ma sono un po impegnato.
    Allora l'origine dei dati viene dal gestionale. riesco a scaricare da una procedura del software una tabella di excel (crystal report) sempre uguale come disposizione e intestazione dei campi, ovviamente aggiornata nel numero delle righe, a seconda della mia rischiesta . ( da data a data ).
    Quindi io copio questa tabella nel file sul foglio dbase.
    Ora di primo acchitto non ho capito niente di quello che mi hai trasferito. Ti do ragione quando dici che i codici vanno capiti. ( ) Io sostengo che la risoluzione del problema sia non solo quella di far funzionare la routine che ti serviva, e buona notte, ma sapere il perchè delle cose .
    Ora senza arrivare alle lacrime, il massimo rispetto per tutte le persone che come tè spendono del loro tempo. Ora provo a studiare riga per riga( non per il dubbio ma per ignoranza) e vedo se il tutto funziona. Che Dio mi assista
    Grazie ancora



  • di Grograman (utente non iscritto) data: 15/04/2014 11:37:50

    Ho allegato il file "Pivot_Refresher.xlam" che va installato come componente aggiuntivo (google per dettagli ;)), poi te lo puoi mettere in una sezione dedicata del Ribbon e richiamarlo quando ti serve!



  • di MarcoD (utente non iscritto) data: 15/04/2014 12:05:36

    Ri scusa ma il file allegato dove lo trovo? Buon appetito



  • di Grograman (utente non iscritto) data: 15/04/2014 12:14:04

    In alto a destra all'inizio della discussione.



  • di MarcoD (utente non iscritto) data: 17/04/2014 15:43:50

    Ho provato il codice inviatomi e funziona.
    Un vivo ringraziamento.
    Scusa il ritardo ma sono stato molto occupato.
    Resta inteso che non ho ancora del tutto assimilato la routine ma il tempo mi dara ragione.
    Grazie



  • di mb (utente non iscritto) data: 20/04/2014 20:41:03

    buona sera e buona pasqua
    una curiosità come si fanno a vedere i fogli dai quali vengono generte le tabelle pivot
    sapevo come fare a vedere dei fogli nascosti se ne esistevano altri ma in questo caso dove sono??

    grazie

    ciao Grograman è arrivato il curiosone!!!!!!!




  • di mb (utente non iscritto) data: 22/04/2014 09:18:45

    ..
    non so se mi sono comportato coma da regolamento forum ho tolto la spunta di risolto al post

    mi scuso se ho avuto un atteggiamento non corretto

    grazie



  • di mb data: 23/04/2014 16:18:51

    scusa ancora il disturbo...

    e' questo il passaggio che non fa comparire i fogli??

    grazie a chi mi può aiutare a capire
     
    Sheets("Intestazione").Select ' apro la pagina d'instestazione e tolgo tutte le visualizzzioni
       With Application
          ActiveWindow.DisplayGridlines = False
          ActiveWindow.DisplayHeadings = False
          Application.DisplayFormulaBar = False
          Application.DisplayFullScreen = True  ' schermo intero
          ActiveWindow.DisplayWorkbookTabs = False
          .ScreenUpdating = False
       End With



  • di mb data: 23/04/2014 16:53:37

    ci sono arrivato.....

    buona serata



  • di mb data: 23/04/2014 23:44:48

    buonasera
    mi è crollato tutto ..... pensavo di aver capito e invece no
    ho cancellato la funzione in open e la procedura ha funzionato lo stesso (impossibile!!!!)
    spero in un aiuto dal mio omonimo o in qualche altro guru per poter festeggiare nei prossimi giorni....
    onomastco e compleanno....