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
在Excel中使用单个格式参数(如to_DATE、datetime.ParseExact)将字符串转换为datetime?_Excel_Vba_Datetime_Type Conversion_To Date - Fatal编程技术网

在Excel中使用单个格式参数(如to_DATE、datetime.ParseExact)将字符串转换为datetime?

在Excel中使用单个格式参数(如to_DATE、datetime.ParseExact)将字符串转换为datetime?,excel,vba,datetime,type-conversion,to-date,Excel,Vba,Datetime,Type Conversion,To Date,是否有一个函数可以使用Excel中作为参数提供的datetime格式将字符串转换为datetime 您可以在不同的平台上想象如下类似的功能: PLSQL: TO_DATE("20191301","YYYYDDMM") C#: DateTime.ParseExact("20191301","YYYYDDMM", null) 此函数可能会根据需要返回结果(您可以根据需要进行修改) 根据你提供的字符串 A1单元 29.10.2018:17:48:10 用这个 =DATEVALUE(SUBSTITU

是否有一个函数可以使用Excel中作为参数提供的datetime格式将字符串转换为datetime

您可以在不同的平台上想象如下类似的功能:

PLSQL: TO_DATE("20191301","YYYYDDMM")
C#: DateTime.ParseExact("20191301","YYYYDDMM", null)

此函数可能会根据需要返回结果(您可以根据需要进行修改)


根据你提供的字符串

A1单元

29.10.2018:17:48:10
用这个

=DATEVALUE(SUBSTITUTE(LEFT(A1,FIND(":",A1)-1),".","/"))+TIMEVALUE(MID(A1,FIND(":",A1)+1,20))

以下是对用户定义的工作表函数的尝试:

  • 函数返回日期时间值
  • 支持的格式字符串部分:yyy、yy、mmm、MM、dd、hh、MM、ss
  • 上午,上午,上午。m、 ,下午,下午,下午。M它们的大写字母都是等价的
  • 只有MM(月)和MM(分钟)区分大小写,
    MMM或MMM等于一月、二月
  • 80以下的两位数年份为20xx,80或以上的年份为19xx
  • 格式字符串必须与源字符串具有相同的长度,
    否则返回#N/A错误
  • 填充字符可以是空白、冒号、双冒号或其他
示例:

编辑:

Public函数以_DATE(ByRef src作为字符串,ByRef frmt作为字符串)作为变量
暗y为长,m为长,d为长,h为长,最小为长,s为长
将am设置为布尔值,将pm设置为布尔值
变暗位置尽可能长
如果Len(src)Len(frmt),则
截止日期=CVErr(xlErrNA)#无错误
退出功能
如果结束
pos=InStr(1,frmt,“yyyy”,vbTextCompare)
如果位置>0,则
y=Val(中间(src,位置4))
其他:pos=InStr(1,frmt,“yy”,vbTextCompare)
如果位置>0,则
y=Val(中间(src,位置2))
如果y<80,则y=y+2000,否则y=y+1900
如果结束
如果结束
位置=仪表(1,frmt,“mmm”,VBTEXT比较)
如果位置>0,则
m=月份(日期值(“01”和(中期(src,pos,3))和“2000”))
其他:pos=InStr(1,frmt,“MM”,vbBinaryCompare)
如果位置>0,则m=Val(中间(src,位置2))
如果结束
pos=仪表(1,frmt,“dd”,VBTEXT比较)
如果位置>0,则d=Val(中间(src,位置2))
pos=仪表(1,frmt,“hh”,VBTEXT比较)
如果位置>0,则h=Val(中间(src,位置2))
如果InStr(1,src,“am”,vbTextCompare)>0,则am=True
如果InStr(1,src,“a.m.”,vbTextCompare)>0,则am=True
如果InStr(1,src,“a.m.”,vbTextCompare)>0,则am=True
如果InStr(1,src,“pm”,vbTextCompare)>0,则pm=True
如果InStr(1,src,“p.m.”,vbTextCompare)>0,则pm=True
如果InStr(1,src,“p.m.”,vbTextCompare)>0,则pm=True
如果am和h=12,则h=0
如果pm和h 12,则h=h+12
位置=仪表(1,frmt,“mm”,vbBinaryCompare)
如果位置>0,则最小值=Val(中间值(src,位置2))
位置=仪表(1,frmt,“ss”,VBTEXT比较)
如果位置>0,则s=Val(中间(src,位置2))
截止日期=日期序列(y,m,d)+时间序列(h,min,s)
端函数

DateValue接受字符串并返回真实日期。在什么意义上,接受特定类型输入并返回特定输出的函数是泛型函数?我怀疑你没有使用“泛型”的标准含义。请参阅:。在上下文中,我猜想您是指内置的。您能给我们展示一个您想要转换的日期示例吗?
=VALUE()
或=
DATEVALUE()
,因为工作表公式正是这样做的。您不需要VBA。我认为只有当日期字符串具有内置函数中定义的预定义格式时,这些函数才能转换。我可以将
29.10.2018:17:48:10
转换为日期时间吗?如果有内置的工作表函数可以执行此操作,则此处完全不需要VBA。此外,您的函数假定字符串的格式,如果能够传入格式化字符串以指定datatime格式,则更有意义。您的解决方案仅适用于注释中的示例“29.10.2018:17:48:10”,而不适用于问题中的示例“20191301”。正确,但op与日期和时间有关,这些函数示例仅限于日期和时间。唯一显式定义了日期和时间的字符串op是comments.Nice和simple解析方法中的字符串op。很荣幸能保持代码简短。这就是我要找的。非常感谢阿斯格。顺便问一下,我怎样才能将AM/PM功能添加到这段代码中,或者你可以用这个功能进行更新?@AliTor我刚刚对它进行了完全编辑,以获得AM/PM。这是一个很棒的功能。它甚至适用于日期字符串,如“Wed,2020年1月29日07:00:55+0000”:TO_date(标准日期,“Day,DD-MMM-YYYY-hh:mm:ss+0000”)
=DATEVALUE(SUBSTITUTE(LEFT(A1,FIND(":",A1)-1),".","/"))+TIMEVALUE(MID(A1,FIND(":",A1)+1,20))
Public Function TO_DATE(ByRef src As String, ByRef frmt As String) As Variant
    Dim y As Long, m As Long, d As Long, h As Long, min As Long, s As Long
    Dim am As Boolean, pm As Boolean
    Dim pos As Long

    If Len(src) <> Len(frmt) Then
        TO_DATE = CVErr(xlErrNA)  ' #N/A error
        Exit Function
    End If

    pos = InStr(1, frmt, "yyyy", vbTextCompare)
    If pos > 0 Then
        y = Val(Mid(src, pos, 4))
    Else: pos = InStr(1, frmt, "yy", vbTextCompare)
        If pos > 0 Then
            y = Val(Mid(src, pos, 2))
            If y < 80 Then y = y + 2000 Else y = y + 1900
        End If
    End If

    pos = InStr(1, frmt, "mmm", vbTextCompare)
    If pos > 0 Then
        m = month(DateValue("01 " & (Mid(src, pos, 3)) & " 2000"))
    Else: pos = InStr(1, frmt, "MM", vbBinaryCompare)
        If pos > 0 Then m = Val(Mid(src, pos, 2))
    End If

    pos = InStr(1, frmt, "dd", vbTextCompare)
    If pos > 0 Then d = Val(Mid(src, pos, 2))

    pos = InStr(1, frmt, "hh", vbTextCompare)
    If pos > 0 Then h = Val(Mid(src, pos, 2))
    If InStr(1, src, "am", vbTextCompare) > 0 Then am = True
    If InStr(1, src, "a.m.", vbTextCompare) > 0 Then am = True
    If InStr(1, src, "a. m.", vbTextCompare) > 0 Then am = True
    If InStr(1, src, "pm", vbTextCompare) > 0 Then pm = True
    If InStr(1, src, "p.m.", vbTextCompare) > 0 Then pm = True
    If InStr(1, src, "p. m.", vbTextCompare) > 0 Then pm = True
    If am And h = 12 Then h = 0
    If pm And h <> 12 Then h = h + 12

    pos = InStr(1, frmt, "mm", vbBinaryCompare)
    If pos > 0 Then min = Val(Mid(src, pos, 2))

    pos = InStr(1, frmt, "ss", vbTextCompare)
    If pos > 0 Then s = Val(Mid(src, pos, 2))

    TO_DATE = DateSerial(y, m, d) + TimeSerial(h, min, s)
End Function