2016-02-18 18 views
6

昨夜、私はそれを理解する前に、良い10分、15分間に合わせるようなものに遭遇しました。しかし、私は理解していないなぜそれはこの方法です、だから私はここに誰かが解明することを望んでいます。 VBA IDEでのイミディエイトウィンドウから文字列からのフォーマットの出力

?Format(0.5, "HH:MM AM/PM") 
12:00 PM 
?Format("0.5", "HH:MM AM/PM") 
12:05 AM 
?Format(CDbl("0.5"), "HH:MM AM/PM") 
12:00 PM 

this pageから私は一時間は0.04166 ...((12 * (1/24) = 0.5))であるため、0.5は、12時00分PMに対応しなければならないことがわかります。そして、私が数字をFormat()に渡しても、同じ数字を文字列として渡しても、あなたが見ることができます。

1分は0.00069444 ...((1/(24*60)))です。つまり、12:05 AMは0.003472222((0 * (1/24)) + (5 * (1/(24*60))))としてExcelに保存する必要があります。そして、実際には:

?Format(0.003472222, "HH:MM AM/PM") 
12:05 AM 

私は理解していないいくつかのより多くの奇妙:私はドキュメントで見つけることができる

?Format(2.5, "HH:MM AM/PM") 
12:00 PM 
?Format("2.5", "HH:MM AM/PM") 
02:05 AM 

しかし...

?Format(2.523, "HH:MM AM/PM") 
12:33 PM 
?Format("2.523", "HH:MM AM/PM") 
12:33 PM 

すべてはタイムズ紙がある」と述べています実数の一部として格納されます。小数点の右側の値は時間を表します。たとえば、正午(12:00 PM)は0.5で表されます。 (Excel 2010に組み込まれているVBE用語集から) = (12 * (1/24)) + (33 * (1/(24*60)))のため、小数点以下の部分は0.5となり、2.523の結果は12:33 PMになるため、2.5の時刻は12:00 PMになります。しかし、VBAはそのうちの1つに対して正しい結果しか返しません。

だから誰も説明することができますなぜ VBAには一貫性のない動作があるようですか?それとも、シワがあるのですか?

これがExcel 2010で試験し、2013年

+1

と明示的なタイプが重要であるとさせるVBAは、あなたのための暗黙の型変換を行う理由ですが、言語ので、多くの人々のためheadscratcherになります。いい投稿! –

答えて

4

あなたは、二重に0.5を変換するFormatを期待するが、それはしない:Doubleに変換するとき

文字列のすべてが、同じ結果を与えます。それが(そのために)、日付/時刻、時間、または日付ならhttps://msdn.microsoft.com/en-us/library/ee198964.aspxによると、文字列の日付への暗黙のlet変換は、日付に変換し、

  • を行きます。
  • Doubleの範囲内にある場合は、doubleに変換してからdateに変換します。
  • いずれも該当しない場合は、エラーを返します。

ダブルに変換していないので、最初の箇条書きで変換する必要があります。それはそうです。 "0.5"は時間だと仮定しています。 https://msdn.microsoft.com/en-us/library/dn528865.aspxによれば、小数点は有効な時間区切り文字です。

time-separator = *WSC (":"/".") *WSC 
+0

私が見ていた振る舞いを完全に説明した素晴らしいリンク、ありがとう! –

2

違いは、あなたがDoubleStringをフォーマットするVBAを求めているということです。あなたはVBAがdouble値と同じ方法で文字列値を解釈することを期待しています。

真夜中を表す文字列がある場合は、​​または00:00(24時間形式)です。 VBAは同じ方法でセパレータを:または.のいずれかと解釈しています。だから、真夜中後5分を表現するためにフォーマットされたStringのために、あなたは12:05 AM00.050.50:05、または0:5を書くことができます。また、関数CDATEを見てください。

?Cdbl(CDate("00.05")) 
3.472222222222222E-02 
関連する問題