Mik*_*ike 5 worksheet-function microsoft-excel microsoft-excel-2016
我正在尝试使用 13 张纸为我的个人预算设置预算工作簿,其中 1 张用于总计,另外 12 张用于每个月。我终生无法弄清楚为什么当我在其中一张月表中插入一行时我的公式会发生变化。这是我拥有的公式之一的示例:
=SUMIF(JUN!$G$2:$G$500,"Utilities", JUN!$D$2:$D$500)
Run Code Online (Sandbox Code Playgroud)
如果我在工作表的顶部插入一行,它会将两个增加到三个,从而取消计算。有什么办法可以锁定公式根本不改变吗?这是令人难以置信的令人沮丧。
您需要了解的是,由 指定的绝对引用的绝对性$不是绝对绝对的 ;-)
既然那个绕口令不碍事,让我解释一下。
绝对性仅适用于复制粘贴或填充公式时。在绝对引用范围的上方插入行或向左插入列将“移动”范围的地址,以便范围指向的数据保持不变。
此外,在范围中间插入行或列将扩展它以包含新的行/列。因此,要“增加”的数据行的范围内(表),你需要插入后的第一个数据行。
允许在当前数据范围上方添加数据行的最简单方法是始终具有标题行,并将标题行包含在实际范围中。这正是cybernetic.nomad在此评论中提出的解决方案。
但是,还剩下一个问题,那就是在表的末尾添加一行数据。仅在最后一行数据之后的行中键入新数据是行不通的。也不会在最后一行之后的行之前插入一行。
对此最简单的解决方案是使用特殊的“最后”行,将该行包含在数据范围内,并始终通过在该特殊行之前插入来追加新行。
我通常会降低行高并用适当的颜色填充单元格:
对于您的示例,完整的“最简单”公式将是:
=SUMIF(JUN!$G$1:$G$501,"Utilities",JUN!$H$1:$H$501)
Run Code Online (Sandbox Code Playgroud)
实现相同目标的另一种方法是使用动态公式,该公式会根据表中的数据量自动调整。这有几种不同的变化,这取决于具体的情况和确切的允许对表进行的操作。
如果通常情况下(例如您的示例),表格从工作表的顶部开始,有一个单行标题,并且数据连续且没有间隙,则一个简单的动态公式将是:
=SUMIF(INDEX(JUN!$G:$G,2):INDEX(JUN!$G:$G,COUNTA(JUN!$G:$G)),"Utilities",INDEX(JUN!$H:$H,2):INDEX(JUN!$H:$H,COUNTA(JUN!$G:$G)))
Run Code Online (Sandbox Code Playgroud)
这是比INDIRECT()用作更好的解决方案
动态公式技术可以通过在命名公式中使用它来进一步改进。
当然,最好的解决方案是将 table 转换为适当的 Table,并使用结构化引用。
所以你\xe2\x80\x99是说,如果你插入一个新的行\xc2\xa02\n(在当前行\xc2\xa01和行\xc2\xa02之间),\n你希望公式查看新的行Row\xc2\xa02?\xc2\xa0\n这里有几个变体:
\n\n=SUMIF(INDIRECT("JUN!$G$2:$G$500"),"Utilities", INDIRECT("JUN!$D$2:$D$500"))\nRun Code Online (Sandbox Code Playgroud)\n\n将始终查看 Rows\xc2\xa02 到 \xc2\xa0500,\n而不考虑通过插入(或 \xc2\xa0deletions)重新编号的行。\xc2\xa0\n这意味着,如果插入一行,则原始行\xc2\xa0500\n将被重新编号为\xc2\xa0501,并将被移出范围。\xc2\xa0\n如果要通过原始 Row\xc2\xa0500 查看当前 Row\xc2\xa02,请使用
\n\n=SUMIF(INDIRECT("JUN!$G$2"):JUN!$G$500,"Utilities", INDIRECT("JUN!$D$2"):JUN!$D$500)\nRun Code Online (Sandbox Code Playgroud)\n\n如果 \xe2\x80\x99t 不明显,\nINDIRECT()接受一个字符串(文本)参数并将其解释为地址。\xc2\xa0\n它允许您执行不变寻址,\n因为字符串(看起来像地址)当其他地址因行/列插入/删除而调整时,\n\xe2\x80\x99不会得到调整。
请注意,$地址字符串中的字符是可选的;\n它们没有任何作用。