0

VBScript で 20:72:84(hh:mm:ss) の期間を 21:13:24 (hh:mm:ss) 形式に変換することは可能ですか?

はい、明らかにループできますが、そのようなLoopy手法は避けたいと思います。

コード

解決策に従ってSiddharth-コードを修正して適合するようにしましたVBScript platform

Option Explicit


    Dim S
    S=Convert("23:61:61")
    MsgBox(s)


Function Convert(strTime) 'As String
    Dim timeArray() 
    Dim h , m , s 

    MsgBox("Hi")

    'On Error Resume Next

    timeArray = Split(strTime, ":")

    h = timeArray(0): m = timeArray(1): s = timeArray(2)

    REM If err then

        REM MsgBox(err)
        REM err.clear
        REM Exit Function
    REM End if

    Do Until s < 60
        s = s - 60
        m = m + 1
    Loop

    Do Until m < 60
        m = m - 60
        h = h + 1
    Loop

    Do Until h < 24
        h = h - 24
    Loop

    Convert = Format(h, "00") & ":" & Format(m, "00") & ":" & Format(s, "00")

    'on Error Goto 0
    'Exit Function
'Whoa:
    'Convert = "Error! CYDD!" '<~~ CYDD : Check Your Data Dude :)
End Function

EDIT1Type mismatch行に関してエラーが発生していますtimeArray = Split(strTime, ":")

ありがとう、

4

5 に答える 5

2
  1. 配列を分割する
  2. を使用して各部分を空の時間に追加しますdateadd()
  3. stringbuilder を使用して、適切にフォーマットされた文字列に時刻を再構築します

    ' This splits the string in an hours, minutes and seconds part.
    ' the hours will be in dArr(0), minutes in dArr(1) and seconds in dArr(2)
    dArr = split("20:72:84", ":")
    
    ' Add the hours to an empty date and return it to dt1 
    dt1 = dateadd("h", dArr(0), empty)
    
    ' Add the minutes to dt1. Note: Minutes are noted as "n" and not "m" because the
    ' "m" is reserved for months. To find out more about the dateadd() please look here:
    ' http://www.w3schools.com/vbscript/func_dateadd.asp
    ' When the minutes are bigger than they fit in the date, it automatically falls over to
    ' next hour.
    dt1 = dateadd("n", dArr(1), dt1)
    
    ' Also add the seconds (the third part of the array) to dt1, also the seconds
    ' automatically fall over when too large.
    dt1 = dateadd("s", dArr(2), dt1)
    
    ' Now that we created a date, we only have to format it properly. I find it the most easy
    ' way to do this is with a dotnet stringbuilder, because we can separate code and 
    ' format. The CreateObject creates the stringbuilder. We chain the AppendFormat
    ' and the ToString methods to it, so actually these are three statements in one.
    ' Mind the HH in the HH:mm:ss format string, hh means 12 hour notation, HH means 24
    ' hour notation.
    msgbox CreateObject("System.Text.StringBuilder").AppendFormat("{0:HH:mm:ss}", dt1).toString()
    

出力21:13:24

編集: TS の要求による追加のコメント

于 2012-12-28T11:04:05.557 に答える
2

これはあなたがしようとしていることですか?

Option Explicit

Sub Sample()
    Debug.Print Convert("23:61:61")
    Debug.Print Convert("24:61:61")
    Debug.Print Convert("20:72:84")
    Debug.Print Convert("Hello World")
End Sub

Function Convert(strTime As String) As String
    Dim timeArray() As String
    Dim h As Long, m As Long, s As Long

    On Error GoTo Whoa

    timeArray = Split(strTime, ":")

    h = timeArray(0): m = timeArray(1): s = timeArray(2)

    Do Until s < 60
        s = s - 60
        m = m + 1
    Loop

    Do Until m < 60
        m = m - 60
        h = h + 1
    Loop

    Do Until h < 24
        h = h - 24
    Loop

    Convert = Format(h, "00") & ":" & Format(m, "00") & ":" & Format(s, "00")

    Exit Function
Whoa:
    Convert = "Error! CYDD!" '<~~ CYDD : Check Your Data Dude :)
End Function

スナップショット

ここに画像の説明を入力

編集(フォローアップ)

上記のコードはVBA-Excel(タグの 1 つであるため)用です。

にはVB-Script、このコードを使用します

MsgBox Convert("23:61:61")
MsgBox Convert("24:61:61")
MsgBox Convert("20:72:84")
MsgBox Convert("Hello World")

Function Convert(strTime)
    Dim timeArray
    Dim h, m, s, hh, mm, ss

    On Error Resume Next

    timeArray = Split(strTime, ":", -1, 1)

    h = timeArray(0): m = timeArray(1): s = timeArray(2)

    If Err Then
        Err.Clear
        Exit Function
    End If

    Do Until s < 60
        s = s - 60
        m = m + 1
    Loop

    Do Until m < 60
        m = m - 60
        h = h + 1
    Loop

    ' As per latest request
    'Do Until h < 24
        'h = h - 24
    'Loop

    If Len(Trim(h)) = 1 Then hh = "0" & h Else hh = h
    If Len(Trim(m)) = 1 Then mm = "0" & m Else mm = m
    If Len(Trim(s)) = 1 Then ss = "0" & s Else ss = s

    Convert = hh & ":" & mm & ":" & ss

    On Error GoTo 0
End Function

HTH

于 2012-12-27T11:49:09.217 に答える
0

これは、コメントに入れるには長すぎるテキストです。

20:72:33フォーマット中のセルに入力するGeneralと、シリアル番号が表示されます。例えば0.883715278

次に、セルの書式を に変更しますTime。そして、見たいフォーマットとデータを提供します。

しかし

上記のステートメントは、あなたの秒が である限り機能しますbelow 6060, 61, 84、「100」などを入力すると動作しません。

したがって、おそらく現在使用しているすべての妨害コードと同じように妨害することができます。;)

それは可能な限り醜いです。mod 60実行してsecondsから、セル形式を時間に変更します。または、アレックスが彼の答えでそこに示した ものを使用するのと同じように. それはきれいで、数学的に望ましい出力を保証します。

于 2012-12-27T10:46:16.803 に答える