Come creare una tabella pivot consolidata quando i dati di origine contengono intestazioni di colonna che sono date?

StackOverflow https://stackoverflow.com/questions/1434306

  •  07-07-2019
  •  | 
  •  

Domanda

Ho un cliente che sta attualmente utilizzando Excel per pianificare il proprio personale. Hanno molte cartelle di lavoro per diversi progetti e ogni progetto contiene 1 o più fogli contenenti i dati effettivi sul personale:

Foglio di pianificazione del personale di esempio

Il cliente desidera consolidare tutti i dati di tutti questi fogli e cartelle di lavoro in un'unica tabella pivot. Un pivot 'consolidato' non è un'opzione perché vogliono essere in grado di pasticciare con tutti i campi (non datati) nei dati di origine. Non vogliono essere limitati solo a "Fila" e "Colonna". La mia attuale soluzione è una macro che consolida tutti i dati all'interno di una cartella di lavoro attraverso un processo di copia e rotazione abbastanza contorto. Copio prima una riga di "metadati" (tutto ciò che non è una data), quindi copio / traspongo le date per la riga dei metadati in una singola colonna "Data". Quindi estendo i metadati in modo da definire gli stessi dati per ciascuna data.

Ho una cartella di lavoro separata che prende il foglio consolidato da ciascuna cartella di lavoro e crea una singola tabella pivot da loro.

Funziona, ma è piuttosto inefficiente, dato che il numero totale di compiti / incarichi è nelle migliaia. Nei miei sogni, mi piacerebbe eliminare completamente il passaggio di consolidamento, ma non vedo che ciò accada. Un approccio di consolidamento più efficiente riguarda il meglio che spero a questo punto.

Se qualcuno ha delle idee "fuori dagli schemi", sono tutto orecchi! Le soluzioni devono funzionare su Windows XP, Office 2002 e 2003.

È stato utile?

Soluzione

Ho finalmente trovato una soluzione accettabile , se qualcuno è interessato. Utilizza una combinazione di una tabella pivot e TextToColumns funzione. Una volta che ho avuto l'approccio, trasformarlo in codice era piuttosto semplice. Il codice seguente fa riferimento ad alcune funzioni di convenzione che utilizzo, come "DeleteSheet" e "LastRowOn", ma ottieni l'idea.

Sub Foo()
    Dim ws As Worksheet
    For Each ws In Worksheets
        If IsStaffingSheet(ws) Then
            ws.Select
            DeleteSheet ws.Name & " - Exploded"
            TransposeSheet ws
        End If
    Next ws

End Sub

Sub TransposeSheet(ByVal ParentSheet As Worksheet)
    Dim ws As Worksheet
    Dim r As Range
    Dim ref As Variant
    Dim pt As PivotTable

    Set r = Range("StaffingStartCell")
    Set r = Range(r, r.SpecialCells(xlLastCell))

    ref = Array("'" & ActiveSheet.Name _
                    & "'!" & r.Address(ReferenceStyle:=xlR1C1))

    Application.CutCopyMode = False
    ActiveWorkbook.PivotCaches.Add(SourceType:=xlConsolidation, _
                                   SourceData:=ref).CreatePivotTable TableDestination:="", _
        tableName:="PivotTable1", DefaultVersion:=xlPivotTableVersion10

    Set ws = ActiveSheet
    Set pt = ws.PivotTableWizard(TableDestination:=ActiveSheet.Cells(3, 1))
    pt.DataPivotField.PivotItems("Count of Value").Position = 1
    pt.PivotFields("Row").PivotItems("").Visible = False

    ExplodePivot ParentSheet
    Application.DisplayAlerts = False
    ws.Delete
    Application.DisplayAlerts = True

    Set ws = Nothing
End Sub


Sub ExplodePivot(ByVal ParentSheet As Worksheet)
    Dim lastRow As Long
    Dim lastCol As Long

    lastRow = LastRowOn(ActiveSheet.Name)
    lastCol = LastColumnBack(ActiveSheet, lastRow)

    Cells(lastRow, lastCol).ShowDetail = True

    Columns("B:C").Select
    Selection.Cut Destination:=Columns("S:T")

    Columns("A:A").Select
    Selection.TextToColumns Destination:=Range("A1"), _
                            DataType:=xlDelimited, _
                            Semicolon:=True
    Selection.ColumnWidth = 12
    ActiveSheet.Name = ParentSheet.Name & " - Exploded"
End Sub
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top