转换mmm dd,yyyy,h:mm am在Excel VBA中

时间:2018-05-04 03:26:14

标签: excel vba excel-vba

应用程序导出的文本字段以下面显示的格式组合日期和时间。这个格式有点不同(开头的年份之后有逗号)而不是“转换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

2 个答案:

答案 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))))

这是一个表格,解释了两者的每一步:

Formula tables

图片中的公式按参考编号

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)作为具有许多假设的第一解决方案在顶部给出的公式

VBA:

修改

@ Darren Bartrup-Cook指出,CDate比我想象的更有效,你可以做到:

 CDate(Replace(.Range("B2").Text, ",", ""))

这将保留Time元素。如果需要,我已经在回答中提前删除了time元素。或者你可以做到

Int(CDate(Replace(.Range("B2").Text, ",", "")))

原文:

使用vba,您可以使用InstrInstrrev函数代替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

UDF

请注意,您可以将单元格格式化为日期格式以获得正确的格式,或将函数更改为:

GetDate = Format$(CDate(Left$(rng.Text, InStr(InStr(rng.Text, ", ") + 1, rng.Text, ", ") - 1)), "dd/mm/yyyy")

参考文献:

  1. Instrrev
  2. Instr
  3. Range.Find
  4. Substitute
  5. Char
  6. User Defined Functions UDF
  7. CDate

答案 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))