VB 代码,用于复制数据透视过滤数据 ID 并将其粘贴到匹配的工作表名称中

真假

我有一个包含以下列和值的 Excel 表:

手动分离数据之前的主表:所有年份的工作簿

姓名 项目编号 期间 小时 总成本
1001 2019年 100 50000
1002 2019年 100 50000
1002 2020年 90 70000
1003 2020年 10 30000
1004 2020年 10 30000

数据年度分离后的主表:工作簿 2020

姓名 项目编号 期间 小时 总成本
1002 2020年 90 70000
1003 2020年 10 30000
1004 2020年 10 30000

我的 excel 包含 10000 多行这样的。

现在,我做一个数据透视表并在数据透视表的过滤器部分应用项目 ID,并按以下方式排列剩余的 3 列:

按项目ID过滤后的数据透视表列格式如下:

姓名 预订时间 总成本

现在有了这些数据,以下是我实现所需结果的步骤:

  1. 按年份分隔工作簿,并根据 ProjectID 号在每个工作簿内创建单独的 excel 工作表。
  2. 我根据主表中的所有唯一项目 ID 创建表。工作表的名称是项目 ID(例如 - 我的工作表名称将为 1001、1002、1003 等)
  3. 我想根据项目 ID 复制数据透视过滤数据并将其放入相应的工作表名称中。

我已经做了,第 1 步。在 excel 中的数据过滤器选项的帮助下手动完成,第 2 步。使用下面的 VB 代码:

Sub AddSheets()
'Updateby Extendoffice
    Dim xRg As Excel.Range
    Dim wSh As Excel.Worksheet
    Dim wBk As Excel.Workbook
    Set wSh = ActiveSheet
    Set wBk = ActiveWorkbook
    Application.ScreenUpdating = False
    For Each xRg In wSh.Range("A1:A93")
        With wBk
            .Sheets.Add After:=.Sheets(.Sheets.Count)
            On Error Resume Next
            ActiveSheet.Name = xRg.Value
            If Err.Number = 1004 Then
              Debug.Print xRg.Value & " already used as a sheet name"
            End If
            On Error GoTo 0
        End With
    Next xRg
    Application.ScreenUpdating = True
End Sub

这是我需要代码帮助的地方,第 3 步 - 我想根据项目 ID 复制数据透视数据并将其放入相应的工作表名称中。

例如 - 我的 VB 代码需要过滤项目 ID 1001 的透视数据并复制名为 1001 的工作表中的 A 行。我的代码需要对所有唯一的项目 ID 重复此操作。

我搜索了此类类似的示例,但找不到可以实现此目的的工作代码。

如果有人可以帮助我,那就太好了。

提前致谢。

CDP1802

在工作簿中运行此操作,其中一张名为“Master”的工作表包含 A 到 E 列中的数据。数据透视表和项目工作表将由宏创建。

Option Explicit

Sub macro()

    Const SHT_MASTER = "Master"
    Const SHT_PIVOT = "PivotdataOfMasterSheet"
    Const COL_ID = "B" ' project id
    Const PERIOD = 2020

    Dim wb As Workbook
    Dim ws As Worksheet, wsPivot As Worksheet, wsPrj As Worksheet
    Dim iLastRow As Long, iRow As Long, n As Integer
    Dim rng As Range, tbl As PivotTable
  
    Set wb = ThisWorkbook
    ' check if any existing sheets and delete
    For Each ws In wb.Sheets
       If ws.Name = SHT_MASTER Then
       Else
           ws.Delete
       End If
    Next

    Set ws = wb.Sheets(SHT_MASTER)
    iLastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row

    ' build list of projects
    Dim dict As Object, key
    Set dict = CreateObject("Scripting.Dictionary")
    For iRow = 2 To iLastRow
        key = Trim(ws.Cells(iRow, COL_ID))
        If Not dict.exists(key) Then
            dict(key) = 1
        End If
    Next
 
    ' pivot range
    Set rng = ws.Range("A1").Resize(iLastRow, 5) ' col A to E

    ' create pivot on neq sheet
    Set wsPivot = wb.Sheets.Add
    wsPivot.Name = SHT_PIVOT
    wb.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=rng, _
         Version:=xlPivotTableVersion14).CreatePivotTable _
         TableDestination:=wsPivot.Range("A3"), TableName:="PivotTable", DefaultVersion _
         :=xlPivotTableVersion14
    
    Set tbl = wsPivot.PivotTables("PivotTable")
    With tbl
        .AddDataField ActiveSheet.PivotTables( _
            "PivotTable").PivotFields("Hours"), "Sum of Hours", xlSum
        .AddDataField ActiveSheet.PivotTables( _
            "PivotTable").PivotFields("Total Cost"), "Sum of Total Cost", xlSum
        With .PivotFields("Name")
            .Orientation = xlRowField
            .Position = 1
        End With
        With .PivotFields("Period")
            .Orientation = xlPageField
            .Position = 1
        End With
        With .PivotFields("Project ID")
            .Orientation = xlPageField
            .Position = 1
        End With
    
        .PivotFields("Project ID").ClearAllFilters
        .PivotFields("Period").ClearAllFilters
        .PivotFields("Period").CurrentPage = PERIOD
    End With

    ' create sheet for each project
    n = wb.Sheets.Count
    For Each key In dict
        tbl.PivotFields("Project ID").CurrentPage = key
        Set wsPrj = wb.Sheets.Add(After:=wb.Sheets(n))
        wsPrj.Name = key
        n = n + 1
        wsPivot.UsedRange.Copy
        wsPrj.Range("A1").PasteSpecial xlPasteValues
        Application.CutCopyMode = False
        wsPrj.Columns("A:C").AutoFit
    Next

    MsgBox dict.Count & " sheets created", vbInformation

End Sub

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何基于该行中的单元格值复制特定行并将其粘贴到匹配的工作表中

使用Vlookup使用VBA复制数据并将其粘贴到单独的工作表中

如何复制附加在工作表上的图像并将其粘贴到新工作表中

基于数组复制整列并将其粘贴到同一工作簿中的工作表中

复制特定行的值并将其粘贴到具有相同 id 的多行中

从浏览器复制所有文本并将其粘贴到txt文件中并保存。VB脚本

在R中获取数据框的ID,并将文本从描述列粘贴到具有匹配ID的所有行中

从 Excel 文件中所有工作表的列中复制数据并将其粘贴到一张工作表中

从具有唯一ID的DIV中的<a>复制href并将其粘贴到该DIV中的其他位置

VBA:如果工作簿中的工作表名称等于从用户窗体中选择的组合框值,则复制该工作表并将其粘贴到另一个工作簿中

复制一列中的所有数字并将其粘贴到 ID 值 1 较小的行

从一张工作表复制数据并将其粘贴到另一张工作表上

复制数据并将其粘贴到R中

根据内容复制行并将其粘贴到根据行内容选择的不同工作表中

宏VBA根据标题复制列并将其粘贴到另一个工作表中

从范围复制单元格值并将其粘贴到另一个工作表的单行中

获取一个代码,该代码可以从多个工作表复制一个范围并将其粘贴到最终的工作表中,称为“所有调查”

从工作簿复制并将其粘贴到任何工作表

如果工作表1和工作表2中都存在值,则复制行,并将其粘贴到工作表3中。Google表格。Google Apps脚本

如何在Excel VBA中复制筛选数据范围并将其粘贴到新工作表中(不使用剪贴板)

根据匹配的ID复制和粘贴信息,其中一张工作表在数据透视表中有行

从Excel中的表中复制数据并将其粘贴到另一个表中

复制一个工作表中的单元格范围,并将其作为值而不是公式粘贴到另一个工作表中

如何从数据库表中提取数据并将匹配的范围粘贴到不同的表中

从打开的工作簿的指定工作表复制数据并将其粘贴到另一个已关闭工作簿的指定工作表

用户输入的源工作表名称,从源工作表复制数据,粘贴到目标工作表

仅从工作表复制最后一行并将其粘贴到另一工作表的最后一行

从一张纸复制数据并将该数据粘贴到所有工作表中

Excel VBA宏-从现有文件中的多个工作表中复制数据,并创建新文件并将所选数据粘贴到单独的工作表中