4

(替代标题:为什么 Excel 不借助 VB 不支持带参数的用户定义公式以及随之而来的问题?)。

[更新以澄清我的问题]

在 excel 中,当您定义表格时,它往往会自动复制列中的公式。这很像“填充”。

但是......如果您需要规则的例外情况怎么办?

在我正在构建的表格中进行一些计算,第一行在某种程度上往往是“特殊的”。所以,我想要自动填充,但不是在第一行,也不是在标记为自定义的单元格上。Excel 文档在计算列中提到了异常,但仅用于参考查找它们并消除它们。

例如,第一行计算初始值,所有剩余的行计算一些增量变化。一个简单的例子 - 1 列和 4 行的表:

    A
1 Number
2 =42
3 =A2+1
4 =A3+1

第一个公式必须与其他公式不同。这将创建一个简单的编号列表,其中 A2=42、A3=43、A4=44。但是现在,假设我想将其更改为增加 2 而不是 1。如果我将 A3 编辑为“A2+2”,Excel 会将表格更改为:

    A
1 Number
2 =A1+2
3 =A2+2
4 =A3+2

这当然被破坏了——它应该允许 A2 继续成为一个特例。

这不是一个非常普遍的要求(例外 - 特别是在表格的第一行)吗?

4

3 回答 3

4

如果您将数据格式化为表格,您可以使用表格公式(例如 [@ABC])而不是 A1 格式(例如 A1、$C2 等)。但是有两个技巧需要考虑。

首先,上一行没有表格公式语法,相反,excel 将默认返回 A1 格式,但您可以使用偏移公式将当前单元格移动到上一行,如下所示。但是在这种情况下,它会返回一个 # 值错误,因为我不能 +1 到“ABC”。

     ABC
1   =OFFSET([@ABC],-1,0)+1
2   =OFFSET([@ABC],-1,0)+1
3   =OFFSET([@ABC],-1,0)+1
4   ....

所以第二个技巧是使用 if 语句来初始化值,购买检查前一行值是否 = 标题值。如果相同,则使用初始值,否则添加增量。注意假设表名为 Table1

     ABC
1   =IF(OFFSET([@ABC],-1,0)=Table1[[#Headers],[ABC]],42,OFFSET([@ABC],-1,0)+1)
2   =IF(OFFSET([@ABC],-1,0)=Table1[[#Headers],[ABC]],42,OFFSET([@ABC],-1,0)+1)
3   =IF(OFFSET([@ABC],-1,0)=Table1[[#Headers],[ABC]],42,OFFSET([@ABC],-1,0)+1)
4   ....

请注意,您可以将初始值设置为表格外的单元格,以定义初始值(例如 $A$1)和增量(例如 $A$2),如下所示

     ABC
1   =IF(OFFSET([@ABC],-1,0)=Table1[[#Headers],[ABC]],$A$1,OFFSET([@ABC],-1,0)+$A$2)
2   =IF(OFFSET([@ABC],-1,0)=Table1[[#Headers],[ABC]],$A$1,OFFSET([@ABC],-1,0)+$A$2)
3   =IF(OFFSET([@ABC],-1,0)=Table1[[#Headers],[ABC]],$A$1,OFFSET([@ABC],-1,0)+$A$2)
4   ....

我一直使用这个 IF OFFSET 组合在表中进行迭代和循环。

如果您有很多列需​​要确定它们是否是第一行,您可以在第一行进行一列测试,其余的可以使用更简单的 if。例如,ABC 将为第一行给出 true 为其他行 false,然后 DEF 增加初始值

     ABC                                            DEF
1   =OFFSET([@ABC],-1,0)=Table1[[#Headers],[ABC]]   =IF([@ABC],$A$1,OFFSET([@DEF],-1,0)+$A$2)
2   =OFFSET([@ABC],-1,0)=Table1[[#Headers],[ABC]]   =IF([@ABC],$A$1,OFFSET([@DEF],-1,0)+$A$2)
3   =OFFSET([@ABC],-1,0)=Table1[[#Headers],[ABC]]   =IF([@ABC],$A$1,OFFSET([@DEF],-1,0)+$A$2)
4   ....

希望有帮助

于 2014-03-14T00:48:22.520 回答
2

我不知道您是否正在寻找像锁定公式这样简单的东西。您可以通过突出显示您不想更改的公式部分然后按 F4 来做到这一点。这将绝对表格的这一部分,使用 $ 表示它,并且在您将其复制/粘贴到表格中时不会更改。

或者,您可以使用定义的名称。这些您可以在“数据”选项卡中设置,基本上将某些内容分配给名称或变量,然后您可以将其放入公式中。这些可以很简单,就像将另一张纸上的单元格轻松引用到极其复杂的多页表格一样。

于 2013-06-05T20:44:41.763 回答
1

通常,要处理包含多列的表的第一行中的“异常”公式,您只需在此处手动输入它,然后只填写下面的行。但是,如果您有更多的“异常”案例分散在各处,您将需要另一列具有 0/1 值的列,指示异常在哪里。然后你if(condition, formula_if_true, formula_if_false)到处使用。

      A                  B
    Number          Exceptional?
1   if(C1,42,A1+1)       0
2   if(C2,42,A2+1)       1
3   if(C3,42,A3+1)       0

尽管我喜欢 Excel,尽管它是整个 MS 的最佳产品,但它仍然是一个薄弱的工具。仅供参考,您可以在此处快速学习现代和强大的脚本语言,例如 Ruby,并且再也不会被电子表格特性所困扰。

于 2013-06-06T22:41:31.667 回答