动态公式或vba将垂直列表偏移一个,并将列表底部移到顶部?

时间:2015-06-18 20:01:34

标签: excel vba excel-vba excel-formula

这是我要做的事情,我有一张表,其中包含一个名称列表,其中没有重复长度不同的名称。我希望有一个公式或vba子,让下一行复制原始的名称列表并将其偏移到我的一个,以便原始的顶级名称现在是第二个列表的姓氏。我需要在末尾10列表中没有相同的名称在同一行。

以下是我喜欢的样子。

ColumnB   ColumnC   ColumnD   ColumnE
Name1     Name2     Name3     Name4
Name2     Name3     Name4     Name1
Name3     Name4     Name1     Name2
Name4     Name1     Name2     Name3

与Sudoku游戏一样,每行或每列中的名称都不会有重复。

我不确定如何最好地实现这一目标,因为如上所述,列表的长度是一个变量。理想情况下,我想创建第一个列表,然后让另外9个列表自动填充。有什么建议吗?

EDIT ___________________ @Paul Drye,我的公式得到以下结果

ColumnB   ColumnC   ColumnD   ColumnE
Name1     Name2     Name3     Name4
Name2     Name3     Name4     Name1
Name3     Name4     Name1     Name1
Name4     Name1     Name1     Name1

如您所见,最后两列开始显示问题。

3 个答案:

答案 0 :(得分:2)

如果公式有效,您只需使用

即可获得此结果
=IF(ISBLANK(B3),B$2,B3)
假设您的数据在C2中开始,请在单元格B2

。然后,在选择要占用的整个单元格范围后,可以使用 CTRL + R,CTRL + D 向下复制或填充此内容。

如果副本正确,则单元格K11的公式为:

=IF(ISBLANK(J12),J$2,J12)

图片显示B列中的输入,其余为此公式

results of formula

这个公式或多或少有效,因为绝对行引用确保如果我们位于列表的末尾,则使用第2行的值。

答案 1 :(得分:2)

如果您希望公式无论您的数据周围是什么都有效,您可以使用ROWSCOLUMNSMOD以及一些绝对/相对范围获得相同的结果。

单元格C2中的公式向下和向下复制。使用命名范围可能看起来好一些。如果您想了解它如何生成数字,请移除INDEX并获取计数器。

=INDEX($B$2:$B$11,MOD(ROWS($C$2:C2)+COLUMNS($C$2:C2)-1,COUNTA($B$2:$B$11))+1)

图片显示与其他答案相同的结果

results and formula

答案 2 :(得分:1)

假设您的列表以A1开头,请在B1中尝试:

=IF(A2="",IF(ISERR(OFFSET(A$1,-1,0)),A$1, A$1),A2)

然后,您可以将其向下和跨列复制以获取剩余数据。如果您复制它,或者如果您将更多列复制到右边而不是数据片段,则公式会有参考问题,但除此之外它就可以解决问题。

基本上它说“看一个左边的单元格和一个向下的单元格,除非那个单元格是空白的,否则给我那个。在这种情况下,请给我列中的第一个项目。”