在Excel中将字母数字字符串计算为整数

时间:2014-06-26 17:19:42

标签: string excel excel-vba time excel-formula vba

我有一个问题,即使其他帖子中提到的很多想法,我也无法弄明白。我的数据来自Excel,以下是任何给定单元格可能拥有数据的每种方式的示例:

4days 4hrs 41mins 29seconds
23hrs 43mins 4seconds
2hrs 2mins 
52mins 16seconds

最终结果是计算总分钟数,同时允许忽略秒数,以便先前的值最终如下:

6041
52
1423
122

有人会知道怎么做吗?

感谢您的帮助!

4 个答案:

答案 0 :(得分:1)

单点乏味(假设单位总是复数 - 也会产生不同顺序的结果)但是,仅使用公式,如果您的数据位于A列中,则位于B1中并向下复制:

="="&SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"days","*1440+"),"hrs","*60+"),"mins","*1+"),"seconds","*0")," ","")&0  

然后复制B并将特殊值粘贴到C中,并使用Tab作为分隔符将文本应用于列到C。

答案 1 :(得分:1)

数组公式** 也应该有效:

= SUM(IFERROR(0 + MID(REPT("",31)& SUBSTITUTE(A1&" dayhrminsecond","",REPT ("",31)),查找({"日"," hr"," min""第二&# 34;},REPT("",31)& SUBSTITUTE(A1&" dayhrminsecond","",REPT("&#34) ;,31))) - 31,31),0)* {1440,60,1,0})

此致

**数组公式的输入方式与'标准'相同。公式。您只需按住CTRL和SHIFT键,然后按ENTER键,而不是按ENTER键。如果您已正确完成,您会注意到Excel在公式周围放置了大括号{}(尽管不要尝试自己手动插入这些括号)。

答案 2 :(得分:0)

最简单的选项可能是带正则表达式的VBA。然后,您可以轻松找到每个字段,并进行数学运算。

如果你想坚持使用“纯粹的”Excel,那么似乎只有选择是使用SEARCHFIND来查找每个“天”,“小时”的位置,文中的“分钟”(你可能需要检查它们是否总是复数)。然后使用MID和上面找到的位置来提取不同的组件。有关类似示例,请参阅http://office.microsoft.com/en-gb/excel-help/split-text-among-columns-by-using-functions-HA010102341.aspx

但是有一些工作要处理缺少某些组件的情况,所以要么你会使用相当多的单元格,所以你会得到一个非常复杂的公式......

答案 3 :(得分:0)

这是一个用VBA编写的用户定义函数,它以字符串作为参数并返回分钟数。只检查时间间隔名称的第一个字符(例如d,h,m),因为这似乎提供了足够的区别。

要输入此用户定义函数(UDF),请打开Visual Basic编辑器。 确保在Project Explorer窗口中突出显示您的项目。 然后,从顶部菜单中选择“插入/模块” 将下面的代码粘贴到打开的窗口中。

要使用此用户定义函数(UDF),请输入类似

的公式

= SumMinutes(A1)

在某个单元格中。

Option Explicit
Function SumMinutes(S As String) As Long
    Dim RE As Object, MC As Object
    Dim lMins As Long
    Dim I As Long

Set RE = CreateObject("vbscript.regexp")
With RE
    .Pattern = "(\d+)(?=\s*d)|(\d+)(?=\s*h)|(\d+)(?=\s*m)"
    .Global = True
    .ignorecase = True
    If .test(S) = True Then
        Set MC = .Execute(S)
        For I = 0 To MC.Count - 1
            With MC(I)
            lMins = lMins + _
                    .submatches(0) * 1440 + _
                    .submatches(1) * 60 + _
                    .submatches(2)
            End With
        Next I
    End If
End With

SumMinutes = lMins

End Function