Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在VBA中将字符串转换为日期时出现的问题_Vba_Excel - Fatal编程技术网

在VBA中将字符串转换为日期时出现的问题

在VBA中将字符串转换为日期时出现的问题,vba,excel,Vba,Excel,我需要写一个函数,将2个字符串参数转换为日期和时间 比较日期后返回true/false 我试图通过编写下面提到的代码来实现这个需求 Function CompareDate(StringDate1 As String, StringDate2 As String) As Boolean Dim Date1 As Date Dim Date2 As Date Date1 = CDate(StringDate1) Date2 = CDate(StringDate2)

我需要写一个函数,将2个字符串参数转换为日期和时间 比较日期后返回true/false

我试图通过编写下面提到的代码来实现这个需求

Function CompareDate(StringDate1 As String, StringDate2 As String) As Boolean
    Dim Date1 As Date
    Dim Date2 As Date
    Date1 = CDate(StringDate1)
    Date2 = CDate(StringDate2)

    If Date1 > Date2 Then
      CompareDate = True
    Else
     CompareDate = False
    End If
End Function


Dim test As Boolean
test = CompareDate("03-Mar-2016 02:43 PST", "01-Mar-2016 11:33 PST")
但是我在这行Date1=CDate(StringDate1)中得到了“类型不匹配”错误

知道需要修改什么来解决问题吗


注释:在比较日期时,我的函数也需要考虑时间和时区。

尝试<代码> cDATE(StReDATE1,“”(0))< /C> >和(1),当DATE1= DATE2时,也会给您检查的时间。或者您可以替换PST部分

尝试
cdate(拆分(StringDate1,“”)(0))
和(1)在date1=date2时也会给您时间检查?或者您可以替换PST部分

我认为如果您在执行CDate之前格式化日期会有所帮助

dateX = format(StringDate1, "mm/dd/yyyy") 
你也可以试试这样的东西

dateX = cdate(format(stringdate1,"mm/dd/yyyy") - see that how works. 
我没有任何东西可以测试它。如果最坏的结果是最坏的,则不要将StringDate1作为字符串传递,而是将其作为日期传递,然后应全部设置。在这种情况下,不需要做CDate

Function CompareDate(StringDate1 As Date, StringDate2 As Date) As Boolean
无论在哪里调用这个函数CompareDate…,都要执行CDate。。因此

Call CompareDates(cdate(stringdate1), cdate(stringdate2))

我想如果你在做CDate之前格式化日期会有帮助

dateX = format(StringDate1, "mm/dd/yyyy") 
你也可以试试这样的东西

dateX = cdate(format(stringdate1,"mm/dd/yyyy") - see that how works. 
我没有任何东西可以测试它。如果最坏的结果是最坏的,则不要将StringDate1作为字符串传递,而是将其作为日期传递,然后应全部设置。在这种情况下,不需要做CDate

Function CompareDate(StringDate1 As Date, StringDate2 As Date) As Boolean
无论在哪里调用这个函数CompareDate…,都要执行CDate。。因此

Call CompareDates(cdate(stringdate1), cdate(stringdate2))

日期部分为您提供一个参考日期的整数值,时间部分为您提供时间的分数值。因此,只需添加两个,例如(使用@Nathan_Sav代码):


cdate(split(StringDate1,”)(0))+cdate(split(StringDate1,”)(1))

日期部分为您提供一个引用日期的整数值,时间部分为您提供时间的分数值。因此,只需添加两个,例如(使用@Nathan_Sav代码):

cdate(split(StringDate1,”)(0))+cdate(split(StringDate1,”)(1))

尝试一下:

Function CompareDate(StringDate1 As String, StringDate2 As String) As Boolean
    Dim Date1, Date2

    Date1 = Split(StringDate1, " ")
    Date2 = Split(StringDate2, " ")

    CompareDate = IIf(DateDiff("d", Date1(0), Date2(0) > 0 And DateDiff("n", Date1(1), Date2(1)) > 0), True, False)
End Function
尝试一下:

Function CompareDate(StringDate1 As String, StringDate2 As String) As Boolean
    Dim Date1, Date2

    Date1 = Split(StringDate1, " ")
    Date2 = Split(StringDate2, " ")

    CompareDate = IIf(DateDiff("d", Date1(0), Date2(0) > 0 And DateDiff("n", Date1(1), Date2(1)) > 0), True, False)
End Function

解析问题在于时区的存在。有很多方法可以管理这个日期时间,这取决于你的结局是什么,但最简单的方法就是去掉时区,让
CDATE
解析它。在下面的代码中,我假设a)您所有的时间都在PST中,b)每个日期的末尾都有一个时区。如果这些假设是错误的,则需要进行修改。如果必要,管理多个时区可以通过将所有内容转换为一个时区来完成,如果需要,还可以跟踪它来自哪个时区。但我不知道有哪个标准的VBA模块知道时区,所以需要你提供一个数组

Function CompareDate(strDate1 As String, strDate2 As String) As Boolean
    Dim Date1 As Date
    Dim Date2 As Date
    Date1 = CDate(Left(strDate1, InStrRev(strDate1, " ")))
    Date2 = CDate(Left(strDate2, InStrRev(strDate2, " ")))
    CompareDate = (Date1 > Date2)
End Function

也许您可以从构建时区与UTC偏移量数组,但我现在没有时间处理它。一旦你构建了这个数组,就非常简单了。

解析的问题在于时区的存在。有很多方法可以管理这个日期时间,这取决于你的结局是什么,但最简单的方法就是去掉时区,让
CDATE
解析它。在下面的代码中,我假设a)您所有的时间都在PST中,b)每个日期的末尾都有一个时区。如果这些假设是错误的,则需要进行修改。如果必要,管理多个时区可以通过将所有内容转换为一个时区来完成,如果需要,还可以跟踪它来自哪个时区。但我不知道有哪个标准的VBA模块知道时区,所以需要你提供一个数组

Function CompareDate(strDate1 As String, strDate2 As String) As Boolean
    Dim Date1 As Date
    Dim Date2 As Date
    Date1 = CDate(Left(strDate1, InStrRev(strDate1, " ")))
    Date2 = CDate(Left(strDate2, InStrRev(strDate2, " ")))
    CompareDate = (Date1 > Date2)
End Function

也许您可以从构建时区与UTC偏移量数组,但我现在没有时间处理它。一旦构建了该数组,就非常简单。

现在错误得到了修复,但在比较日期时没有考虑时间部分。在比较日期的时候,我的函数需要考虑时间和时区。现在这个错误得到了修正,但是在比较日期的时候,没有考虑时间。我的函数需要在比较日期的同时考虑时间和时区,但是你的解决方案不考虑时区,对吗?你是对的。您可以通过查看拆分的第三部分来实现这一点,但是据我所知,Excel无法在本地比较时区。我建议将所有值转换为UTC时间戳,然后比较这些值。但是您的解决方案不考虑时区,对吗?您是正确的。您可以通过查看拆分的第三部分来实现这一点,但是据我所知,Excel无法在本地比较时区。我建议将所有值转换为UTC时间戳,然后进行比较。我知道没有简单的函数可以让您通过时区。我知道没有简单的函数可以让您通过时区。