从一个单元格中提取2次,并放入两个不同的列?

我有一个像这样的电子表格:

B栏:

The Auditor arrived at 9am and left at 2pm The Auditor arrived 09:00, left 16:00 

我想提取审计员到达的开始时间,并将其放置在C列中,如下所示:

C栏

 9 9 

然后提取结束时间并将其放入D列。

D栏

 2 4 

然后在E栏中,我想要统计审核员在现场的小时数:

E栏

 5 7 

目前我正在使用这个公式来识别我的单元格中第一个数字的位置:

这是CI列中用来尝试和检索数字的公式:

 =MID(B18,MIN(FIND({0,1,2,3,4,5,6,7,8,9},B18&"0123456789")),1) 

我的问题是这只有当开始时间是一个数字不是两个或两个以上,所以要么上午9点不是09:00。

请有人可以告诉我最好的方法来做到这一点?

这是一个VBA解决scheme。 即使你没有要求VBA,为此目的的UDF(用户定义函数)编写起来也相对简单,将来也可以进行修改。 我用正则expression式来认识时间。

可接受的时间格式包括在您的示例中显示的那些,在数字和am / pm之间有空格或不存在空格,以及像下午2:00或类似的时间。 如果需要,可以很容易地添加其他时间格式。

要input这个用户自定义函数(UDF), alt-F11打开Visual Basic编辑器。 确保您的项目在“项目浏览器”窗口中突出显示。 然后,从顶部菜单中select插入/模块,然后将下面的代码粘贴到打开的窗口中。

要使用这个用户定义函数(UDF),input一个像

 =ExtrTm(B1) =ExtrTm(B1,1) =ExtrTm(B1,2) 

在一些细胞。

第二个参数(如果省略则默认为1)决定是否从string中提取第一个或第二个(如果有更多的话)。

编辑:代码编辑,以提供正则expression式,允许可选地使用dot. )作为时间分隔符。


 Option Explicit Function ExtrTm(S As String, Optional tmIndex As Long = 1) As Date Dim RE As Object, MC As Object 'Const sPat As String = "\d+(?::\d+)?\s*(?:am|pm)?" 'To allow for optional use of dot as a time separator, use Const sPat As String = "\d+(?:[:.]\d+)?\s*(?:am|pm)?" Set RE = CreateObject("vbscript.regexp") With RE .Global = True .Pattern = sPat .ignorecase = True If .test(S) = True Then Set MC = .Execute(S) ExtrTm = CDate(MC(tmIndex - 1)) End If End With End Function 

结果是一个Excel时间,这是一天的一小部分。 如果您按照时间格式化结果,您将以可读的方式查看结果。 如果您需要小数点时间(例如乘以小时率),则只需将返回值乘以24即可。

在这里输入图像说明

你可以试试这个可怕的公式吗? 把它放在C18单元上

=24*IF(OR(IFERROR(FIND("am";MID(B18;MIN(FIND({0;1;2;3;4;5;6;7;8;9};B18&"0123456789"));5);1);0)>0;IFERROR(FIND("pm";MID(B18;MIN(FIND({0;1;2;3;4;5;6;7;8;9};B18&"0123456789"));5);1);0)>0)=TRUE;TIMEVALUE(MID(MID(B18;MIN(FIND({0;1;2;3;4;5;6;7;8;9};B18&"0123456789"));5);1;MIN(FIND({"am";"pm"};MID(B18;MIN(FIND({0;1;2;3;4;5;6;7;8;9};B18&"0123456789"));5)&"ampm";1)-1))&" "&MID(MID(B18;MIN(FIND({0;1;2;3;4;5;6;7;8;9};B18&"0123456789"));5);MIN(FIND({"am";"pm"};MID(B18;MIN(FIND({0;1;2;3;4;5;6;7;8;9};B18&"0123456789"));5)&"ampm";1));2));TIMEVALUE(MID(B18;MIN(FIND({0;1;2;3;4;5;6;7;8;9};B18&"0123456789"));5)))