Excel-如果+索引匹配+偏移-VBA或其他?

时间:2019-01-24 17:56:05

标签: excel vba templates indexing offset

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

背景


我正在自动执行合同和会计团队模板之间的数据。请注意,这些电子表格的格式都无法改变,所以我被困住了。我正在尝试自动化这是一个笨拙的过程。数据的主要来源是“合同”标签。假设在300个分包商项目中,在1/24/2019的一周中,我的同事批准了130个项目。我要完成的工作的逻辑:

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

请注意,我故意表明我的假Puppies程序未获得付款的批准,这将有助于演示如何解决我的问题

我的关键问题是,会计模板会为项目跳过每三行,而合同行的每一行都有项目日。因此,对于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吗?对于每个新的第三行,我都从模板开始,我正在将其手动更改为-10,-12,-14等。并非完全复杂。

查看偏移量和行的工作方式,看起来它们似乎严重依赖于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),就会重新定位偏移量匹配的行。有什么更好的公式可以帮助我实现目标吗?一个VBA脚本可以实现我的IF,INDEX,MATCH,OFFSET,ROW梦想吗?我没有嫁给这两个公式。 我细读了一些VBA,但似乎没有像IF这样的条件组件。

编辑:


根据请求,添加屏幕截图。还有一个Google表格链接: 合同标签,故意隐藏不相关的列:

enter image description here

“会计模板”标签: enter image description here

1 个答案:

答案 0 :(得分: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))

§15.9.3

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