我一直在尝试在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)),""))
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
这将从第五行开始填充。毫无疑问,该代码可以作为一个数组公式。
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
您可以尝试:
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日期对象获取年,月和日。根据您要查找的信息,可以使用这些信息来计算两个时间点之间有多少个月。 例如,现成的,它找出两个日期之间有多少 整月 ,而不计算部分月份(例如,不包括每个日期所在的月份):