嵌套的IF语句可读取和输出自定义日期分组

时间:2019-03-02 23:57:27

标签: excel vba excel-formula excel-2016

我正在尝试在Excel 2016中创建嵌套的IF语句以读取日期值并输出相应的财务月。由于一个财务月对我工作的公司来说是唯一的,因此除了创建自定义功能或对帐单外没有其他可用的选择。

到目前为止,我已经尝试过:

=IF(D2 <= DATEVALUE("28/07/2017"),DATEVALUE("Jul-2017"), 
 IF(D2 <= DATEVALUE("26/08/2017"),DATEVALUE("Aug-2017"), 
    IF(D2 <= DATEVALUE("29/09/2017"), DATEVALUE("Sep-2017"), 
       IF(D2 <= DATEVALUE("27/10/2017"), DATEVALUE("Oct-2017"), 0)))) +
          IF(D2 <= DATEVALUE("24/11/2017"), DATEVALUE("Nov-2017"),
             IF(D2 <= DATEVALUE("29/12/2017"), DATEVALUE("Dec-2017"),
                IF(D2 <= DATEVALUE("26/01/2018"), DATEVALUE("Jan-2018"),
                   IF(D2 <= DATEVALUE("23/02/2018"), DATEVALUE("Feb-2018"), 0)))) +
                      IF(D2 <= DATEVALUE("20/03/2018"), DATEVALUE("Mar-2018"),
                         IF(D2 <= DATEVALUE("27/04/2018"), DATEVALUE("Apr-2018"),
                            IF(D2 <= DATEVALUE("25/05/2018"), DATEVALUE("May-2018"),
                               IF(D2 <= DATEVALUE("29/06/2018"), DATEVALUE("Jun-2018"),
                                  IF(D2 <= DATEVALUE("27/07/2018"), DATEVALUE("Jul-2018"),
                                     IF(D2 <= DATEVALUE("24/08/2018"), DATEVALUE("Aug-2018"), 0)))))) +
                                        IF(D2 <= DATEVALUE("28/09/2018"), DATEVALUE("Sep-2018"),
                                           IF(D2 <= DATEVALUE("26/10/2018"), DATEVALUE("Oct-2018"),
                                              IF(D2 <= DATEVALUE("23/11/2018"), DATEVALUE("Nov-2018"),
                                                 IF(D2 <= DATEVALUE("28/12/2018"), DATEVALUE("Dec-2018"),
                                                    IF(D2 <= DATEVALUE("25/01/2019"), DATEVALUE("Jan-2019"),
                                                       IF(D2 <= DATEVALUE("22/02/2019"), DATEVALUE("Feb-2019"),
                                                          IF(D2 <= DATEVALUE("29/03/2019"), DATEVALUE("Mar-2019"), 0))))))) +
                                                             IF(D2 <= DATEVALUE("26/04/2019"), DATEVALUE("Apr-2019"), 
                                                                IF(D2 <= DATEVALUE("24/05/2019"), DATEVALUE("May-2019"), 
                                                                   IF(D2 <= DATEVALUE("28/06/2019"), DATEVALUE("Jun-2019"), D2)))

它不起作用-我得到的是数字输出而不是日期。

必须有一种更好/有效的方法。

有人可以推荐另一种方法吗?可以通过VBA中的UDF吗?

编辑-发布范围和所需输出的表格

Start date  End date    Month
12/30/2017  1/26/2018   Jan-18
1/27/2018   2/23/2018   Feb-18
2/24/2018   3/30/2018   Mar-18
3/31/2018   4/27/2018   Apr-18
4/28/2018   5/25/2018   May-18
5/26/2018   6/29/2018   Jun-18
6/30/2018   7/27/2018   Jul-18
7/28/2018   8/24/2018   Aug-18
8/25/2018   9/28/2018   Sep-18
9/29/2018   10/26/2018  Oct-18
10/27/2018  11/23/2018  Nov-18
11/24/2018  12/28/2018  Dec-18
12/29/2018  1/25/2019   Jan-19
1/26/2019   2/22/2019   Feb-19
2/23/2019   3/29/2019   Mar-19
3/30/2019   4/26/2019   Apr-19
4/27/2019   5/24/2019   May-19
5/25/2019   6/28/2019   Jun-19

3 个答案:

答案 0 :(得分:1)

表中的模式是:

  1. 每个月的最后一个星期五是截止月份,这表示....
  2. 每个月的最后一个星期六是下个月的开始

这将进行输入,确认它是一个日期,然后查看日期是否在输入月份的最后一个星期五之前,等于或之后。

  1. 如果之前有CSTMonth = Inputs Month
  2. 如果相等,则CSTMonth = Inputs Month
  3. 如果之后,CSTMonth = Month after Inputs Month

Option Explicit

Public Function CSTMonth(Target As Range)

If IsDate(Target) Then

  Dim LastDay As Date: LastDay = WorksheetFunction.EoMonth(Target, 0)
  Dim LastFri As Date: LastFri = LastDay - (Weekday(LastDay + 1) Mod 7)

    If Target <= LastFri Then
        CSTMonth = Format(Target, "MMM-YY")
    Else
        CSTMonth = Format(LastDay + 1, "MMM-YY")
    End If

End If

End Function

在表中找到模式的好处是,无需使用 {brute force 进行更新。采用您的方法将意味着每个月都要对开始日期和结束日期进行硬编码。

答案 1 :(得分:1)

如果您使用的表格包含每个期间的开始日期,请尝试以下操作:

假设表的起始日期为B2:D25,日期位于F2:F25J2:J25

输入以下公式,以获取G2中日期的财务期间,然后将其复制到G3:G25K2:K25

=VLOOKUP(F3,$B$2:$D$25,3,1)

输入以下公式以获取H2中文本的财务期,然后将其复制到H3:H25L2:L25

=TEXT(VLOOKUP(F3,$B$2:$D$25,3,1),"mmm-yyyy")

enter image description here

答案 2 :(得分:-1)

我不确定您面临的复杂性,但是要获得每个表所需的结果,您还可以使用更简单的公式

=TEXT(EOMONTH(A2,1),"YY-MMM")

OR

=EOMONTH(A2,1) 并以yy-mmm格式设置单元格的格式。

其中A2保存开始日期。