[英]Excel VBA convert Date with time
我有 2 个带有时间数据的单元格,其格式如下:
"A1" = Sep 01 2018 00:01:33.707
"A2" = Sep 01 2018 00:01:49.917
我需要在excel VBA中创建一个按钮和方法,如果时间“A2”比“A1”多90秒,则将“A3”单元格设置为true。 这是我到目前为止所拥有的,但它不起作用:
Sub Macro2()
Dim str1 As String, str2 As String
With Worksheets("sheet5")
str1 = .Cells(1, "A").Text
str2 = .Cells(2, "A").Text
'greater than 90m seconds in A3
.Cells(3, "A") = CBool(Abs((DateValue(Left(str1, 6) & "," & Mid(str1, 7, 5)) + _
TimeValue(Mid(str1, 13, 8)) + TimeSerial(0, 0, 1) * CDbl(Right(str1, 4))) - _
(DateValue(Left(str2, 6) & "," & Mid(str2, 7, 5)) + _
TimeValue(Mid(str2, 13, 8)) + TimeSerial(0, 0, 1) * CDbl(Right(str2, 4)))) > _
TimeSerial(0, 0, 90))
'actual absolute difference in A4
.Cells(4, "A") = Abs((DateValue(Left(str1, 6) & "," & Mid(str1, 7, 5)) + _
TimeValue(Mid(str1, 13, 8)) + TimeSerial(0, 0, 1) * CDbl(Right(str1, 4))) - _
(DateValue(Left(str2, 6) & "," & Mid(str2, 7, 5)) + _
TimeValue(Mid(str2, 13, 8)) + TimeSerial(0, 0, 1) * CDbl(Right(str2, 4))))
End With End Sub
上面给出了错误,因为日期函数适用于系统语言环境,在我的情况下是希伯来语,而数据是英语。
另一种可能有帮助的方法是将所有列“A”(保存日期)转换为可与 VBA 上的日期和时间函数一起使用的系统本地日期(不知道如何执行)。
请帮忙
我已将您的任务分为 3 个功能。
a) 辅助函数将月份的 3 个字符转换为整数。 它看起来有点笨拙,可能还有其他方法,但使用大型Select Case
的优点是,如果出现不同语言的月份名称,则易于理解和适应:
Function getMonthFromName(monthName As String) As Integer
Select Case UCase(monthName)
Case "JAN": getMonthFromName = 1
Case "FEB": getMonthFromName = 2
Case "MAR": getMonthFromName = 3
Case "APR": getMonthFromName = 4
(...)
Case "SEP": getMonthFromName = 9
(...)
End Select
End Function
b) 将字符串转换为日期的函数。 它采用您提供的形式的日期格式,但如果格式发生变化,它很容易适应(为简单起见,秒四舍五入)
Function GetDateFromString(dt As String) As Date
Dim tokens() As String
tokens = Split(Replace(dt, ":", " "), " ")
Dim day As Integer, month As Integer, year As Integer
month = getMonthFromName(CStr(tokens(0)))
day = Val(tokens(1))
year = Val(tokens(2))
Dim hour As Integer, minute As Integer, second As Double
hour = Val(tokens(3))
minute = Val(tokens(4))
second = Round(Val(tokens(5)), 0)
GetDateFromString = DateSerial(year, month, day) + TimeSerial(hour, minute, second)
End Function
c) 以秒为单位计算两个日期差的函数。 VBA(和许多其他环境)中的日期存储为Double
,其中 Date-Part 是整数部分,日期是余数。 这使得使用日期值计算变得容易。
Function DateDiffInSeconds(d1 As String, d2 As String) As Long
Dim diff As Double
diff = GetDateFromString(d2) - GetDateFromString(d1)
DateDiffInSeconds = diff * 24 * 60 * 60
End Function
更新以处理毫秒:更改GetDateFromString
函数。 在这种情况下, DateDiffInSeconds
应该返回double
而不是long
。
Function GetDateFromString(dt As String) As Date
Const MillSecPerHour As Long = 24& * 60 * 60 * 1000
Dim tokens() As String
tokens = Split(Replace(Replace(dt, ".", " "), ":", " "), " ")
Dim day As Integer, month As Integer, year As Integer
month = getMonthFromName(CStr(tokens(0)))
day = Val(tokens(1))
year = Val(tokens(2))
Dim hour As Integer, minute As Integer, second As Integer, milli As Integer
hour = Val(tokens(3))
minute = Val(tokens(4))
second = Val(tokens(5))
milli = Val(tokens(6))
GetDateFromString = DateSerial(year, month, day) _
+ TimeSerial(hour, minute, second) _
+ milli / MillSecPerHour
End Function
我认为你把它复杂化了,试试这个来了解如何做到这一点:
Sub Macro2()
Dim str1 As String, str2 As String
With Worksheets("sheet5")
.Range("b1:e1") = Split(Range("A1"), " ")
.Range("B2:e2") = Split(Range("A2"), " ")
End Sub
为了您的信息,我以稍微不同(且更简单)的方式完成了您正在做的事情:
在单元格 B2 中,我输入值13/11/2018 11:44:00
。
在单元格 B3 中,我输入值13/11/2018 11:45:01
。
(对于这两个单元格,单元格格式已设置为d/mm/jjjj u:mm:ss
)。
在另一个单元格中,我输入了以下公式:
=IF((B3-B2)*86400>90;TRUE;FALSE)
该公式基于设置日期时间值的思想,基于一天等于1的思想,一天有86400秒。
像这样,您可以在不需要 VBA 的情况下计算时差。
使用 UDF。
Sub Macro2()
Dim str1 As String, str2 As String
Dim mySecond As Double, t1 As Double, t2 As Double, t3 As Double
mySecond = TimeSerial(0, 0, 90)
With Worksheets("sheet5")
str1 = .Cells(1, "A").Text
str2 = .Cells(2, "A").Text
t1 = ConvertTime(str1)
t2 = ConvertTime(str2)
t3 = t2 - t1
.Cells(3, "a") = Abs(t3) >= mySecond
End With
End Sub
Function ConvertTime(s As String)
Dim vS
vS = Split(s, " ")
ConvertTime = DateValue(vS(0) & "-" & vS(1) & "-" & vS(2)) + TimeValue(Split(vS(3), ".")(0))
End Function
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.