在VBA中使用Excel公式中的日期变量

在VBA中使用Excel公式中的日期变量,vba,variables,excel,Vba,Variables,Excel,我想找出两次约会之间的时间。例如,在单元格C2中,我有2014年1月1日,在单元格C3中,我有2014年12月31日。如果我在C4中使用DATEDIF公式,我会得到364天的正确答案。但是,我尝试在宏中只使用变量。目前我有: Sub dates() Dim NumDays As Integer Dim StartDate, EndDate As Date StartDate = Cells(2, 3) EndDate = Cells(3, 3) Range("C4").FormulaR1C

我想找出两次约会之间的时间。例如,在单元格C2中,我有2014年1月1日,在单元格C3中,我有2014年12月31日。如果我在C4中使用DATEDIF公式,我会得到364天的正确答案。但是,我尝试在宏中只使用变量。目前我有:

Sub dates()


Dim NumDays As Integer
Dim StartDate, EndDate As Date

StartDate = Cells(2, 3)
EndDate = Cells(3, 3)
Range("C4").FormulaR1C1 = "=DATEDIF('" & StartDate & "','" & EndDate & "',""d"")"

End sub
这给了我一个错误:运行时错误“1004”:应用程序定义的错误或对象定义的错误

你知道我该怎么解决这个问题吗?谢谢。

实际上不鼓励使用DATEDIF,因为它是一个古老的公式。相反,vba中内置了DateDiff函数。你应该做的是:

Range("C4").Value = DateDiff("d", StartDate, EndDate)
是对DateDiff函数的说明。我建议你读一读。

实际上不鼓励使用DATEDIF,因为它是一个古老的公式。相反,vba中内置了DateDiff函数。你应该做的是:

Range("C4").Value = DateDiff("d", StartDate, EndDate)

是对DateDiff函数的说明。我建议你读一下。

我想那会满足你的要求

Sub dates()


Dim NumDays As Integer
Dim StartDate, EndDate As Date

StartDate = Cells(2, 3)
EndDate = Cells(3, 3)
NumDays = EndDate - StartDate
Range("C4").Value = NumDays

End Sub

我想那会满足你的要求

Sub dates()


Dim NumDays As Integer
Dim StartDate, EndDate As Date

StartDate = Cells(2, 3)
EndDate = Cells(3, 3)
NumDays = EndDate - StartDate
Range("C4").Value = NumDays

End Sub

您正在使用.FormulaR1C1属性。如果切换到.Formula属性,它应该可以工作。

您使用的是.FormulaR1C1属性。如果切换到.Formula属性,它应该可以工作。

是日期值周围的引号。删除单引号,它会将它们视为正确的日期值。从本质上讲,2014年1月1日与功能上的“2014年1月1日”不同

Sub dates()


Dim NumDays As Integer
Dim StartDate as Date, EndDate As Date

StartDate = Cells(2, 3)
EndDate = Cells(3, 3)
Range("C4").FormulaR1C1 = "=DATEDIF(" & StartDate & "," & EndDate & ",""d"")"

End sub

它是围绕日期值的引号。删除单引号,它会将它们视为正确的日期值。从本质上讲,2014年1月1日与功能上的“2014年1月1日”不同

Sub dates()


Dim NumDays As Integer
Dim StartDate as Date, EndDate As Date

StartDate = Cells(2, 3)
EndDate = Cells(3, 3)
Range("C4").FormulaR1C1 = "=DATEDIF(" & StartDate & "," & EndDate & ",""d"")"

End sub


这不允许您将公式放入单元格,但可能这不是最初的需要。我知道它不是。最初的需要是使用宏来实现这一点。另外,至少对我来说,由于某些原因,我不能使用DATEDIF公式。我明白了。我在下面回答了为什么你不能。Brady DATEDIF上一次被记录是在2000年,微软不鼓励人们使用它。它没有intelli sense等功能,但应该可以工作!Try=DATEDIFDATEYEARTODAY,MONTHTODAY,DAYTODAY,DATEYEARTODAY,MONTHTODAY,DAYTODAY+2,d@BradyK我不是在争论——我只是说用户的问题在于使用DATEDIF工作表函数——如果你的解决方案很好,但是一个值得投票和接受的完整答案应该解释为什么另一个不起作用,以及什么是更好的选择。想想未来的访客。这不允许你把配方放进牢房,但也许这不是最初的需要。我知道它不是。最初的需要是使用宏来实现这一点。另外,至少对我来说,由于某些原因,我不能使用DATEDIF公式。我明白了。我在下面回答了为什么你不能。Brady DATEDIF上一次被记录是在2000年,微软不鼓励人们使用它。它没有intelli sense等功能,但应该可以工作!Try=DATEDIFDATEYEARTODAY,MONTHTODAY,DAYTODAY,DATEYEARTODAY,MONTHTODAY,DAYTODAY+2,d@BradyK我不是在争论——我只是说用户的问题在于使用DATEDIF工作表函数——如果你的解决方案很好,但是一个值得投票和接受的完整答案应该解释为什么另一个不起作用,以及什么是更好的选择。想想未来的访客。你可以做=&StartDate&&EndDate。这将返回两个日期值之间的天数差。@Pnuts正确地认为StartDate是一个变量,没有指定为日期。我已经用那个编辑更新了我的答案。你可以只做=&StartDate&&EndDate。这将返回两个日期值之间的天数差。@Pnuts正确地认为StartDate是一个变量,没有指定为日期。我已经用edit.RangeC4=Cells3,3.Value-Cells2,3.ValueRangeC4=Cells3,3.Value-Cells2,3更新了我的答案。Value@pnuts双引号的存在是为了正确封装他正在创建的字符串的部分,例如to=DateDif1/1/2014,8/1/2014,请注意,引号仅用于他的间隔选择, d@JimmySmith哦,要么对我有用,我不介意,只是有点困惑。@BradyK,这是你想在那一列中有一个公式,还是想要一个值?这个问题暗示他想在专栏中加入一个公式,但你的语法一点问题也没有。@JimmySmith无论如何,这只是一个答案。不用担心哪个更好。我认为这里需要注意的重要一点是,微软不再支持你使用的方法。@JimmySmith你是什么意思?我只能在DATEDIF上从Microsoft找到,并注意到它指出这是为了与Lotus1-2-3兼容。。。。但如果我查DateDiff,我会得到页面。我不想挑三拣四,但我无法从微软轻松找到对DATEDIF的支持。依我看,这意味着我可能应该避免使用它。@pnuts双引号的存在是为了正确封装他正在创建的字符串的一部分,例如to=DateDif1/1/2014,8/1/2014,d'请注意,双引号仅用于
他的间隔选择,d@JimmySmith哦,要么对我有用,我不介意,只是有点困惑。@BradyK,这是你想在那一列中有一个公式,还是想要一个值?这个问题暗示他想在专栏中加入一个公式,但你的语法一点问题也没有。@JimmySmith无论如何,这只是一个答案。不用担心哪个更好。我认为这里需要注意的重要一点是,微软不再支持你使用的方法。@JimmySmith你是什么意思?我只能在DATEDIF上从Microsoft找到,并注意到它指出这是为了与Lotus1-2-3兼容。。。。但如果我查DateDiff,我会得到页面。我不想挑三拣四,但我无法从微软轻松找到对DATEDIF的支持。在我看来,这意味着也许我应该避免它。