【问题标题】:Excel - If + Index Match + Offset -- VBA or something else?Excel - 如果 + 索引匹配 + 偏移量 - VBA 还是其他?
【发布时间】:2019-01-24 17:56:04
【问题描述】:

我制作了我正在使用的 2 个电子表格的虚拟版本(假名和极短的)this spread sheets

背景:


我正在自动化合同和我们会计团队模板之间的数据。请注意,这些电子表格的格式都不能改变,所以我被卡住了。这是一个笨重的过程,我正在尝试自动化。数据的主要来源是“合同”选项卡。假设在 300 个分包商项目中,在 2019 年 1 月 24 日这一周,我的同事批准了 130 个项目。我想要完成的逻辑:

  • 在“合同”选项卡中,如果 R 列是“是”--
  • 在“会计模板”选项卡(带有公式的选项卡)B 列中,拉出我们要支付的供应商的 Contracts!A 的所有单元格。
  • 同样适用于模板! (路径的昵称)M列,从Contracts!C中拉取已批准的Contract ID的具体合同ID。

请注意,我故意表明我的假小狗计划未获批准以获得他们的付款,这将有助于演示如何解决我的问题

我的关键问题是会计模板每 3 行跳过项目,而合同行每行都有项目日。因此,对于 Template!A5,我正在从 Contracts!A2 中提取数据,而 Template!A8 我正在从 Contracts!A3 中提取数据,等等。

我能够(在某种程度上)通过偏移量、行和索引匹配来完成这项工作:

=OFFSET(INDEX(Contracts!$C$2:$C$167,MATCH(ROWS(Contracts!$A$2:A17),Contracts!$AB$2:$AB$167,0)),-10,0)

看到那个否定的-10了吗?对于我从模板开始的每个新的第 3 行,我手动将其更改为 -10、-12、-14 等。并不完全复杂。

看看 offset 和 row 的工作原理,看起来它们在很大程度上依赖于 Contracts 工作簿中单元格的坐标。但是,理想情况下,我希望这样做:

=IF(Contracts!R2="Yes",OFFSET(INDEX(Contracts!$C$2:$C$167,MATCH(ROWS(Contracts!$A$2:A5),Contracts!$AB$2:$AB$167,0)),-2,0))

但是,一旦我在混合中加入条件 (IF),就会重新定向我的偏移匹配的行。对于我要完成的工作,是否有更好的公式?一个可以实现我的 IF、INDEX、MATCH、OFFSET、ROW 梦想的 VBA 脚本?我没有与这些公式中的任何一个结婚。 我仔细阅读了一些 VBA,但似乎没有像 IF 这样的条件作为组件。

编辑:


根据请求,添加屏幕截图。还有一个 Google Sheet 链接: 合同选项卡,故意隐藏不相关的列:

会计模板选项卡:

【问题讨论】:

  • 你的帖子有点长。或许你可以看看minimal reproducible example
  • @SJR,我取出了一些非必要的句子来缩短它。希望现在好多了。
  • 对不起,我还是有点失落。也许发布一个显示一小部分数据样本的屏幕截图。
  • @SJR--Stack 不允许我上传图片,因为我是新手,但我提供了链接。另外,还有一个指向我在第一段中制作的虚拟电子表格的链接。 “理想模板”第三个选项卡只是用来显示“草稿”应该是什么样子的公式/VBA 让我无法理解。

标签: excel vba templates indexing offset


【解决方案1】:

我会使用 VBA,但这个公式示例可能会帮助您开始。如果您的问题基本上是将水平数据转换为垂直数据,并且您有 3 行的固定间隔。您需要根据实际设置调整公式。

使用的公式是:

F1 及以下=IF(MOD(ROW()-1,3)=0,INDEX($A$1:$A$3,(ROW()+2)/3),"")

G1及以下=INDEX($B$1:$D$3,CEILING(ROW(),3)/3,1+MOD(ROWS($G$1:G1)-1,3))

我相信还有更好的方法...

【讨论】:

  • 这成功了!感谢您引导我完成它并为我的第一个 SO 帖子提供建议:)
  • @jjludv 如果上面的答案解决了您的问题,您应该接受它(单击相应答案旁边的复选标记)。这有两件事。它让每个人都知道您的问题已得到您满意的解决,并为帮助您的人提供帮助。 See here 以获得完整的解释。
猜你喜欢
  • 1970-01-01
  • 2019-02-20
  • 2017-11-04
  • 1970-01-01
  • 2011-11-26
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多