Vba 使用workday函数在对象中存储日期时出错

Vba 使用workday函数在对象中存储日期时出错,vba,excel,date,object,Vba,Excel,Date,Object,我有以下简单的代码: Sub newsub() Dim currentday As Date Dim cd As String currentday = Format(WorskheetFunction.WorkDay(today, -1), dd / mm / aaaa) cd = currentday MsgBox cd End Sub 但我明白了 424错误:需要一个对象 任何人都可以告诉我为什么会发生这种情况?你需要引用“dd/mm/aaa”(我认为应该是“dd/mm/y

我有以下简单的代码:

    Sub newsub()

Dim currentday As Date
Dim cd As String

currentday = Format(WorskheetFunction.WorkDay(today, -1), dd / mm / aaaa)
cd = currentday
MsgBox cd

End Sub
但我明白了

424错误:需要一个对象


任何人都可以告诉我为什么会发生这种情况?

你需要引用
“dd/mm/aaa”
(我认为应该是
“dd/mm/yyyy”

由于
格式
返回的是字符串,而不是日期,因此您也可能希望改用此格式:

currentday = CVDate(Format(WorksheetFunction.WorkDay(Now(), -1), "dd/mm/yyyy"))

您需要在
“dd/mm/aaa”
(我认为实际上应该是
“dd/mm/yyyy”
)周围加引号

由于
格式
返回的是字符串,而不是日期,因此您也可能希望改用此格式:

currentday = CVDate(Format(WorksheetFunction.WorkDay(Now(), -1), "dd/mm/yyyy"))

您今天似乎正在尝试格式化,我将用Now()替换它,它将按预期工作

将代码更改为以下内容:

Sub newsub()
Dim currentday As Date
currentday = Format(Now() - 1, "dd/mm/yyyy") 'use Now() and format to your liking to get the right date
MsgBox currentday 
End Sub

您今天似乎正在尝试格式化,我将用Now()替换它,它将按预期工作

将代码更改为以下内容:

Sub newsub()
Dim currentday As Date
currentday = Format(Now() - 1, "dd/mm/yyyy") 'use Now() and format to your liking to get the right date
MsgBox currentday 
End Sub
这里有一个输入错误,VBA运行时不知道要将
WorkskheetFunction
解析为什么,而且因为没有指定Option Explicit,它正在动态创建一个未声明的变量,一个隐式
变量
,其基本类型取决于您使用它的方式和位置

由于
ABC.XYZ(foo,bar)
在语法上只能是某个对象的成员调用,VBA运行时希望
WorkskheetFunction
是一个对象,而它不是-它从未被赋值,所以它的基本类型是
Variant/Empty
,而不是一个对象-因此,抛出了一个“需要对象”错误

始终使用选项显式。 这样,您就不会愉快地编译和运行带有拼写错误的代码

您还可以利用IntelliSense帮助防止打字错误,方法是使用全局
应用程序
对象限定
工作表功能

Application.WorksheetFunction.WorkDay(...)
这样,当您键入
点时,您将获得自动完成/智能感知。另一个区别是,如果工作表函数抛出一个错误,使用此早期绑定语法,您将得到一个实际的VBA运行时错误,而使用的后期绑定语法(您不会得到参数工具提示/intellisense)如果函数产生错误值,它将返回一个错误,并对
Date
变量进行无效赋值,从而引发一个可能令人困惑的“类型不匹配”错误

这里有一个输入错误,VBA运行时不知道要将
WorkskheetFunction
解析为什么,而且因为没有指定Option Explicit,它正在动态创建一个未声明的变量,一个隐式
变量
,其基本类型取决于您使用它的方式和位置

由于
ABC.XYZ(foo,bar)
在语法上只能是某个对象的成员调用,VBA运行时希望
WorkskheetFunction
是一个对象,而它不是-它从未被赋值,所以它的基本类型是
Variant/Empty
,而不是一个对象-因此,抛出了一个“需要对象”错误

始终使用选项显式。 这样,您就不会愉快地编译和运行带有拼写错误的代码

您还可以利用IntelliSense帮助防止打字错误,方法是使用全局
应用程序
对象限定
工作表功能

Application.WorksheetFunction.WorkDay(...)

这样,当您键入
点时,您将获得自动完成/智能感知。另一个区别是,如果工作表函数抛出一个错误,使用此早期绑定语法,您将得到一个实际的VBA运行时错误,而使用的后期绑定语法(您不会得到参数工具提示/intellisense)如果函数产生错误值,它将返回一个错误并对
Date
变量进行无效赋值,从而引发潜在的混乱“类型不匹配”错误。

工作表
..使用
现在
而不是今天
工作表
..使用
现在
而不是今天
工作正常,谢谢,你能告诉我为什么在这种情况下我必须使用变体格式吗?根据你是否需要时间,使用
日期()可能会更好
而不是
Now()
。例如,
Now()
将返回
13/12/2017 16:00:33
,而
Date
返回
13/12/2017
格式可能因地区而异,我不确定
Now
Now()
之间的差异-两者返回相同的值和
Vartype()
说它们都是日期变量类型。这很有效,谢谢,您能告诉我为什么在这种情况下必须使用变量格式吗?根据您是否需要时间,最好使用
date()
而不是
Now()
。例如,
Now()
将返回
13/12/2017 16:00:33
,而
Date
返回
13/12/2017
格式可能因地区而异,我不确定
Now
Now()
之间的差异-两者返回相同的值和
Vartype()
说它们都是日期变量类型。谢谢。那么,CVDate返回一个日期对象并格式化一个字符串?它也起作用了,谢谢。那么,CVDate返回一个日期对象并格式化一个字符串?