アプリ版:「スタンプのみでお礼する」機能のリリースについて

http://oshiete.goo.ne.jp/qa/8953402.html

このページで日時の出力方法について教えていただきました。

配列aaa(0)に日時が入っており、

Forループを使って、0.3秒ずつ増やしていくようなことがしたいのですが
ミリ秒の扱い方がどうしても分かりません。


aaa(0) = DateSerial(2015, 2, 24) + TimeSerial(16, 23, 16)

For i = 1 to 256

aaa(i) = aaa(i - 1) + 0.3 / 24 / 3600
bbb(i) = Format(aaa(i), "yyyy_mmdd_hhnn_ss.fff")

next i

というようなことがしたいのですが
bbbにミリ秒まで代入するにはどうしたら良いですか?

A 回答 (2件)

#1です。

追加補足です。

眠りに付こうとした時に、最近他所の質問掲示板でご指摘を受けた、
私がよく忘れるメソッドのことを思い出して、試してみたら、
誤差のバラつきについては比較的簡単に改善されました。
要は、Excelに備わっている演算誤差補正機能を活用すれば
簡単に精度を高められるみたいです。
  ="2015/02/24 16:23:16"+"0:0:0.300"*i
という数式をExcelに計算させる、というものです。
この方法だと、0.3秒を指す数値が、
3.47222E-06
3.47223E-06
という2種類の数値に絞れましたから、
これ以上の精度はExcelには無理なのかな?と思っています。
誤差がなくなることはないので、、、。

上記のExcel数式をExcelに問い合わせて計算させたのが、
以下のマクロです。
こんな訳の解らないマクロを使うこともないかも知れませんが、
VBAでまともにやるよりはExcelに計算させる方が
より簡単に精度を高められた、という、参考情報です。
この件に限らず、時刻(特に日付+時刻)の扱いは、
Excelに任せた方が安定的なのかも知れませんね。

> Forループを使って、0.3秒ずつ増やしていくようなことがしたいのですが
> ミリ秒の扱い方がどうしても分かりません。

というご質問からすれば、予想外の話になっているかも知れませんが、
もし、お求めの答が見つけられないようでしたら、補足してみて下さい。

' ' ///
Sub Re8954373ExStr2Dbl()
Const ミリ秒間隔 = 300 ' ←0.3秒の場合
Dim aaa(256) As Double
Dim bbb(256) As String
Dim dtBasTime As Date
Dim sInterval As String
Dim sBasTime As String
Dim sFml As String
Dim i As Long
  dtBasTime = DateSerial(2015, 2, 24) + TimeSerial(16, 23, 16)
  sBasTime = """" & Format(dtBasTime, "yyyy/mm/dd hh:mm:ss") & """"
  sInterval = """0:0:0." & ミリ秒間隔 & """"
  sFml = sBasTime & "+" & sInterval & "*"
  With Application
    For i = 0 To 256
      aaa(i) = .Evaluate(sFml & i)
      bbb(i) = .Text(aaa(i), "yyyy_mmdd_hhmm_ss.000")
    Next i
  End With
' ' 以下、確認用。A1:B257に結果を返します。
  Cells(1).Resize(257).Value = Application.Transpose(aaa())
  Cells(1).Resize(257).NumberFormat = "yyyy_mmdd_hhmm_ss.000"
  Cells(2).Resize(257).Value = Application.Transpose(bbb())
End Sub
' ' ///
    • good
    • 0

こんにちは。



Excel VBA でということだと、直接的には
日付型ではミリ秒を処理できませんので、
Double型やVariant/Decimal型などを使うことになりますが、
こちらで用意したのはDouble型で日付を処理する方法で、
書き方やデータ型は違いますが、ご提示の記述と同質の処理
をするものにしました。
ExcelやExcel VBAで扱う小数点数は浮動小数点数です。
「浮動小数点数」の演算には必ず「丸め誤差」が発生します。
今回のミリ秒に関する処理で得た数値を再び演算に使うような場合は、
この誤差のことを念頭に入れておいてください。
そういう意味では文字列値として保持したデータを基に
日付を再合成するような運用の方が難しいながらも正確かも知れません。
もしも、Excel上での演算の精度が問題になるような場合なら、
一日を86400000ミリ秒として、最初からミリ秒単位の
整数データとして、日付を扱うことも検討してみては如何でしょう。

もう少しマメに処理してあげれば、
「丸め誤差」を減らしたり、「丸め誤差」のバラつきを改善したり、
ということも出来ますが、Excekシートに表示する限りでは、
見た目上には問題ありませんから、
最も簡単と思える記述、を選んでお応えしています。

#もしかしたら、精度を高める為に今も注力されている方が居らして、
 また、後から他の回答が付くことになるのかも知れませんね。

' ' ///
Sub Re8954373Dbl()
Const ミリ秒間隔 = 300 ' ←0.3秒の場合
Dim aaa(256) As Double
Dim bbb(256) As String
Dim dblInterval As Double
Dim dblBasTIme As Double
Dim i As Double
  dblBasTIme = CDbl(DateSerial(2015, 2, 24) + TimeSerial(16, 23, 16.3))
  dblInterval = CDbl(ミリ秒間隔) / CDbl(86400000)
  For i = 0 To 256
    aaa(i) = dblBasTIme + dblInterval * i
    bbb(i) = Application.Text(aaa(i), "yyyy_mmdd_hhmm_ss.000")
  Next i
' ' 以下、確認用。A1:B257に結果を返します。
  Cells(1).Resize(257).Value = Application.Transpose(aaa())
  Cells(1).Resize(257).NumberFormat = "yyyy_mmdd_hhmm_ss.000"
  Cells(2).Resize(257).Value = Application.Transpose(bbb())
End Sub
' ' ///
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています