将数据从一个工作表(数据)复制到另一个工作表(摘要)

时间:2015-09-22 15:13:25

标签: excel excel-vba vba

我正在尝试使用另一个工作表(数据)中保存的大型数据转储中的数据填充一个工作表(摘要)。

这将发送给我的组织内的预算持有人,他们将能够过滤他们的成本中心并查看他们的员工组。

摘要工作表
其结构如下:

|   |    A     |      B      |     C     |      D      |
| 1 | Please choose a cost centre:         [Textfield] |
| 2 |          |             |           |             |
| 3 | POSITION | STAFF GROUP | PAY GRADE |             |
| 4 | [Data will go here]
| 5 | [Data will go here]
| 6 | [Data will go here]

数据工作表
其结构如下(尽管有3,600行而不是4行):

|   |    A         |      B      |     C     |      D      |
| 1 | POSITION     | STAFF GROUP | PAY GRADE | COST CENTRE |
| 2 | Typist       | A&C         | Junior    | 3000        |
| 3 | Manager      | A&C         | Mgmt      | 3200        |
| 4 | Typist       | A&C         | Junior    | 3000        |
| 5 | Receptionist | A&C         | Junior    | 3000        |

考试问题
使用文本字段选择成本中心3000,如何使用 Data 工作表中的两行数据填充摘要工作表?几乎就像你可以通过 pivot 表一样。这可以用公式完成还是需要VBA?

1 个答案:

答案 0 :(得分:0)

方法#1

这是实现过滤器的公式方式。

在摘要表上,选择范围A4:C22

单击工作表顶部的公式栏并粘贴以下公式:

=IFERROR(INDEX(Data!A2:C22,SMALL(IF($D$1=Data!$D$2:$D$22,ROW(Data!$D$2:$D$22)-ROW(Data!$D$2)+1),ROW()-3),{1,2,3}),"")
  

这是一个数组公式,必须使用 Ctrl + Shift + Enter 确认。

现在,当您更新单元格D1中的值时,将显示已过滤的结果。

注意:这假设您的过滤结果不会超过20个。如果该假设不正确,那么在确认数组公式之前,您需要选择更深的范围。

注意:这假设数据表上的数据不会比第22行向下延伸。如果数据有,则将公式中22的引用更改为更大的数字。

方法#2

这是VBA解决方案。

将以下程序放在标准代码模块中:

Public Sub Barry()

    Const DATA = "data!a1"
    Const OUTPUT = "a3:c3"
    Const FILTER_VALUE_ADDRESS = "d1"
    Const FILTER_COLUMN = 4

    Dim rCrit As Range, rData As Range

    Set rData = Range(DATA).CurrentRegion
    Set rCrit = rData.Resize(2, 1).Offset(, rData.Columns.Count + 2)
    rCrit(1) = rData(1, FILTER_COLUMN): rCrit(2) = Range(FILTER_VALUE_ADDRESS)
    rData.AdvancedFilter xlFilterCopy, rCrit, Range(OUTPUT)
    rCrit.Clear

End Sub

切换到摘要表并按Alt-F8以显示宏对话框。

运行Barry