Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.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
Excel 将字符串转换为时间并比较其中的两个_Excel_Vba_Date_Time - Fatal编程技术网

Excel 将字符串转换为时间并比较其中的两个

Excel 将字符串转换为时间并比较其中的两个,excel,vba,date,time,Excel,Vba,Date,Time,我有以下字符串: 01/04/2019 11:32:45 及 我希望能够比较这两个时间,然后将结果添加到单元格中 我最好用中间的空隙来分割字符串,然后试图把它转换成可读的时间? 最简单的方法是什么 搜索了几个论坛,他们似乎都稍微超过了我认为是一个简单的任务顶部 cheers这将比较两个字符串的时间元素(从另一个字符串中减去一个),并返回格式为小时、分钟和秒的差值: Dim starttime As String Dim endtime As String starttime = "01/04

我有以下字符串:

01/04/2019 11:32:45

我希望能够比较这两个时间,然后将结果添加到单元格中

我最好用中间的空隙来分割字符串,然后试图把它转换成可读的时间?

最简单的方法是什么

搜索了几个论坛,他们似乎都稍微超过了我认为是一个简单的任务顶部

cheers

这将比较两个字符串的时间元素(从另一个字符串中减去一个),并返回格式为小时、分钟和秒的差值:

Dim starttime As String
Dim endtime As String

starttime = "01/04/2019 11:32:45"
endtime = "01/04/2019 11:38:13"

timedif = TimeValue(endtime) - TimeValue(starttime)
Debug.Print Format(timedif, "hh:MM:ss")

如果您还希望有单独的,您可以使用:

timedatedif = (DateValue(endtime) + TimeValue(endtime)) - (DateValue(starttime) +TimeValue(starttime))
Debug.Print Format(timedatedif, "dd:hh:MM:ss")
这将比较两个字符串的时间元素(从另一个字符串中减去一个),并返回格式为小时、分钟和秒的差值:

Dim starttime As String
Dim endtime As String

starttime = "01/04/2019 11:32:45"
endtime = "01/04/2019 11:38:13"

timedif = TimeValue(endtime) - TimeValue(starttime)
Debug.Print Format(timedif, "hh:MM:ss")

如果您还希望有单独的,您可以使用:

timedatedif = (DateValue(endtime) + TimeValue(endtime)) - (DateValue(starttime) +TimeValue(starttime))
Debug.Print Format(timedatedif, "dd:hh:MM:ss")

如果您有包含日期的字符串,最好将其转换为实
date

您可以使用函数
CDate
将字符串转换为日期,但是,存在相当多的缺陷,例如,根据计算机的区域设置,日期格式(以及日、月和年的顺序)可能会更改,
CDate
将尝试遵守这些设置。如果您的代码在世界的另一个地方运行,相同的输入可能会导致不同的日期。这可能是您发现复杂代码的原因,该代码将字符串拆分为多个片段以获取日期的单个部分

日期存储为
Double
值。数字的整数部分定义了日期,从1899年12月31日开始。小数部分代表时间。要得到两个日期之间的差值,只需将它们减去即可

现在问题来了,你想如何处理这个差异。您可以编写一个UDF来返回此差异,并格式化单元格以仅显示时间部分。如果差异大于1天,请仔细考虑。或者,你可以将差值乘以24得到小时数,或者乘以24*60得到分钟数

UDF可能看起来像

Function TimeDiff(s1 As String, s2 As String) As Date
    Dim d1 As Date, d2 As Date
    d1 = CDate(s1)
    d2 = CDate(s2)
    TimeDiff = IIf(d1 > d2, d1 - d2, d2 - d1)
End Function
假设您的日期字符串位于A1和B1中,您可以将公式
=TimeDiff(A1,B1)
写入单元格C1

获取分钟数的替代方法(注意不同的返回值类型):

当日期不同时,这两个功能将不会出现问题

如果您的输入格式始终为
01/04/2019 11:38:13
,但CDate会将4月1日与1月4日混淆,则您可以编写一个小函数,手动拆分字符串并从中创建日期。只需将对
CDate
的调用替换为对您自己的转换函数的调用:

Function stringToDate(s As String) As Date

    Dim pieces() As String, datePieces() As String, timePieces() As String

    pieces = Split(s, " ")
    datePieces = Split(pieces(0), "/")
    timePieces = Split(pieces(1), ":")

    stringToDate = DateSerial(datePieces(2), datePieces(1), datePieces(0)) _
                 + TimeSerial(timePieces(0), timePieces(1), timePieces(2))
End Function

如果您有包含日期的字符串,最好将其转换为实
date

您可以使用函数
CDate
将字符串转换为日期,但是,存在相当多的缺陷,例如,根据计算机的区域设置,日期格式(以及日、月和年的顺序)可能会更改,
CDate
将尝试遵守这些设置。如果您的代码在世界的另一个地方运行,相同的输入可能会导致不同的日期。这可能是您发现复杂代码的原因,该代码将字符串拆分为多个片段以获取日期的单个部分

日期存储为
Double
值。数字的整数部分定义了日期,从1899年12月31日开始。小数部分代表时间。要得到两个日期之间的差值,只需将它们减去即可

现在问题来了,你想如何处理这个差异。您可以编写一个UDF来返回此差异,并格式化单元格以仅显示时间部分。如果差异大于1天,请仔细考虑。或者,你可以将差值乘以24得到小时数,或者乘以24*60得到分钟数

UDF可能看起来像

Function TimeDiff(s1 As String, s2 As String) As Date
    Dim d1 As Date, d2 As Date
    d1 = CDate(s1)
    d2 = CDate(s2)
    TimeDiff = IIf(d1 > d2, d1 - d2, d2 - d1)
End Function
假设您的日期字符串位于A1和B1中,您可以将公式
=TimeDiff(A1,B1)
写入单元格C1

获取分钟数的替代方法(注意不同的返回值类型):

当日期不同时,这两个功能将不会出现问题

如果您的输入格式始终为
01/04/2019 11:38:13
,但CDate会将4月1日与1月4日混淆,则您可以编写一个小函数,手动拆分字符串并从中创建日期。只需将对
CDate
的调用替换为对您自己的转换函数的调用:

Function stringToDate(s As String) As Date

    Dim pieces() As String, datePieces() As String, timePieces() As String

    pieces = Split(s, " ")
    datePieces = Split(pieces(0), "/")
    timePieces = Split(pieces(1), ":")

    stringToDate = DateSerial(datePieces(2), datePieces(1), datePieces(0)) _
                 + TimeSerial(timePieces(0), timePieces(1), timePieces(2))
End Function

你好你想比较什么?最终结果我想比较两次之间的差异。我有一张2500多张这样的表格,我正在努力工作,表格中包含字符串,而不是日期?日期/时间只是Excel中的数字。日期是整数位,时间是分数。长话短说,我在单独的单元格中有单独的转录本,我将转录本的行分割成一个数组。但是需要一种比较数组中前两个日期戳的方法。嗨。你想比较什么?最终结果我想比较两次之间的差异。我有一张2500多张这样的表格,我正在努力工作,表格中包含字符串,而不是日期?日期/时间只是Excel中的数字。日期是整数位,时间是分数。长话短说,我在单独的单元格中有单独的转录本,我将转录本的行分割成一个数组。但是需要一种方法来比较数组中的前两个日期戳。就是这样,太棒了。如果两个日期不同,会不会变得更复杂?例如,第一次是在2019年4月1日,第二次是在2019年4月2日?或者这还能用吗?就是这样,好极了。如果两个日期不同,会不会变得更复杂?例如,第一次是在2019年4月1日,第二次是在2019年4月2日?还是会