Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 1283|回复: 8

如何从总表中提取符合“报表日期”和“批次”的行到报表中

[复制链接]
发表于 2022-5-11 10:44 | 显示全部楼层 |阅读模式
本帖最后由 visionn 于 2022-5-11 10:47 编辑

报表日期
批次
2022.5.5
rlm1


如何从总表中提取符合“报表日期”和“批次”的行到报表中?已有按表头的顺序复制的代码。


总表:
序号报表日期批次标题3标题4
12022.5.5rlm13-14-1
22022.5.5rlm13-24-2
32022.5.5xaf13-34-3
42022.5.5xaf13-44-4
52022.5.9rlm13-54-5
62022.5.9rlm13-64-6
72022.5.9rlm13-74-7


报表:
序号报表日期批次标题4标题3
12022.5.5rlm14-13-1
22022.5.5rlm14-23-2
32022.5.5xaf14-33-3
42022.5.5xaf14-43-4
52022.5.9rlm14-53-5
62022.5.9rlm14-63-6
72022.5.9rlm14-73-7



Sub 筛选报表()
  Dim r%, i%
  Dim arr, brr
  Dim d As New Dictionary
  With Worksheets("报表")
    r = .Cells(.Rows.Count, 1).End(xlUp).Row
    c = .Cells(1, .Columns.Count).End(xlToLeft).Column
    If r > 1 Then
      .Range("a2").Resize(r - 1, c).ClearContents
    End If
    arr = .Range("a1").Resize(1, c)
    For j = 1 To c
      If Len(arr(1, j)) <> 0 Then
        d(arr(1, j)) = j
      End If
    Next
  End With
  With Worksheets("总表")
    r = .Cells(.Rows.Count, 1).End(xlUp).Row
    c = .Cells(1, .Columns.Count).End(xlToLeft).Column
    arr = .Range("a1").Resize(1, c)
    For j = 1 To c
      If Len(arr(1, j)) <> 0 Then
        If d.Exists(arr(1, j)) Then
          .Cells(2, j).Resize(r - 1, 1).Copy Worksheets("报表").Cells(2, d(arr(1, j)))
        End If
      End If
    Next
  End With
End Sub

按指定条件复制报表.zip (11.19 KB, 下载次数: 6)
发表于 2022-5-11 12:45 | 显示全部楼层
本帖最后由 hasyh2008 于 2022-5-11 12:51 编辑

Sub 筛选报表()
  Dim Arr(), Brr(1 To 10000, 1 To 5)
  Dim Dic
  Dim Rc%, K%
  Sheet2.Range("A2:E10000").ClearContents
  Set Dic = CreateObject("scripting.dictionary")
  Arr = Sheet1.Range("A1").CurrentRegion
  Dic(Sheet3.Range("A3") & Sheet3.Range("B3")) = ""
  K = 1
  For Rc = 2 To UBound(Arr)
    If Dic.Exists(Arr(Rc, 2) & Arr(Rc, 3)) Then
      Brr(K, 1) = K: Brr(K, 2) = Arr(Rc, 2): Brr(K, 3) = Arr(Rc, 3)
      Brr(K, 4) = Arr(Rc, 4): Brr(K, 5) = Arr(Rc, 5)
      K = K + 1
    End If
  Next Rc
  Sheet2.Range("A2").Resize(K, 5) = Brr
End Sub

按指定条件复制报表.rar

19.03 KB, 下载次数: 2

回复

使用道具 举报

发表于 2022-5-11 14:10 | 显示全部楼层
Sub 筛选报表()
  Dim Arr(), Brr(1 To 10000, 1 To 5)
  Dim Rc%, K%
  Sheet2.Range("A2:E10000").ClearContents
  Arr = Sheet1.Range("A1").CurrentRegion
  K = 1
  For Rc = 2 To UBound(Arr)
    If Arr(Rc, 2) & Arr(Rc, 3) = Sheet3.Range("A3") & Sheet3.Range("B3") Then
      Brr(K, 1) = K: Brr(K, 2) = Arr(Rc, 2): Brr(K, 3) = Arr(Rc, 3)
      Brr(K, 4) = Arr(Rc, 4): Brr(K, 5) = Arr(Rc, 5)
      K = K + 1
    End If
  Next Rc
  Sheet2.Range("A2").Resize(K, 5) = Brr
End Sub
回复

使用道具 举报

 楼主| 发表于 2022-5-12 12:30 | 显示全部楼层
报表列的顺序和总表不同
原过程可以实现在报表中,按照列的名称把全部总表数据提取到报表,但是不知道如何按照条件获取数据
下面是新的附件,有很多列,列的顺序不同

按指定条件复制报表 的副本.zip

40.36 KB, 下载次数: 5

回复

使用道具 举报

 楼主| 发表于 2022-5-12 12:31 | 显示全部楼层
hasyh2008 发表于 2022-5-11 14:10
Sub 筛选报表()
  Dim Arr(), Brr(1 To 10000, 1 To 5)
  Dim Rc%, K%

非常感谢,但是有35列,并且列的顺序不同,请老大费心如何修改这个过程
回复

使用道具 举报

发表于 2022-5-12 13:46 | 显示全部楼层
本帖最后由 hasyh2008 于 2022-5-12 13:54 编辑

Sub 筛选报表()
  Dim Arr()
  Dim Rc%, K%, Cl%
  Sheet2.Range("A1").CurrentRegion.ClearContents
  Sheet1.Range("A1:AZ1").Copy Sheet2.Range("A1")
  Sheet2.Range("A1") = "序号"
  Arr = Sheet1.Range("A1").CurrentRegion
  Dim Brr(1 To 10000, 1 To 50)
  K = 1
  For Rc = 2 To UBound(Arr)
    If Arr(Rc, 2) & Arr(Rc, 3) = Sheet3.Range("A3") & Sheet3.Range("B3") Then
      Brr(K, 1) = K
      For Cl = 2 To UBound(Arr, 2)
        Brr(K, Cl) = Arr(Rc, Cl)
      Next Cl
      K = K + 1
    End If
  Next Rc
  Sheet2.Range("A2").Resize(K, UBound(Arr)) = Brr
End Sub

按指定条件复制报表 的副本.rar

37.01 KB, 下载次数: 1

评分

参与人数 1学分 +2 收起 理由
visionn + 2 学习了

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2022-5-12 20:16 | 显示全部楼层
hasyh2008 发表于 2022-5-12 13:46
Sub 筛选报表()
  Dim Arr()
  Dim Rc%, K%, Cl%

学习了,但是改变了列的顺序,报表的顺序不让改变。
回复

使用道具 举报

发表于 2022-5-12 23:05 | 显示全部楼层
本帖最后由 hasyh2008 于 2022-5-13 07:47 编辑

好变态的表格!!

Sub 筛选报表()
  Dim Arr1, Arr2, Brr, Str$
  Dim Rc%, Cl%, X%, ZY%, BY%, K%
  Arr1 = Sheet1.Range("A1").CurrentRegion
  Arr2 = Application.Transpose(Sheet1.Range("A1:AJ1"))
  Sheet2.Range("A2:AJ10000") = ""
  Brr = Sheet2.Range("B1:AJ1")
  Str = Sheet3.Range("A3") & Sheet3.Range("B3")
  K = 2
  For Rc = 2 To UBound(Arr1)
    If Arr1(Rc, 4) & Arr1(Rc, 2) = Str Then
      For Cl = 1 To UBound(Arr1, 2)
        ReDim Preserve Arr2(1 To 36, 1 To K)
        Arr2(Cl, K) = Arr1(Rc, Cl)
      Next Cl
      K = K + 1
    End If
  Next Rc
  If K = 2 Then Exit Sub
  Arr2 = Application.Transpose(Arr2)
  For BY = 1 To 35
    For ZY = 1 To 35
      If Brr(1, BY) = Arr2(1, ZY) Then
        For X = 1 To K - 1
          Arr2(X, 36) = Arr2(X, BY)
          Arr2(X, BY) = Arr2(X, ZY)
          Arr2(X, ZY) = Arr2(X, 36)
          Arr2(X, 36) = ""
        Next X
      End If
    Next ZY
  Next BY
  Sheet2.Range("B1").Resize(K - 1, 35) = Arr2
  For X = 2 To K - 1
    Sheet2.Cells(X, 1) = X - 1
  Next X
End Sub

按指定条件复制报表 的副本.rar

34.68 KB, 下载次数: 5

评分

参与人数 1学分 +2 收起 理由
visionn + 2 学习了,这段代码有很实用的功能

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2022-5-13 08:39 | 显示全部楼层
老大太厉害了!非常感谢您的热心帮助!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-6-16 13:28 , Processed in 0.313924 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表