Excel VBA-根据单独的范围值复制非空白单元格值

时间:2019-03-06 20:28:37

标签: excel

我有一个包含两千行发票信息的电子表格,并且为数据提供了不完整的采购订单信息。我正在尝试根据发票填充购买信息,因为发票的至少一行将包含采购订单号。我想使用VBA,因为我计划将其用作较大的宏的一部分,以便自动格式化和更新报告。

原始数据示例:

+---------+----------------+
| Invoice | Purchase Order |
+---------+----------------+
| 1000    | -              |
+---------+----------------+
| 1000    | 1234           |
+---------+----------------+
| 1000    | 1234           |
+---------+----------------+
| 1000    | -              |
+---------+----------------+
| 2000    | 4321           |
+---------+----------------+
| 2000    | -              |
+---------+----------------+
| 2000    | -              |
+---------+----------------+
| 3000    | -              |
+---------+----------------+
| 3000    | -              |
+---------+----------------+
| 3000    | 9876           |
+---------+----------------+

我想要输出的内容:

+---------+----------------+
| Invoice | Purchase Order |
+---------+----------------+
| 1000    | 1234           |
+---------+----------------+
| 1000    | 1234           |
+---------+----------------+
| 1000    | 1234           |
+---------+----------------+
| 1000    | 1234           |
+---------+----------------+
| 2000    | 4321           |
+---------+----------------+
| 2000    | 4321           |
+---------+----------------+
| 2000    | 4321           |
+---------+----------------+
| 3000    | 9876           |
+---------+----------------+
| 3000    | 9876           |
+---------+----------------+
| 3000    | 9876           |
+---------+----------------+

我已经搜索了很多解决方案,但是我运气不高,无法找到适合此需求的东西。

2 个答案:

答案 0 :(得分:0)

完成此任务的许多方法。以下是没有VBA的情况。

步骤1:首先,按照表格的A列(升序)+ B列(升序)对表格进行排序。这可以带你到这里:

after ordering

步骤2:使用此公式添加第三列:

=IF(B2<>"-",B2,C1)

第3步:将其复制到所有行中。

结果:

Result

注意:如果更改A和B的排序,C列中的结果会混乱。如果不可避免,请在更改C列的值之前复制并粘贴(即删除公式)。排序顺序。

答案 1 :(得分:0)

我敢肯定,有一种更高级的方法可以做到这一点,但这可以使您开始进入Power Query领域。

将数据放在名为Table1的表中。单击表中的单元格,然后在功能区的From Table区域中单击Get and Transform

出现查询编辑器时,通过高级编辑器输入以下内容:

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Invoice", Int64.Type}, {"Purchase Order", type any}}),
    #"Merged Queries" = Table.NestedJoin(#"Changed Type",{"Invoice"},Filtered,{"Invoice"},"Table1 (2)",JoinKind.LeftOuter),
    #"Expanded Table1 (2)" = Table.ExpandTableColumn(#"Merged Queries", "Table1 (2)", {"Purchase Order"}, {"Purchase Order.1"}),
    #"Removed Columns" = Table.RemoveColumns(#"Expanded Table1 (2)",{"Purchase Order"})
in
    #"Removed Columns"

使用这种方法,您将需要创建一个重复的查询,以便可以合并数据并填补所有空白。右键单击第一个查询,然后选择Duplicate Query

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Invoice", Int64.Type}, {"Purchase Order", type any}}),
    #"Filtered Rows" = Table.SelectRows(#"Changed Type", each ([Purchase Order] <> "-"))
in
    #"Filtered Rows"

最终结果是一张表格,其中所有空白均被填充。