当前位置: 首页 > 知识库问答 >
问题:

填充两个日期之间的所有月份

杭涵映
2023-03-14

我一直在尝试在Excel中制作一个公式,用于填充两个日期之间的月份。

我得到的只是DatedIF(),但它不满足要求。

这是我想要从Excel公式中获得的图片。如果我更新开始日期或结束日期公式中的任何日期,将自动计算日期之间的所有月份,并在附加的图片中给出可用的结果。

代码结果和我想要的结果。代码应该相应地与日期一起工作。

https://docs . Google . com/spreadsheets/d/1 abls 8 sopogqvorwizwlijioiqivg 9 fvkabdxy 0 tmgu/edit # GID = 1340167497

=IF(ROW()=15,0,IFERROR(INDEX(MONTH(EDATE(Sheet1!B$4,ROW(A$15:INDEX(A:A,DATEDIF(Sheet1!B$4,Sheet1!G$1,"m"))))),COUNT(A$15:A15)),""))

共有3个答案

丁淇
2023-03-14
  • 以下是使用Worksheet Change事件的自动版本,即仅当手动或通过VBAChange值(而不是通过公式)时才运行。您不必运行任何东西,只需将代码复制到适当的模块并调整常量部分中的值即可
  • 如果出于某种原因,您不希望自动化,可以删除工作表模块中的代码,删除标准模块中Option Explicit下面的三个常量,并取消注释populateMonths中的三个常数。现在它只适用于populateMonthsInit
  • 如果开始日期是该月的最后一天,则不包括该月。同样,如果结束日期是当月的第一天,则不包括该月。这很容易调整

表单模块,例如< code>Sheet1

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng As Range
    Set rng = Intersect(Union(Range(StartDateCell), Range(EndDateCell)), Target)
    If Not rng Is Nothing Then
        populateMonths
    End If
End Sub

标准模块,例如Module1

Option Explicit
 
Public Const StartDateCell As String = "B1"
Public Const EndDateCell As String = "B2"
Private Const FirstCell As String = "B4"

Sub populateMonthsInit()
    populateMonths
End Sub

Sub populateMonths(Optional ws As Worksheet)
    'Const StartDateCell As String = "B1"
    'Const EndDateCell As String = "B2"
    'Const FirstCell As String = "B4"
    If ws Is Nothing Then
        Set ws = ThisWorkbook.ActiveSheet
    End If
    With ws.Range(FirstCell)
        Dim Data As Variant
        Data = getMonthNumbers(.Worksheet.Range(StartDateCell).Value, _
            .Worksheet.Range(EndDateCell).Value)
        .Resize(.Worksheet.Rows.Count - .Row + 1).ClearContents
        .Value = 0 ' Not sure what that's all about.
        If Not IsEmpty(Data) then
            .Offset(1).Resize(UBound(Data, 1)).Value = Data
        End if
    End With
End Sub

Function getMonthNumbers( _
    ByVal StartDate As Date, _
    ByVal EndDate As Date) _
As Variant
    On Error GoTo clearError
    Dim Months As Long: Months = DateDiff("m", StartDate, EndDate)
    Dim StartMonth As Long
    If Month(StartDate + 1) = Month(StartDate) Then
        Months = Months + 1
        StartMonth = modMonth(Month(StartDate))
    Else
        StartMonth = modMonth(Month(StartDate) + 1)
    End If
    If Month(EndDate - 1) <> Month(EndDate) Then
        Months = Months - 1
    End If
    Dim Data() As Long: ReDim Data(1 To Months, 1 To 1)
    Data(1, 1) = StartMonth
    Dim i As Long
    For i = 2 To Months
        Data(i, 1) = modMonth(Data(i - 1, 1) + 1)
    Next i
    getMonthNumbers = Data
ProcExit:
    Exit Function
clearError:
    Resume ProcExit
End Function

Function modMonth( _
    m As Long) _
As Long
    modMonth = IIf(m Mod 12, m Mod 12, 12)
End Function

Sub TESTgetMonthNumbers()
    Dim Data As Variant: Data = getMonthNumbers(Range("B1"), Range("B2"))
    If Not IsEmpty(Data) Then
        Debug.Print Join(Application.Transpose(Data), vbLf)
    Else
        Debug.Print "Nope."
    End If
End Sub
松雅健
2023-03-14

这将从第五行开始填充。毫无疑问,该代码可以作为一个数组公式。

Sub Test()

    With ThisWorkbook.Worksheets("Sheet1")
        PopulateMonths .Range("B2"), .Range("B3")
    End With

End Sub

Sub PopulateMonths(FirstDate As Range, SecondDate As Range)

    Dim MonthCount As Long
    MonthCount = DateDiff("m", FirstDate, SecondDate)
    
    With ThisWorkbook.Worksheets("Sheet1")
    
        'This will clear from row 5, column 1 to the last piece of data in column 1.
        'If column 1 is already empty it will clear from A1:A5, so best to check if
        'there's any data to clear before this line runs (just see if A5<>"")
        .Range(.Cells(5, 1), .Cells(.Rows.Count, 1).End(xlUp)).ClearContents
    
        Dim x As Long
        For x = 0 To MonthCount
            .Cells(x + 5, 1) = x 'Start on row 5, column 1.
        Next x
    
    End With
    
End Sub
桑璞
2023-03-14

您可以尝试:

A4中的公式:

=IF(ROW()=4,0,IFERROR(INDEX(MONTH(EDATE(B$1,ROW(A$1:INDEX(A:A,DATEDIF(B$1,B$2,"m"))))),COUNT(A$3:A3)),""))

往下拖。

注意:例如,结束日期为“30-12-2021”,这最多只能工作到11。如果仍希望看到12,则需要在其中使用嵌套函数。

 类似资料:
  • 问题内容: 我正在尝试列出两个日期之间的所有月份。 例如; 开始日期是:,最后日期是: 我想列出这样的东西: 这是我尝试过的,但根本没有用: 问题答案: PHP 5.3 PHP 5.4或更高版本 我们将开始日期和结束日期修改为每月第一天的部分很重要。如果我们不这样做,则当前日期要比2月的最后一天高(例如,非-年为28,leap年为29),则跳过2月。

  • 我试图在我正在创建的C#应用程序中显示两个日期之间的年、月和日。(使用控制台进行测试) 我正在使用NodaTime来实现这一点,但在接下来的几个月里,我遇到了一些问题。 我已经阅读了这里的大部分问题和答案,但没有找到任何我可以从中受益的东西。 大多数时候函数工作但有时它不添加月如果天 我使用这个代码进行测试 (2017, 10, 16)和(2018, 1, 15)应该显示为3个月,但它们显示为2个

  • 问题内容: 它给出以下内容: 但是我想获得下个月的定义,该怎么办? 问题答案: 表达方式 给。我们期望这两个值都指向每月的最后几天。如果将1天添加到值中,我们将获得下个月的第一天, 会给我们1个月的预期时间。因此,让我们检查是否有一个月的最后两天,在这种情况下,我们要返回第二天的年龄间隔。在其他情况下,我们将返回原始值的年龄间隔: 一些例子:

  • 我有两次约会。一个是以YYYYMMDD格式从其他应用程序的表中检索的,第二个日期是本地时间,我需要这两个日期之间的天数/月/年。 我试过了 但这给了我一些乱七八糟的数字。 变量$t=Fri Dec31 00:00:00 9999 变量$今天=Wed Feb19 14:40:55 2020 产出:25182094888 有什么想法吗?提前谢谢。

  • 在Netezza中,我们有一个months_-between函数,它给出两个日期之间的月份:我猜,它首先计算日期之间的天数,然后除以30? 有没有一种方法可以在netezza中编写sql,这样我就可以得到如下整数值:如果两个日期在同一个月内,则返回0。否则返回#个月。i、 e 2015年8月31日和2015年9月01日应返回1,因为它们在不同的月份。 如果我将months_between的o/p转

  • 问题内容: 如何计算JavaScript中两个Date()对象的差异,而只返回差异中的月数? 任何帮助将是巨大的:) 问题答案: “差异中的月数”的定义要经过很多解释。:-) 您可以从JavaScript日期对象获取年,月和日。根据您要查找的信息,可以使用这些信息来计算两个时间点之间有多少个月。 例如,现成的,它找出两个日期之间有多少 整月 ,而不计算部分月份(例如,不包括每个日期所在的月份):