Excel VBA分隔问题和时间转换

时间:2017-12-28 22:20:11

标签: excel vba excel-vba

所以我在工作表上遇到了一个问题,非常简单,非常简单,只是我以前没用过的东西。我已经做了一些研究,但是我无法使我的代码正确,而且我认为我已经碰到那堵墙了,我只是以不同的方式继续尝试同样的事情。

总之。我们从网站导入时间表,它被保存为excel。 'B'列具有我们需要复制到不同工作表的所有时间。 (我已经处理了部分代码)。时间显示如下:

~~~~~~~~~~~~~~~  
30m  
15m  
1h 30m  
1h  
15m  
30m  
30m  
15m  
1h  
1h 30m  
~~~~~~~~~~~~~~~~

第一个问题是我们使用的程序不是1)像h / m字符,2)不喜欢15/30/45格式(它喜欢.25,.5 .75,十进制表示)。

所以我首先尝试划分,虽然在分钟部分有点成功,但在处理小时部分时,它只是将所有内容都吹过'h',I。我的1小时30分变成了1。

我需要帮助的是如何在B列上浏览这些行,拆分然后以我们需要的格式重新组合信息,这样看起来像 旧需要这种格式
    ~~~~~~~~~~~~~~~
    30米-----> 0.5
    15米-----> 0.25
    1小时30分钟 - > 1.5
    1h ------> 1.0
    15米----> 0.25
    30米----> 0.5
    30米----> 0.5
    15米----> 0.25
    1h ------> 1.0
    1小时30分钟 - > 1.5
    ~~~~~~~~~~~~~~~~

我有大部分其他我需要的东西,只是划界是我没有搞砸的东西,而且我没有任何好的简单例子可以帮助学习。

先谢谢你。这个论坛非常精彩,充满了知识渊博和知识渊博的人,并且极大地帮助了我和我的编码能力。

2 个答案:

答案 0 :(得分:2)

以下函数将在空格处分割输入,然后计算值(如果后跟“h”)或值/ 60(如果后跟“m”):

Function HoursAndMins(inValue As String) As Double
    Dim str
    Dim part
    Dim result As Double
    str = Split(inValue, " ")
    For Each part In str
        Select Case LCase(Right(part, 1))
            Case "h"
                result = result + CDbl(Left(part, Len(part) - 1))
            Case "m"
                result = result + CDbl(Left(part, Len(part) - 1)) / 60
        End Select
    Next
    HoursAndMins = result
End Function

可以从VBA调用它,例如:

Dim answer As Double
answer = HoursAndMins("1h 30m")

或作为:

Dim answer As Double
answer = HoursAndMins(Range("B1").Value)

或者可以在Excel中使用

=HoursAndMins(B1)

(假设单元格B1包含类似1h 30m

的内容

注意:如果 想要将其用作Excel公式,Scott将为您提供更好的公式,以便您不需要将其用作UDF。

答案 1 :(得分:1)

这取值是B列,并将它们的十进制等值放在C列的同一页上。

Sub convert()
Dim outarr As Variant
Dim arr As Variant
Dim i As Long
Dim splt() As String
With Worksheets("Sheet15") ' change to your sheet
    arr = .Range("B1", .Cells(.Rows.Count, 2).End(xlUp)).Value
    ReDim outarr(1 To UBound(arr), 1 To 1)
    For i = LBound(arr) To UBound(arr)
        arr(i, 1) = Replace(arr(i, 1), "m", "")
        arr(i, 1) = Replace(arr(i, 1), "h", "|")
        arr(i, 1) = Replace(arr(i, 1), " ", "")
        splt = Split(arr(i, 1), "|")
        If UBound(splt) > 0 Then
            outarr(i, 1) = CDbl(splt(0)) + CDbl(IIf(splt(1) = "", 0, splt(1))) / 60
        Else
            outarr(i, 1) = CDbl(splt(0)) / 60
        End If
    Next i
    .Range("C1").Resize(UBound(arr), 1).Value = outarr
End With
End Sub

在不使用vb​​a的情况下执行所需操作的公式:

=IFERROR(--TRIM(SUBSTITUTE(LEFT(SUBSTITUTE(SUBSTITUTE("h" & B1,"h",REPT(" ",999),LEN("h" & B1)-LEN(SUBSTITUTE("h" & B1,"h",""))),"m",""),999),"h","")),0)+ IFERROR(--TRIM(RIGHT(SUBSTITUTE(SUBSTITUTE("h" & B1,"h",REPT(" ",999),LEN("h" & B1)-LEN(SUBSTITUTE("h" & B1,"h",""))),"m",""),999))/60,0)

列C是vba的输出,列D是公式的输出:

enter image description here