跨多個數據范圍的數據透視表

問題的形成

數據透視表是 Excel 中最令人驚嘆的工具之一。 但到目前為止,不幸的是,沒有任何版本的 Excel 可以即時執行簡單且必要的操作,例如為位於不同工作表或不同表中的多個初始數據范圍構建摘要:

在開始之前,讓我們澄清幾點。 先驗地,我認為我們的數據滿足以下條件:

  • 表可以有任意數量的包含任何數據的行,但它們必須具有相同的標題。
  • 帶有源表的工作表上不應有額外的數據。 一張紙——一張桌子。 要控制,我建議您使用鍵盤快捷鍵 按Ctrl+結束,這會將您移動到工作表中最後使用的單元格。 理想情況下,這應該是數據表中的最後一個單元格。 如果當你點擊 按Ctrl+結束 表格右側或下方的任何空單元格都會突出顯示 - 刪除表格右側或表格下方的這些空列或表格後的行並保存文件。

方法 1:使用 Power Query 為數據透視表構建表

從 Excel 2010 版本開始,有一個免費的 Power Query 加載項可以收集和轉換任何數據,然後將其作為構建數據透視表的源。 在這個插件的幫助下解決我們的問題一點也不難。

首先,讓我們在 Excel 中創建一個新的空文件——將在其中進行組裝,然後將在其中創建一個數據透視表。

然後在選項卡上 數據 (如果您有 Excel 2016 或更高版本)或在選項卡上 電源查詢 (如果您有 Excel 2010-2013)選擇命令 創建查詢 - 從文件 - Excel (獲取數據——從文件——Excel) 並指定要收集的表的源文件:

跨多個數據范圍的數據透視表

在出現的窗口中,選擇任何工作表(不管是哪一個),然後按下面的按鈕 更改 (編輯):

跨多個數據范圍的數據透視表

Power Query 查詢編輯器窗口應在 Excel 頂部打開。 在面板上窗口的右側 請求參數 刪除除第一個以外的所有自動創建的步驟 – 資源 (資源):

跨多個數據范圍的數據透視表

現在我們看到所有工作表的一般列表。 如果文件中除了數據表之外還有一些其他的側表,那麼在此步驟中,我們的任務是僅選擇需要從中加載信息的那些表,使用表頭中的過濾器排除所有其他表:

跨多個數據范圍的數據透視表

刪除除列之外的所有列 數據通過右鍵單擊列標題並選擇 刪除其他列 (消除 其他欄目):

跨多個數據范圍的數據透視表

然後,您可以通過單擊列頂部的雙箭頭(複選框 使用原始列名稱作為前綴 你可以把它關掉):

跨多個數據范圍的數據透視表

如果你做的一切都正確,那麼此時你應該看到收集的所有表格的內容一個在另一個之下:

跨多個數據范圍的數據透視表

仍然使用按鈕將第一行提升到表頭 使用第一行作為標題 (使用第一行作為標題) 選項卡 首頁 (家) 並使用過濾器從數據中刪除重複的表頭:

跨多個數據范圍的數據透視表

保存使用命令完成的所有內容 關閉並加載 – 關閉並加載… (關閉並加載 - 關閉並加載到…) 選項卡 首頁 (家),然後在打開的窗口中,選擇選項 僅連接 (僅限連接):

跨多個數據范圍的數據透視表

一切。 它仍然只是建立一個摘要。 為此,請轉到選項卡 插入 - 數據透視表 (插入 - 數據透視表), 選擇選項 使用外部數據源 (使用外部數據源)然後點擊按鈕 選擇“連接”,我們的要求。 通過將我們需要的字段拖到行、列和值區域中,以完全標準的方式進一步創建和配置樞軸:

跨多個數據范圍的數據透視表

如果將來源數據發生變化或添加了更多存儲表,那麼使用命令更新查詢和我們的摘要就足夠了 全部刷新 選項卡 數據 (數據——全部刷新).

方法二、我們在宏中用UNION SQL命令聯合表

我們的問題的另一種解決方案是由這個宏表示,它使用命令為數據透視表創建一個數據集(緩存) 統一 SQL 查詢語言。 此命令組合數組中指定的所有表 工作表名稱 將書頁合併到一個數據表中。 也就是說,我們不是從不同的工作表物理複製和粘貼範圍,而是在計算機的 RAM 中執行相同的操作。 然後宏添加一個具有給定名稱的新工作表(變量 結果表名稱) 並根據收集的緩存在其上創建一個完整的 (!) 摘要。

要使用宏,請使用選項卡上的 Visual Basic 按鈕 開發人員 (開發商) 或鍵盤快捷鍵 其他+F11. 然後我們通過菜單插入一個新的空模塊 插入 - 模塊 並在那裡複製以下代碼:

Sub New_Multi_Table_Pivot() Dim i As Long Dim arSQL() As String Dim objPivotCache As PivotCache Dim objRS As Object Dim ResultSheetName As String Dim SheetsNames As Variant '結果透視表將顯示的工作表名稱 ResultSheetName = "Pivot" '工作表數組帶有源表的名稱 SheetsNames = Array("Alpha", "Beta", "Gamma", "Delta") '我們為來自 SheetsNames 的工作表的表和 ActiveWorkbook ReDim arSQL(1 To (UBound(SheetsNames) + 1) ) For i = LBound (SheetsNames) To UBound(SheetsNames) arSQL(i + 1) = "SELECT * FROM [" & SheetsNames(i) & "$]" Next i Set objRS = CreateObject("ADODB.Recordset") objRS .Open Join$(arSQL, "UNION ALL"), _ Join$(Array("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=", _ .FullName, ";Extended Properties=""Excel 8.0;" ""), vbNullString ) End With '重新創建工作表以顯示生成的數據透視表 On Error Resume Next Application.DisplayAlerts = False Worksheets(ResultSheetName).Delete Set wsPivot = Worksheets.Add wsPivo 噸。 Name = ResultSheetName '在此工作表上顯示生成的緩存摘要 Set objPivotCache = ActiveWorkbook.PivotCaches.Add(xlExternal) Set objPivotCache.Recordset = objRS Set objRS = Nothing With wsPivot objPivotCache.CreatePivotTable TableDestination:=wsPivot.Range("A3") Set objPivotCache = Nothing Range("A3").Select End With End Sub    

然後可以使用鍵盤快捷鍵運行完成的宏 其他+F8 或選項卡上的宏按鈕 開發人員 (開發者——宏).

這種方法的缺點:

  • 數據未更新,因為緩存與源表沒有連接。 如果更改源數據,則必須再次運行宏並再次構建摘要。
  • 更改張數時,需要編輯宏代碼(數組 工作表名稱).

但最終我們得到了一個真正成熟的數據透視表,它建立在來自不同工作表的多個範圍之上:

瞧!

技術說明: 如果您在運行宏時收到類似“未註冊提供程序”的錯誤,那麼很可能您安裝了 64 位版本的 Excel 或安裝了不完整的 Office 版本(無 Access)。 要解決此問題,請替換宏代碼中的片段:

	 提供商=Microsoft.Jet.OLEDB.4.0;  

到:

	提供者=Microsoft.ACE.OLEDB.12.0;  

並從 Microsoft 網站的 Access 下載並安裝免費的數據處理引擎 – Microsoft Access Database Engine 2010 Redistributable

方法 3:從舊版本的 Excel 合併數據透視表嚮導

這種方法有點過時,但仍然值得一提。 正式地說,在直到 2003 年(包括 XNUMX 年)的所有版本中,數據透視表嚮導中都有一個選項可以“為多個合併範圍構建數據透視表”。 然而,不幸的是,以這種方式構建的報告只會是一個真正的完整摘要的可憐表象,並且不支持傳統數據透視表的許多“籌碼”:

在這樣的數據透視表中,字段列表中沒有列標題,沒有靈活的結構設置,使用的函數集是有限的,總的來說,這一切都與數據透視表不太相似。 也許這就是為什麼從 2007 年開始,Microsoft 在創建數據透視表報告時從標準對話框中刪除了此功能。 現在此功能僅可通過自定義按鈕使用 數據透視表嚮導(數據透視表嚮導),如果需要,可以通過以下方式將其添加到快速訪問工具欄 文件——選項——自定義快速訪問工具欄——所有命令 (文件——選項——自定義快速訪問工具欄——所有命令):

跨多個數據范圍的數據透視表

單擊添加的按鈕後,您需要在嚮導的第一步選擇適當的選項:

跨多個數據范圍的數據透視表

然後在下一個窗口中,依次選擇每個範圍並將其添加到常規列表中:

跨多個數據范圍的數據透視表

但是,同樣,這不是一個完整的總結,所以不要期望太多。 我只能在非常簡單的情況下推薦這個選項。

  • 使用數據透視表創建報表
  • 在數據透視表中設置計算
  • 什麼是宏,如何使用它們,在哪裡複製 VBA 代碼等。
  • 從多張紙到一張的數據收集(PLEX 插件)

 

發表評論