2016-11-29 11 views
0

次のコードは、一部のラップトップで問題なく動作し、次にタイプミスマッチでエラーが発生するものです。列AAには書式(mm/dd/yyyy)の日付が、列ABにはそれぞれ書式のタイム(hh:mm:ss)が付きます。 Now()から日付と時刻を差し引いています。私は本当に私のラップトップで正常に動作するため、問題のトラブルシューティングを行うことができません。他の人にとっては、それは誤りです。 CLng(CDate(Now()))には値がありますが、他の2つは型の不一致を引き起こします。私はまた、2つの下の行、日付と時刻を連結した別のものを試してみた、そして行っCLNG(CDate関数(FMTがパブリック関数であるVBA 2010 - CDateタイプの不一致の問題

'If CLng(CDate(Now())) - CLng(CDate(Range("AA" & i).Value)) + CLng(CDate(Range("AB" & i).Value)) >= 7 Then 
If CLng(CDate(Now())) - CLng(CDate(FMT(Range("AA" & i), "mm/dd/yyyy"))) + CLng(CDate(FMT(Range("AB" & i), "hh:mm:ss"))) >= 7 Then 

:私は要求しています

Public Function FMT$(ByVal Value, ByVal strFormat) 
FMT = VBA.Format$(Value, strFormat) 
End Function 

私同僚が私の地域の日付/時刻設定のスクリーンショットを送ってくれました。私はこれが事実かもしれないと思っていました。これに似た他の質問を読んだことがありますが、それを理解することはできません。

+1

「日付」の時間部分は小数部です。時間だけを含む 'Date'に' CLng'を使うと、正午から丸められます。あなたは正確に何を計算しようとしていますか? – Comintern

+0

列AAには、形式(mm/dd/yyyy)の日付が、列ABにはそれぞれの形式の時刻(hh:mm:ss)が入ります。 Now()から日時を引いてみたい。 CLngに関する情報をありがとう。最初は、日付と時刻を連結し、CLngを使用してくれました。しかし、他の人にとって、それは動作しませんでしたので、私はどのように連結したので、日付と時間を分割して何かが間違っているかもしれないと思った。しかし、そうではありませんでした。 – jmeddy

+0

AAとABの列に日付と時刻がありますか、またはそれらの列に日付と時刻のような文字列がありますか? (セルの書式を 'General'に一時的に切り替えてセルに数字を表示すると、その内容は日時になりますが、日時のようなものを表示し続けると内容は文字列になります) – YowE3K

答えて

2

列AAとABは、むしろ日付と時刻よりもテキストが含まれている場合は、次のステートメントを使用してみてください:

If Now() - (DateValue(Range("AA" & i)) + TimeValue(Range("AB" & i))) >= 7 Then 

ユーザーがローカル日付設定を持っている場合、これはおそらくまだdd/mm/yyyy、例えば、問題になる可能性がありますあなたの列には、他のロケールの日付設定の日付を表す文字列が格納されています。そのような場合は、フィールドを解析して次のようにする必要があります。

Dim myDateStr As String 
Dim myTimeStr As String 
Dim myDateTime As Date 
myDateStr = Range("AA" & i) 
myTimeStr = Range("AB" & i) 
myDateTime = DateSerial(CInt(Mid(myDateStr, 7, 4)), CInt(Mid(myDateStr, 1, 2)), CInt(Mid(myDateStr, 4, 2))) + _ 
      TimeSerial(CInt(Mid(myTimeStr, 1, 2)), CInt(Mid(myTimeStr, 4, 2)), CInt(Mid(myTimeStr, 7, 2))) 

If Now() - myDateTime >= 7 Then 
+0

それは私のために働いた!私はそれが他の人のために本当に速く働くことを確かめるつもりですが、私はこれがトリックをするかもしれないと思います。私はできるだけ早くフォローアップします。 – jmeddy

+0

私は..それぞれの個人のコードを自分の設定に基づいてカスタマイズする必要を避けるための解決策があることを期待していました。リビジョンがあるたびにそれぞれの人にこれを更新する作業がたくさんあります。これを回避するために、フォーマットをテキストから使用可能なフォーマットに変更するオプションはありますか? – jmeddy

+0

@jmeddy - AAとABの値がユーザーの日付/時刻設定に格納されている場合、私が提供した最初の方法が機能します。 AAとABの値が固定のmm/dd/yyyyとhh:mm:ss設定で格納されている場合、ユーザの設定に関係なく、私が指定した代替コードが機能します。 – YowE3K

0

YouのValue2プロパティを使用できます210オブジェクトを使用してDateTimeの数値表現を取得します。試してみてください:

If CDbl(Now()) - (Range("AA" & i).Value2 + Range("AB" & i).Value2) >= 7 Then 

ただ、それ以外の場合はDateTimeのちょうど日付部分を使用しますが、DoubleNow()を変換するようにしてください。

DateTimeの数値表現を使用する方が簡単です。地域設定をバイパスすることができます。

+0

返事をありがとう。 'Range(" AA "&i).Value2 + Range(" AB "&i).Value2)' ..上にマウスを置くと、 "AA"&i).Value2'私はMM/DD/YYYYを取得し、Range( "AB"&i).Value2'にはhh:mm:ssを取得します。 CDbl(Now())は、42703.48の数値表現を返します。地域設定を使わずに数値表現に変換する方法を見つける必要があるようですね。 – jmeddy

+0

私は100%は確信していませんが、あなたの答えは、私の日付/時刻の書式が列AA/ABのテキストでない場合にはうまくいったと思います。 – jmeddy