将 Excel table 转换为列表跳过空白值

Transform Excel table into list skipping blank values

很遗憾,我还没有在网上找到解决方案 - 希望有人可以帮助我解决以下问题:

我的输入是一个exceltable,如下所示:

|         |   Jan   |  Feb    |  Mar    |  Apr    | 
| Topic 1 |   yes   |         |  yes    |         | 
| Topic 2 |         |  yes    |         |         | 
| Topic 3 |   yes   |         |         |  yes    | 
| Topic 4 |         |         |         |  yes    | 

我想要的输出是一个列表,其中消除了所有空白元素。它应该是这样的:

|         |   Jan   |  Feb    |  Mar    |  Apr    | 
|         | Topic 1 | Topic 2 | Topic 1 | Topic 3 | 
|         | Topic 3 |         |         | Topic 4 | 

谁知道如何做到这一点?我考虑了一下枢轴 table 但没能做到。

PS:我可以轻松处理中间步骤,将输入 table 中的 yes 替换为相应的 Topic *,但我无法执行跳过空格的第二步。

Select 适当的范围,主页 > 编辑,查找并 Select,转到特殊...,空白,select 其中之一 selected,删除...,向上移动单元格,确定。

对于公式解决方案,假设您的数据在 A1:E5 中,首先将月份复制到新的水平范围内,然后在 Jan 下面的单元格中输入以下公式作为 array-formula 通过按住 ctrl+shift 的同时点击 enter。 (如果操作正确,Excel 将在公式栏中的公式周围放置大括号 {...}

=IFERROR(INDEX($A:$A,SMALL((B:B="yes")*ROW($A:$A),ROWS(:1)+COUNTBLANK(B:B))),"")

适当调整单元格引用,但保留公式中所示的寻址方法。

然后向右下方拖动。

如果我们开始于:

我们可以先替换"yes"s。然后去掉空格。然后清除第一列。我们运行宏MAIN

Sub MAIN()
    Call step1
    Call step2
    Call step3
End Sub

Sub step1()
    For Each r In ActiveSheet.UsedRange
        If r.Value = "yes" Then
            r.Value = Cells(r.Row, 1).Value
        End If
    Next r
End Sub

Sub step2()
    Dim r As Range
    Set r = ActiveSheet.UsedRange.Cells.SpecialCells(xlCellTypeBlanks)
    r.Delete (xlShiftUp)
End Sub

Sub step3()
    Range("A:A").Clear
End Sub

生产: