我有很多电子表格,使用Microsoft Query将我们的ERP软件中的交易信息提取到Excel中,然后我们自动执行其他计算。最近我们升级了我们的ERP系统,但管理层决定将旧的数据库中的事务历史保留在新系统中。我仍然需要一些"滚动12个月"图表,但如果我只使用旧数据库,我会丢失新数据,如果我只使用新数据,我会错过过去11个月的数据。
有没有办法可以在Excel中编写查询以从旧数据库PartTran表中提取数据,并将其与新数据库PartTran表合并,而不是每次都用用户干预?例如,我不希望我的用户(如果可能)必须有两个查询,他们将这些查询复制并粘贴到一个Excel表中。表的模式(至少是我需要的列)具有相同的名称和定义。
答案 0 :(得分:0)
如果你想采取一些有趣的,hacky Excel方法,你可以在幕后为你的用户做“复制粘贴”位。给出两个类似的表OLD
和NEW
结构
+-----+------+-------+------------+
| id | foo | bar | date |
+-----+------+-------+------------+
| 95 | blah | $25 | 2015-06-01 |
| 96 | bork | $12 | 2015-07-01 |
| 97 | bump | $200 | 2015-08-01 |
| 98 | fizz | | 2015-09-01 |
| 99 | buzz | $50 | 2015-10-01 |
| 100 | char | ($1) | 2015-11-01 |
| 101 | mope | | 2015-12-01 |
+-----+------+-------+------------+
和
+----+-----+-------+------------+------+---------+
| id | foo | bar | date | fizz | buzz |
+----+-----+-------+------------+------+---------+
| 1 | cat | ($10) | 2016-01-01 | 285B | 1110111 |
| 2 | dog | $25 | 2016-02-01 | 27F5 | 1110100 |
| 3 | ant | $100 | 2016-03-01 | 1F91 | 1001111 |
+----+-----+-------+------------+------+---------+
...您可以将这两个数据集的数据与一些谨慎的excel魔法结合在一起,如下所示:
您的UNION
表(使用 alt + j + t + a 命名)应该有以下项目:
示例:
+---------+------------+------------+----+------+-----+------------+------+------+
| UnionId | SourceName | SourceRank | id | foo | bar | date | fizz | buzz |
+---------+------------+------------+----+------+-----+------------+------+------+
| 1 | OLD | | | | | | | |
| 2 | NEW | | | | | | | |
+---------+------------+------------+----+------+-----+------------+------+------+
然后,您将明智地使用Indirect()和VlookUp()来获取查找ID和列目标。下面的示例代码
SourceRank - 帮助列
=COUNTIFS([SourceName],[@SourceName],[UnionId],"<="&[@UnionId])
id - 来自原始DataSet的ID
=SMALL(INDIRECT([@SourceName]&"[id]"),[@SourceRank])
其他一切都只是VlookUp的疯狂!虽然我冒昧地复制下面的示例代码以供参考
foo =VLOOKUP([@id],INDIRECT([@SourceName]),MATCH(UNION[[#Headers],[foo]],INDIRECT([@SourceName]&"[#Headers]"),0),0)
bar =VLOOKUP([@id],INDIRECT([@SourceName]),MATCH(UNION[[#Headers],[bar]],INDIRECT([@SourceName]&"[#Headers]"),0),0)
日期 =VLOOKUP([@id],INDIRECT([@SourceName]),MATCH(UNION[[#Headers],[date]],INDIRECT([@SourceName]&"[#Headers]"),0),0)
fizz =VLOOKUP([@id],INDIRECT([@SourceName]),MATCH(UNION[[#Headers],[fizz]],INDIRECT([@SourceName]&"[#Headers]"),0),0)
动态更新 =VLOOKUP([@id],INDIRECT([@SourceName]),MATCH(UNION[[#Headers],[fizz]],INDIRECT([@SourceName]&"[#Headers]"),0),0)
您可能希望谨慎使用If()
和/或IfError()
来帮助您的用户忽略对旧表的新列引用以及那些还没有数据的行。但是,如果没有这个,你最终会得到类似下面的内容。
这是准备接受&amp;读取OLD
和NEW
DataSet的新输入,可以排除那些讨厌的占位符行......
希望这有帮助!快乐的编码!