问题描述
你好 stackoverflow 社区!这是我在这里的第一篇文章,所以要温柔!
我一直在努力使命名系统自动化,以便在我工作的公司创建新产品。我们经常推出新的 SKU,因此我想让新商品尽可能轻松地与我们当前的系统配合使用。
这是我想要完成的: 我们有不同的产品类型、大小、口味和比例。我希望能够根据输入到表格中的信息生成我们生产的所有不同产品的列表。 例如,如果我们想添加一个浴缸炸弹,我们可能有一个小的和一个大的,比如说 50 克和 150 克。我们可能还会有几种不同的气味,例如一种带有薰衣草味,一种带有没药味。所以基于这样输入的信息:
姓名 | 气味 1 | 气味 2 | 尺寸 1 | 尺寸 2 |
---|---|---|---|---|
沐浴炸弹 | 薰衣草 | 没药 | 50g | 150g |
我想生成这样的列表:
沐浴炸弹,薰衣草,50g
沐浴炸弹,薰衣草,150g
沐浴炸弹,没药,50g
沐浴炸弹,没药,150g
(不必与上面显示的顺序相同)
我遇到的问题如下: 我们的一些产品可能有 2 种尺寸,而其他产品可能有更多,与口味/比例相同。 因此,我的桌子上有很多空白点(因为尺寸 2 可能无法填充只有一种尺寸的物品) 我目前正在尝试基于行创建每个可能组合的矩阵,但我不知道如何在不花费数小时使用 ISBlank 设置 TextJoin 函数来摆脱任何试图引用空单元格的行的情况下做到这一点。>
任何帮助将不胜感激!
更新:为了更好地展示我正在尝试做的事情,下面的图片显示了一个表格示例,其中包含我在其下方手动创建的列表:
解决方法
如果我已经很好地理解了目标,那么您正在尝试进行嵌套逆枢轴旋转(标准化或熔化)。您嵌套了两个属性:Scents 和 Sizes,但听起来可能还有更多 - 如果是这样,则可以在以下逻辑中推广此方法:
您正在按气味取消旋转尺寸,然后按名称取消旋转该结果除了气味可以为空。随着我们的进行,这将更加清晰。
如果这是输入数据:
那么这将是预期的输出结果删除空白大小:
请注意,除锈剂没有气味/味道,但包括在内, 而空白大小的行将根据上述规则删除。
在这种情况下,我看到了两种方法(不包括 VBA):
- PowerQuery - 需要 Excel for Windows 2010+
- 动态数组公式 - Windows 或 Mac 需要 Excel 2019 或 365
由于 PowerQuery 非常简单,我将首先提出建议。如果它不适合你,那么动态数组方法可能会很有趣,如果你有正确的 Excel 版本,但它需要更多的时间来构建和测试(在我这边)。
Power Query 方法
这可能看起来令人生畏,但需要的时间很少,只需很多 点击的。 5 分钟 - 上衣
首先,将上面的表格转换为 Excel 表格 - 您可以单击其中的任意位置并按 CTRL t。它会询问您的表格是否有标题 - 是的,有。
现在转到表格设计标签,您可以在左侧重命名表格。我将其命名为prodTable。
现在转到数据标签并点击从范围/表格。
这将打开 Power Query 编辑器,如下所示:
我只是想在这里粘贴 PowerQuery M 语言脚本,让你把它放在你的机器上,但如果你的表与我的模型不匹配,它就会失败,所以我们需要显示步骤。
>1) Unpivot Scents
按住 CTRL 键并选择气味列,然后在转换选项卡中选择逆透视列。
双击该列上的值标题并将其重命名为“气味”。右键单击“属性”列并将其删除。
2) 旋转尺寸
现在对尺寸重复这些步骤。按住 CTRL 键并选择大小列,然后在转换选项卡中选择逆透视列。
双击该列上的值标题并将其重命名为“大小”。右键单击“属性”列并将其删除。
在这一点上,你有你所描述的,
但是你说你想要一个文本连接的名字,所以让我们在这里添加:
3) 创建合并名称
按住 CTRL 键并按照您希望它们出现在文本连接中的顺序选择三列。然后在添加列标签中选择合并列。
它会问你想要什么分隔符 - 我只是使用了管道字符。它还会询问您想为该列命名什么 - 我选择了 SKU 名称。
4) 将其加载到 Excel 中
现在,您只需将其移回 Excel。转到主页标签,然后选择关闭并加载到。
然后告诉它您要将其加载到新工作表中 - 这是最简单的。
现在您将拥有一个名为 prodTable 的新工作表,它将包含您转换后的产品表。这都是一次性设置。从现在开始,当用户创建新组合时,您只需要通过右键单击它并刷新来刷新表 - PowerQuery 将执行您刚刚创建的 M 脚本,并将根据用户的输入生成所有 SKU .
如果您有 Excel for Mac 或者您希望它基于公式,请在评论中大喊大叫。我所知道的使用动态数组执行此操作的唯一方法需要 Excel 2019,因为它将严重依赖 SEQUENCE 和 LET。我已经完成了逆枢轴/熔化,但嵌套熔化需要一些思考。
另一种方法
这是一个 M 脚本,您可以将其加载到 PQ 高级编辑器中,它基本上可以为您提供您想要的东西,没有气味/味道,但有尺寸。它没有处理您想要的所有嵌套属性,不幸的是,每次添加属性时都必须重写它,但它可以让您了解该方法:
let
Source = Excel.CurrentWorkbook(){[Name="prodTable"]}[Content],#"Changed Type" = Table.TransformColumnTypes(Source,{{"Name",type text},{"Scent 1",{"Scent 2",{"Size 1",{"Size 2",type text}}),#"Replaced Value" = Table.ReplaceValue(#"Changed Type",null,"WASNULL",Replacer.ReplaceValue,{"Scent 1"}),#"Unpivoted Columns" = Table.UnpivotOtherColumns(#"Replaced Value",{"Name","Size 1","Size 2"},"Attribute","Value"),#"Renamed Columns" = Table.RenameColumns(#"Unpivoted Columns",{{"Value","Scents"}}),#"Removed Columns" = Table.RemoveColumns(#"Renamed Columns",{"Attribute"}),#"Unpivoted Columns1" = Table.UnpivotOtherColumns(#"Removed Columns","Scents"},#"Renamed Columns1" = Table.RenameColumns(#"Unpivoted Columns1","Sizes"}}),#"Removed Columns1" = Table.RemoveColumns(#"Renamed Columns1",#"Replaced Value1" = Table.ReplaceValue(#"Removed Columns1",{"Scents"}),#"Inserted Merged Column" = Table.AddColumn(#"Replaced Value1","SKU Name",each Text.Combine({[Name],[Scents],[Sizes]},"|"),type text)
in
#"Inserted Merged Column"
我试图使属性动态化,但是如果不进行大量 ETL,这会变得很困难。不知何故,你的目标似乎触手可及。您生成所有可能组合的想法可行,但需要进行大量设置才能实现您想要的规则。