基于Excel(VBA?)中ID块中的第一个ID的不同if语句

基于Excel(VBA?)中ID块中的第一个ID的不同if语句,excel,vba,if-statement,dayofmonth,Excel,Vba,If Statement,Dayofmonth,因此,基本上我有一个excel表格,其中有许多不同的id、日期和一列,我想根据第一个id日期在第三列中指定开始、中间或结束。但是,这应该只适用于具有相同ID的块。当下一个ID通过时,块中第一个ID的日期将确定第3列的其余部分,依此类推 在查看数据集时,可以更好地理解这个问题 ID DATE formula_col 10R46 10/8/2011 10R46 2/18/2012 10R46 6/30/2012 10R47 2/4/2010 10R47 5/1

因此,基本上我有一个excel表格,其中有许多不同的id、日期和一列,我想根据第一个id日期在第三列中指定开始、中间或结束。但是,这应该只适用于具有相同ID的块。当下一个ID通过时,块中第一个ID的日期将确定第3列的其余部分,依此类推

在查看数据集时,可以更好地理解这个问题

ID      DATE      formula_col
10R46   10/8/2011
10R46   2/18/2012
10R46   6/30/2012
10R47   2/4/2010
10R47   5/16/2010
10R47   8/8/2010
10R47   12/11/2010
10R47   1/4/2011
10R48   6/26/2011
10R48   9/11/2011
10R48   1/29/2012
10R48   4/20/2012
10R48   7/8/2012
正如你在这里看到的。有一个连续ID块,我需要从第一个日期开始读取“公式”,其余日期将遵循以下规则:

第一个月是开始,下一个月是中间,下一个月是结束,然后重复

因此,如果第一个月是2月2日,那么这些ID的公式是: 二月:开始 三月中旬 四月:完 阿美:开始 六月中旬 七月:完 八月:开始 九月中旬 十月:完 11月:开始 十二月中旬 一月:完 任何一个都可能出现,不一定是以这个顺序开始,中间,结束。但它们将始终按日期顺序排列,在ID结束之前不会返回时间等等

因此,对于上述数据集,它将是:

ID      DATE      formula_col
10R46   10/8/2011 Beginning
10R46   2/18/2012 Middle
10R46   6/30/2012 End
10R47   2/4/2010  Beginning
10R47   5/16/2010 Beginning
10R47   8/8/2010  Beginning
10R47   12/1/2010 Middle
10R47   1/4/2011  End
10R48   6/26/2011 Beginning
10R48   9/11/2011 Beginning
10R48   1/29/2012 Middle
10R48   4/20/2012 Middle
10R48   7/8/2012  Middle
澄清:ID的第一个日期将决定哪些月份是开始、中间和结束

如果第一个月是1月、4月、7月或10月,下面是我创建的代码。但这并不是我想要的,只是一个开始

=IF(OR(MONTH(B2)=1,MONTH(B2)=4, MONTH(B2)=7,MONTH(B2)=10),"Beginning",IF(OR(MONTH(B2)=2,MONTH(B2)=5, MONTH(B2)=8,MONTH(B2)=11),"Middle",IF(OR(MONTH(B2)=3,MONTH(B2)=6, MONTH(B2)=9,MONTH(B2)=12),"End",NA)))
因此,棘手的部分是月初模式取决于唯一ID的第一个条目。然后它开始遵循仅适用于此ID的规则。当下一个ID出现时,规则将根据第一个ID的日期重置。它们将始终是连续的,尽管我不希望依赖于此


VBA solutions welcome

使用INDEX/MATCH返回第一个日期,并从当前日期中减去该月份和年份,然后使用MOD返回该季度的相对月份

然后传递该选项以选择返回正确的文本:

=CHOOSE(MONTH(B2)-MONTH(INDEX(B:B,MATCH(A2,A:A,0))),3)+1,"Beginning","Middle","End")
但这只有在数据总是按照您的方式排序时才有效:


id和日期是否总是按您的方式排序?在示例输出中,似乎只有第一个id遵循您描述的模式—第一个月是开始,下一个是中间,下一个是结束,然后重复。为什么10R47有三个开头,10R48有两个开头,10R48有三个中间点?@ScottCraner是的,总是连续的,日期只移动forward@cybernetic.nomad该模式基于第一个ID日期。因此,接下来的不是日期,而是日期是否属于这些类别。我的意思是,如果二月是ID的第一个日期,如果ID中出现三月,那么它必须在中间,如果四月出现,那么它必须结束,如果五月出现,那么它必须开始,等等。当下一个ID出现时,它以开始作为第一个日期开始,然后依次进行。那么为什么8月是开始,然后是12月中旬,根据您的描述,它应该又开始了。您能具体描述一下您的意思吗?格式与此完全相同?我说的是排序未格式化数据必须按Id和日期升序排序才能工作。更新。是否可以创建一个版本,其中月份分配基于第二个条目?不是第一个?我的意思是,开始、中间和结束作业都是基于ID块中的第二个条目,这是一个新问题。这一个回答了当前的问题。可能会省略年部分,因为12个月总是3的倍数?如果您得到的月差结果为负数并不重要-MOD仍会处理它OK=CHOOSEMODMONTHB2-MONTHINDEXB:B,MATCHA2,a:a,0,3+1,开始,中间,结束