2017-11-16 8 views
0

ここに新しい。多くの話題を読むが、本当にこれを理解することはできない。 文字列をuserformテキストボックスから倍精度に変換しています。現在のコードは正常に動作します。VBA Excel TimeValue()入力可能性

Dim startingTime As Double, endingTime As Double 
Dim totalTime As Double 
On Error Resume Next 
With textbox_inMyUserform 
TimeValue(.Value) 
    If Err.Number <> 0 Then 
     startingTime = CDbl(.Value) 
     Err.Clear 
     On Error GoTo 0 
    Else 
     On Error GoTo 0 
     startingTime = 24 * TimeValue(.Value) 
    End If 
End With 

形式が正しいかどうかをチェックします。エラーがない場合は関数が他の関数で使用され、エラーの場合は通常のCdbl(.value)が実行されます。

小数点以下は小数点以下桁違いに誤って表示されません。 TimeValueのエラーのために "5"が5になると、TimeValueのエラーは発生しませんが、 "5.5"と "5,5"は5.0833333と0のそれぞれの結果を与えるエラーを引き起こさないため、 "5:30"は5,5になります。 TimeValue(.value)。私はそれらの文字列にエラーが予想されますか?

私の解決策は、小数点以下を使用しないことですが、何が間違っているのか分かりません。

ありがとうございました。だから私はそれが動作するようになったSlaiの回答に基づいて

更新
。どうやら、VBAのTimeValue()とExcelのTIMEVALUE()の動作は異なっています。また、私は後ろに「ないISERROR()場合は、」私は当初予定置く

Dim startingTime As Double, endingTime As Double 
Dim totalTime As Double 
With textbox_starttijd 
    If Not IsError(Evaluate("TIMEVALUE(""" & .Value & """)")) Then 
     startingTime = 24 * TimeValue(.Value) 
    ElseIf .Value <> vbNullString Then 
     startingTime = CDbl(.Value) 
    Else 
     startingTime = 0 
    End If 
End With 
With textbox_eindtijd 
    If Not IsError(Evaluate("TIMEVALUE(""" & .Value & """)")) Then 
     endingTime = 24 * TimeValue(.Value) 
    ElseIf .Value <> vbNullString Then 
     endingTime = CDbl(.Value) 
    Else 
     endingTime = 0 
    End If 
End With 
totalTime = endingTime - startingTime 

アップデート2
にも最新の状態にこのコードを保つことがあります。ユーザーフォーム内の空のテキストボックスがでエラーがスローされます " CDbl(.value) 'であるため、上記のコードをvbNullStringをチェックするElseIfで更新しました。Elseは私の時間を0に設定して、文字列が空になることはありません。

+0

テキストボックスに時間値を入力するだけの理由はありますか? –

答えて

0

:中

For Each s In Split("5:30 5.5 5,5 5 a") 
    v = Evaluate("TIMEVALUE(""" & s & """)") 
    Debug.Print s, IsNumeric(s), IsError(v), VarType(v), TypeName(v), v 
Next 

結果:

s    IsNumeric(s) IsError(v) VarType(v) TypeName(v) v 
5:30   False   False   5   Double   0.229166666666667 
5.5   True   True   10   Error   Error 2015 
5,5   True   True   10   Error   Error 2015 
5    True   True   10   Error   Error 2015 
a    False   True   10   Error   Error 2015 
+0

ありがとう!それは今働いている。 VBAでの時差の違いを理解していないだけに優れています。あなたのEvaluate()の構文はまだ理解できていませんが、それらの引用符はすべて理解できていませんが、後でそれを調べます。また、IsError()が正当な例であることに気付きました。私の探求のどこかで、私はそうではないと思っていました。元のコードで「エラー時に次の再開」ロジックを思いつきました。 'そうでなければIsError()'が優れています。再度、感謝します。 –

+0

@MerijnBol私は、ExcelとVBAのTimeValueの違いを認識しておらず、ほとんど試してみることで見つけました。 Excelの式には '= TIMEVALUE(" 5:30 ")のような引用符が必要です.VBAから呼び出す方法は他にありません。 'IsError'はエラー値を返す関数に対してのみ使用できるので、ランタイムエラーに対しては' On Error'が必要です。 – Slai

0

TimeValue -functionは、文字列を日付と時刻のフィールドに変換しようとします。 Excel自体と同様に動作します。セルをtimeとフォーマットし、異なる値を試してください。Excelは、その値を日付/時刻として解釈しようとします。たとえば、「5.5」は5月5日とし、TimeValueは時刻部分のみを読み取るため、0を返します。

ユーザーに時刻をhh:mmの形式で入力させ、手動で入力を確認するかregExなど)、入力フィールドをDateTimeピッカーに変更します。 Excel < = 2010では、まずツールボックスウィンドウを右クリックし、[追加のコントロール...]を選択し、[Microsoftの日付と時刻の選択]コントロールを検索します。しかし、あなたが2010を超えるエクセル上にある場合、これはもはやインストールされている、多分これは役立ちます。 あなたはおそらく代わりにエクセルTIMEVALUE関数を使用することができますExcel VBA Macro - Date/Time Picker

+0

ええ、TimeValueも日付を探していたことを気付かなかった、ありがとう。 DateTimeピッカーは私も見てみることのあるものです。情報をありがとう。 –

関連する問題