如何在 Excel 中从层次结构生成父/子列

问题描述 投票:0回答:1

我需要使用 VBA 脚本或列公式将 Excel 文件中的层次结构转换为父/子列。

例如这是起始文件,其中子文件是从左到右的第一个非空白条目,父文件是从 1 个单元格向上到子文件左侧的第一个非空白条目:

Starting File

我需要一种方法(VBA?)将列 D-I 转换为列 B 和 C(并将 K 列添加为 A 列)

所以输出将是:

Output File

我最大的困难是像 H6、7 和 8 这样的东西都有父代 G5,而 G5、9 和 12 都有父代 F4。

步骤(至少在我的脑海中,如果使用 VBA - 尽管我可能会感到困惑/过于复杂):

  1. 从 K3 开始(根仅作为其他条目的父项)
  2. 将K3粘贴到A3中
  3. 从 D3-I3(本例中为 E3)找到第一个非空白条目并将其复制/粘贴到 C3(子级)
  4. 从E3开始,向左1列,然后找到向上的第一个非空白条目(D2)并将其复制粘贴到B3(父级)
  5. 返回到该行 (K3) 的起点,向下移动 1 行并重复直到条目末尾(在列表耗尽之前 K 列永远不会为空)

如果有一种基于公式的方法可以做到这一点,我非常乐意使用它,因为它可能更容易实现?

提前致谢。

excel vba excel-formula
1个回答
0
投票

您可以填写以下一组公式,无需使用 VBA。 (这些可能无法在早期版本的 Excel 中运行)

所有公式都将写入工作簿的第 3 行

A 列相当简单:

=$K3

B 列和 C 列有点难,请使用

TAKE
函数
TOCOL
函数
CHOOSECOLS
函数

B 栏:

=TAKE(TOCOL(CHOOSECOLS($D$1:$I2, MATCH($C3, $D3:$I3, 0)-1), 3), -1)

C 栏:

=TAKE(TOCOL($D3:$I3, 3), 1)

(C 列的替代方案可以是

=TEXTJOIN("", TRUE, $D3:$I3)

C 列仅获取当前行,使用

TOCOL
删除所有空白单元格或错误值,然后使用
TAKE
返回第一个剩余条目。

然后,

B 列查看哪一列包含 C 列中的值(使用

MATCH
),获取 前一列(使用 CHOOSECOLS
),并使用 
TOCOL
 删除所有空白单元格或错误值。  然后它使用 
TAKE 返回 last
 剩余条目(因此它是 
-1
:负数从末尾向后计数)

如果您想在 VBA 中使用这些,您可以设置

Range.Formula

,然后设置 
Calculate
 范围(或工作表),最后设置 
Range.Value = Range.Value
 来“展平”数据。

© www.soinside.com 2019 - 2024. All rights reserved.