Excel VBA分隔问题和时间转换

问题描述 投票:0回答:2

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

无论如何。我们从网站导入时间表,它被保存为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列上浏览这些行,拆分然后以我们需要的格式重新组合信息,所以这看起来像Old需要这种格式 ~~~~~~~~~~~~~~~ 30米-----> .5 15米-----> .25 1小时30分钟 - > 1.5 1h ------> 1.0 15米----> .25 30米----> .5 30米----> .5 15米----> .25 1h ------> 1.0 1小时30分钟 - > 1.5 ~~~~~~~~~~~~~~~~

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

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

excel vba excel-vba
2个回答
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
投票

这将使值为列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

在没有vba的情况下执行所需操作的公式:

=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

© www.soinside.com 2019 - 2024. All rights reserved.