如何在没有 VBA 或宏的情况下循环使用 excel?

How to loop in excel without VBA or macros?

提问人:Jeff 提问时间:2/9/2011 最后编辑:Jeff 更新时间:11/9/2023 访问量:508541

问:

是否可以在不安装 VBA 或宏的情况下在 Excel 中迭代(循环)一组行?网络搜索没有产生任何有用的东西。

=IF('testsheet'!$C$1 <= 99,'testsheet'!$A$1,"") &
IF('testsheet'!$C$2 <= 99, 'testsheet'!$A$2,"") &
IF('testsheet'!$C$3 <= 99, 'testsheet'!$A$3,"") &
... and so on through !$C$40, !$A$40 ...

事实上,我必须在每个单元格中重复上述代码 40 次,并且我有 200 多个单元格需要该代码。

我非常擅长 PHP/SQL,但只是学习 Excel。

excel 公式

评论

0赞 Jeff 2/9/2011
我实际上已经阅读了该页面,但没有看到任何对我有帮助的东西。似乎您几乎需要安装VBA来执行复杂的迭代。对OpenOffice有什么想法吗?
0赞 Fionnuala 2/9/2011
从我所读到的内容来看,Open Office 中的 Calc 比 Excel 更有限,但我不能从经验中说话。至于 VBA,它使 MS Office 产品如此有用。你的意思是你根本无法运行脚本?

答:

1赞 blueberryfields 2/9/2011 #1

您可以在计算电子表格上的某个位置创建一个表格,该表格对每对单元格执行此操作,并使用自动填充来填充它。

将该表中的结果聚合到结果单元格中。

然后,引用结果的 200 个单元格可以引用保存聚合结果的单元格。在最新版本的 excel 中,您可以命名结果单元格并以这种方式引用它,以便于阅读。

7赞 Jeff 2/9/2011 #2

要自己回答这个问题(如果我错了,请纠正我):

在未安装 VBA/启用宏的情况下,无法在 Excel 中遍历一组行(如数组)。

评论

1赞 jtolle 2/9/2011
你是对的。但是,即使没有 VBA,您也可能能够减轻当前所经历的大部分痛苦。(使用 VBA 时,解决方案是微不足道的。如果你有兴趣,我可以发布一个答案,但如果你真的只想要一个是或否的答案,答案是“否”,我不会打扰。另外,通过“未安装VBA”,您的意思是不想启用宏吗?据我所知,VBA始终是“安装”的,内置于Excel中。只是有时组织有禁止使用它的政策。(我在一家小公司工作,这从未出现过。
0赞 Jeff 2/9/2011
Jtolle,是的,一定要发布任何有帮助的东西。你是对的,出于明显的安全原因,宏被禁用。
1赞 jtolle 2/9/2011
我想@Nat刚刚给了你一个很好的答案。如果您不熟悉 Excel,请注意,他的答案使用相对引用,而不是您的绝对引用。将具有相对引用的公式复制到一列或一行之间是惯用的 Excel。(Excel 将自动正确处理,而无需更改每个公式的文本。我个人认为,当你试图遵循正确的“不要重复自己”的编程实践时,它也算作“在一个地方使用”的代码。
23赞 Nat 2/9/2011 #3

获得公式结果的方法是从新工作表开始。

在单元格 A1 中输入公式

=IF('testsheet'!C1 <= 99,'testsheet'!A1,"") 

将该单元格向下复制到第 40 行 在单元格 B1 中输入公式

=A1

在单元格 B2 中输入公式

=B1 & A2

将该单元格向下复制到第 40 行。

所需的值现在位于第 40 行的该列中。

这不是你想要的答案,但这是明智地完成工作的最快方法,而无需创建一个自定义公式来接受一个范围并进行计算(这样做会更有趣)。

9赞 YAtreyu 6/2/2016 #4

我只是在寻找类似的东西:

我想对每个奇数行列求和。

SUMIF有两个可能的范围,一个是求的范围,另一个是要考虑条件的范围。

SUMIF(B1:B1000,1,A1:A1000)

此函数将考虑 B 范围内的单元格是否为“=1”,仅当为“=1”时,它才会对相应的 A 单元格求和。

为了让“=1”在 B 范围内返回,我把它放在 B 中:

=MOD(ROWNUM(B1),2)

然后自动填充以获得要填充的模数,您可以在此处放置可计算的条件,以获取循环遍历每个单元格所需的 SUMIF 或 SUMIFS 条件。

比 ARRAY 的东西更容易,并隐藏了循环的后端!

评论

0赞 Roshana Pitigala 9/21/2019
还要看看您是否有多个条件需要检查。SUMIFS 函数SUMIFS
1赞 Manopolus 3/29/2017 #5

当您具有以不同速率重复的可变循环时,请添加更多列。我不确定你想做什么,但我认为我已经做了一些可以适用的事情。

在Excel中创建单个循环非常简单。它实际上为你做了工作。在新工作簿上尝试此操作

  1. 在 A1 中输入“1”
  2. 在 A2 中输入“=A1+1”

向下拖动时,A3 将自动变为“=A2+1”。第一步不必那么明确。如果您只是在 A2 中输入“2”,Excel 将自动识别模式并计数,但如果我们希望 B1-B5 为“100”,B5-B10 为“200”(以相同的方式计数),您就会明白为什么知道如何明确地做到这一点很重要。在此方案中,您只需输入:

  1. B1 中的“100”,拖动到 B5 和
  2. B6 中的“=B1+100”

B7 会在您向下拖动时自动变为“=B2+100”等,所以基本上它每 5 行无限增加一次。要在 A 列中对数字 1-5 进行循环:

  1. 在单元格 A1 中输入“=A6”。当您向下拖动时,由于 Excel 的执行方式,它将在单元格 A2 等中自动显示为“=A7”。

因此,现在我们有 A 列重复数字 1-5,而 B 列每 100 个单元格增加 5。例如,您可以使用与 A 列相同的方法使 B 列重复数字 100-900,以此来生成具有多个变量的每个可能的组合。向下拖动列,它们会无限地这样做。我没有明确地解决给定的场景,但如果您遵循这些步骤并理解它们,则该概念应该会为您提供涉及添加更多列并将它们合并或用作变量的问题的答案。

1赞 p._phidot_ 7/17/2018 #6

@Nat给出了一个很好的答案。但是,既然没有办法缩短代码,为什么不使用串联来“生成”您需要的代码呢?当我懒惰时(在单元格中键入整个代码),它对我有用。

因此,我们需要的只是识别模式>使用 excel 构建模式“结构”>添加“ = ”并将其粘贴到预期的单元格中。

例如,您要实现(我的意思是,在单元格中输入):

=IF('testsheet'!$C$1 <= 99,'testsheet'!$A$1,"") &IF('testsheet'!$C$2 <= 99,'testsheet'!$A$2,"") &IF('testsheet'!$C$3 <= 99,'testsheet'!$A$3,"") &IF('testsheet'!$C$4 <= 99,'testsheet'!$A$4,"") &IF('testsheet'!$C$5 <= 99,'testsheet'!$A$5,"") &IF('testsheet'!$C$6 <= 99,'testsheet'!$A$6,"") &IF('testsheet'!$C$7 <= 99,'testsheet'!$A$7,"") &IF('testsheet'!$C$8 <= 99,'testsheet'!$A$8,"") &IF('testsheet'!$C$9 <= 99,'testsheet'!$A$9,"") &IF('testsheet'!$C$10 <= 99,'testsheet'!$A$10,"") &IF('testsheet'!$C$11 <= 99,'testsheet'!$A$11,"") &IF('testsheet'!$C$12 <= 99,'testsheet'!$A$12,"") &IF('testsheet'!$C$13 <= 99,'testsheet'!$A$13,"") &IF('testsheet'!$C$14 <= 99,'testsheet'!$A$14,"") &IF('testsheet'!$C$15 <= 99,'testsheet'!$A$15,"") &IF('testsheet'!$C$16 <= 99,'testsheet'!$A$16,"") &IF('testsheet'!$C$17 <= 99,'testsheet'!$A$17,"") &IF('testsheet'!$C$18 <= 99,'testsheet'!$A$18,"") &IF('testsheet'!$C$19 <= 99,'testsheet'!$A$19,"") &IF('testsheet'!$C$20 <= 99,'testsheet'!$A$20,"") &IF('testsheet'!$C$21 <= 99,'testsheet'!$A$21,"") &IF('testsheet'!$C$22 <= 99,'testsheet'!$A$22,"") &IF('testsheet'!$C$23 <= 99,'testsheet'!$A$23,"") &IF('testsheet'!$C$24 <= 99,'testsheet'!$A$24,"") &IF('testsheet'!$C$25 <= 99,'testsheet'!$A$25,"") &IF('testsheet'!$C$26 <= 99,'testsheet'!$A$26,"") &IF('testsheet'!$C$27 <= 99,'testsheet'!$A$27,"") &IF('testsheet'!$C$28 <= 99,'testsheet'!$A$28,"") &IF('testsheet'!$C$29 <= 99,'testsheet'!$A$29,"") &IF('testsheet'!$C$30 <= 99,'testsheet'!$A$30,"") &IF('testsheet'!$C$31 <= 99,'testsheet'!$A$31,"") &IF('testsheet'!$C$32 <= 99,'testsheet'!$A$32,"") &IF('testsheet'!$C$33 <= 99,'testsheet'!$A$33,"") &IF('testsheet'!$C$34 <= 99,'testsheet'!$A$34,"") &IF('testsheet'!$C$35 <= 99,'testsheet'!$A$35,"") &IF('testsheet'!$C$36 <= 99,'testsheet'!$A$36,"") &IF('testsheet'!$C$37 <= 99,'testsheet'!$A$37,"") &IF('testsheet'!$C$38 <= 99,'testsheet'!$A$38,"") &IF('testsheet'!$C$39 <= 99,'testsheet'!$A$39,"") &IF('testsheet'!$C$40 <= 99,'testsheet'!$A$40,"") 

我没有输入它,我只是使用“&”符号在 excel 中组合排列好的单元格(另一个文件,而不是我们正在处理的文件)。

请注意:

第 1 部分>IF('testsheet'!$C$

第 2 部分>1 to 40

第 3 部分><= 99,'testsheet'!$A$

part4 >1 to 40

第 5 部分>,"") &

  • 输入零件 1 到 A1,零件 3 到 C1,零件到 E1。
  • 在 A1 中输入 “ = A2 ”,在 C1 中输入 “ = C2 ”,在 E1 中输入 “ = E2 ”。
  • 在 B1 中输入 “ = B1+1 ”,在 D2 中输入 “ = D1+1 ”。
  • 在 G2 中输入“ =A2&B2&C2&D2&E2 ”
  • 在 I1 中输入“ =I2&G2 ”

现在选择 A2:I2 ,然后将其向下拖动。请注意,数字每增加一行,生成的文本将逐个单元格和逐行合并。

  • 复制 I41 内容,
  • 把它贴在某个地方,在前面加上“ = ”,去掉多余的&和后面。

结果 = 按预期编写代码。

我使用 Excel/OpenOfficeCalc 来帮助我为我的项目生成代码。对我有用,希望对其他人有所帮助。(:

0赞 Ryan Denman 8/16/2023 #7

我在寻找一种方法来制定预测项目的时间表时遇到了这个问题。我希望能够设置项目工期,并让计划的小时数从一周开始到结束填充。从本质上讲,我想做一个for循环。由于我不想使用 VBA,因此我需要构建一个外部表,该表列出了每个星期的编号,并具有相应数量的列,周数后面有 1。然后,我构建了附加的表并使用了以下公式:

=IFERROR(IF($G14<=L$4, IF($H14<53,VLOOKUP($H14,Table2[#All],(COUNTIF($K14:K14, ">0")+2),), 0)*$E14, 0), 0)

IFERROR从空白单元格中删除任何错误,并提供更好的外观。

第一个检查项目开始日期是否等于或大于日历行中的周日期。IF

第 2 次检查项目工期是否小于一年,然后在表 2 中找到正确的行,然后列索引基于 ,它从项目行的开头开始计算非零的数量,然后加 2(如果没有非零,则索引的列将是第 2 列, 这是表 2 中带有 1 的第一列)。IFCOUNTIF

当两个语句的计算结果均为 TRUE 时,则结果为 1,乘以每周估计时间。IF

如果任一语句是,则为结果。IFFALSE0

我还将使用此公式的区域中的数字格式化为自定义,以从视图中删除任何纯零。0;-0;;@

主表2

评论

0赞 Ryan Denman 8/29/2023
出于好奇,我试图将这个循环函数简化为仅函数而不引用外部表,但找不到一种简单的方法来做到这一点。我一直遇到循环引用问题。对读者的挑战:这个相同的函数可以作为一个函数而不是一个函数和表存在吗?
0赞 user22883757 11/9/2023 #8

看看这个制作蛞蝓的简单公式。它可能会对你有所帮助。它获取单元格中的值,并生成第一个单词-第二个单词的 slug。

=LOWER(TEXTJOIN(“-”,TRUE,(TEXTSPLIT(B2,{“ ”,“&”,“/”},,TRUE,1))))

此公式将使用 B2 中的值并删除 & 和 / 字符的任何空格,并将它们替换为 - 字符。