2017-10-05 9 views
1

私は、複数の従業員が働いた合計時間を合計するスプレッドシート(​​x4)を持っています。 1人の従業員の合計は24時間になる。私の関数では、Excelが内部的に時間を表現する方法のため、1になります。 'hours'の値に基づいて、各セルの合計時間を表示するようにセルをフォーマットします。私はチェックした - typename(時間)=ダブル。時間= 1のときに時間> = 1が '真'に等しい理由がわかりません。その人のスプレッドシートの値に1分を追加すると、期待通りに機能しますか?Excel vba - 論理エラー

Public Function format_hours(hours As Variant) As Variant 
If hours >= 1 Then 
    format_hours = Application.Text(hours, "[hh]:mm") 
ElseIf hours > 0 Then 
    format_hours = Format(hours, "hh:mm") 
Else 
    format_hours = 0 
End If 
End Function 
+1

「バリアント」の使用はお勧めできません。変数の型をより強く指定すると、利点があります。 (また、 'format_hours'に' f'がありません - このようなエラーを避けるために 'Option Explicit'を使用してください) – braX

+0

私の変数 'hours'には先行スペースがあります。これを削除すると、ロジックが期待通りに機能します。そのスペースはどこから来ていますか? – Chas

+0

この関数がどのように呼び出されているのかわかりません。引数を変種ではなく数字として指定した場合は、これを早くキャッ​​チしたでしょう。 – braX

答えて

0

問題はHours as Variantおそらくは日付/ダブルStringとして通じてくる、とではないということです。あなたは明示的にDate/Doubleにチェック/変換していないので、If hours >= 1 Thenでは期待している暗黙のコンバージョンと比較を行っていない可能性があります。

解決方法:明示的な変換と比較を使用してください。暗黙のものは、必然的にこのような不思議なバグを作り出すからです。

+0

はい、それをチェックし、それはdbl​​として来ています。またキャストしようとしました。 – Chas