应用程序导出的文本字段以下面显示的格式组合日期和时间。这个格式有点不同(开头的年份之后有逗号)而不是“转换MMM DD,YYYY HH:MM:SS am in Excel”的答案,这在2014年6月2日的Stackflow上得到了回答。我尝试运行答案提供的VBA代码但是得到运行时错误13并且输入不匹配。我不太了解VBA知道我应该对VBA代码做出哪些更改。我们将非常感激地提供任何帮助。
Apr 5, 2018, 10:00 AM
Apr 15, 2018, 2:00 PM
Apr 30, 2018, 7:00 PM
答案 0 :(得分:1)
如果您正在尝试获取日期,请查看使用公式的一些想法,以帮助您理解以后使用VBA。最终,您需要创建一个可以解析为日期的字符串。在您引用的示例中,CDate
函数能够将字符串识别为日期并将其转换为Date数据类型。
1)如果Apr 5, 2018, 10:00 AM
位于A2
,您可以使用以下内容:
=DATE(RIGHT(SUBSTITUTE(LEFT(A2,FIND(", ",A2,FIND(", ",A2)+1)-1),",",""),4),MONTH(1&LEFT(SUBSTITUTE(LEFT(A2,FIND(", ",A2,FIND(", ",A2)+1)-1),",",""),3)),TRIM(MID(SUBSTITUTE(LEFT(A2,FIND(", ",A2,FIND(", ",A2)+1)-1),",",""),5,2)))
内在
=SUBSTITUTE(LEFT(A2,FIND(", ",A2,FIND(", ",A2)+1)-1),",","")
在第二个","之前获取字符串,然后替换剩下的","用""给
Apr 5 2018
公式的其余部分使用Date
函数从dateparts创建日期,即年,月,日。
有些假设表明Month将始终是3个字母的缩写。字符串中有单个空格,两边都没有额外的空格。
2)如果没有这样的假设,你可能会得到类似的结论:
=DATE(RIGHT(LEFT(TRIM(SUBSTITUTE(SUBSTITUTE(A2,",",""),CHAR(32)," ")),FIND(CHAR(1),SUBSTITUTE(TRIM(SUBSTITUTE(SUBSTITUTE(A2,",",""),CHAR(32)," ")),CHAR(32),CHAR(1),3))-1),4),MONTH(1&LEFT(LEFT(TRIM(SUBSTITUTE(SUBSTITUTE(A2,",",""),CHAR(32)," ")),FIND(CHAR(1),SUBSTITUTE(TRIM(SUBSTITUTE(SUBSTITUTE(A2,",",""),CHAR(32)," ")),CHAR(32),CHAR(1),3))-1),3)),MID(A4,4,FIND(CHAR(1),SUBSTITUTE(LEFT(TRIM(SUBSTITUTE(SUBSTITUTE(A2,",",""),CHAR(32)," ")),FIND(CHAR(1),SUBSTITUTE(TRIM(SUBSTITUTE(SUBSTITUTE(A2,",",""),CHAR(32)," ")),CHAR(32),CHAR(1),3))-1),CHAR(32),CHAR(1),2))-FIND(CHAR(1),SUBSTITUTE(LEFT(TRIM(SUBSTITUTE(SUBSTITUTE(A2,",",""),CHAR(32)," ")),FIND(CHAR(1),SUBSTITUTE(TRIM(SUBSTITUTE(SUBSTITUTE(A2,",",""),CHAR(32)," ")),CHAR(32),CHAR(1),3))-1),CHAR(32),CHAR(1),1))))
这是一个表格,解释了两者的每一步:
图片中的公式按参考编号
1)删除","和额外的空白
=TRIM(SUBSTITUTE(SUBSTITUTE(B2,",",""),CHAR(32)," "))
2)没有时间获取日期部分
=LEFT(TRIM(SUBSTITUTE(SUBSTITUTE(B2,",",""),CHAR(32)," ")),FIND(CHAR(1),SUBSTITUTE(B3,CHAR(32),CHAR(1),3))-1)
3)第一空间的位置" "
=FIND(CHAR(1),SUBSTITUTE(B4,CHAR(32),CHAR(1),1))
4)第二空间的位置" "
=FIND(CHAR(1),SUBSTITUTE(B4,CHAR(32),CHAR(1),2))
5)月份数
=MONTH(1&LEFT(B4,3))
6)年
=RIGHT(B4,4)
7)日
=MID(B4,4,FIND(CHAR(1),SUBSTITUTE(B4,CHAR(32),CHAR(1),2))-FIND(CHAR(1),SUBSTITUTE(B4,CHAR(32),CHAR(1),1)))
8)日期从日期部分Y,M,D
=DATE(B8,B7,B9)
9)上面已经给出了长公式作为第二种解决方案
10)在第二个"之前获取字符串," ,然后替换剩余的","用""
=SUBSTITUTE(LEFT(B2,FIND(", ",B2,FIND(", ",B2)+1)-1),",","")
11)作为具有许多假设的第一解决方案在顶部给出的公式
修改强>
@ Darren Bartrup-Cook指出,CDate比我想象的更有效,你可以做到: CDate(Replace(.Range("B2").Text, ",", ""))
这将保留Time元素。如果需要,我已经在回答中提前删除了time元素。或者你可以做到
Int(CDate(Replace(.Range("B2").Text, ",", "")))
原文:
使用vba,您可以使用Instr
或Instrrev
函数代替Find
来查找字符串中字符的出现位置。 Find
与范围对象一起使用,而不是在使用VBA时使用的字符串。 Instr从字符串的开头开始搜索,并从结尾开始InstrRev
,即从右到左。这意味着参数订单改变。有关这方面的更多信息,请参阅参考文献。
使用CDate
函数的简单公式为vba代码,根据您引用的答案。
Public Sub test()
With ThisWorkbook.Worksheets("Sheet1")
Debug.Print CDate(Left$(.Range("B2").Text, InStr(InStr(.Range("B2").Text, ", ") + 1, .Range("B2").Text, ", ") - 1))
End With
End Sub
上面你可以在一个循环中使用你要转换值的范围。
类似的东西:
.Range("B2") = CDate(Left$(.Range("B2").Text, InStr(InStr(.Range("B2").Text, ", ") + 1, .Range("B2").Text, ", ") - 1))
或强>
您可以将其转换为用户定义的函数,并在工作表中调用:
Public Function GetDate(ByVal rng As Range)
GetDate = CDate(Left$(rng.Text, InStr(InStr(rng.Text, ", ") + 1, rng.Text, ", ") - 1))
End Function
在工作表中调用UDF
请注意,您可以将单元格格式化为日期格式以获得正确的格式,或将函数更改为:
GetDate = Format$(CDate(Left$(rng.Text, InStr(InStr(rng.Text, ", ") + 1, rng.Text, ", ") - 1)), "dd/mm/yyyy")
参考文献:
答案 1 :(得分:1)
您没有说明要将其转换为的内容。
但是,要从字符串中提取标准Excel DATE或TIME值,只需用空格替换第二个逗号,并将TIMEVALUE或DATEVALUE函数应用于结果。
如果要创建组合日期/时间戳,请将VALUE函数或双一元应用于替换字符串:
=VALUE(SUBSTITUTE(A1,","," ",2)) or
=--(SUBSTITUTE(A1,","," ",2))
Result --> 43195.41667 which can be formatted however you want
=DATEVALUE(SUBSTITUTE(A1,","," ",2))
=TIMEVALUE(SUBSTITUTE(A1,","," ",2))