
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件)
- 最新から表示
- 回答順に表示
No.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
' ' ///
No.1
- 回答日時:
こんにちは。
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
' ' ///
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- Excel(エクセル) ¥マークを含むパスの処理について(マクロ、または関数) 2 2022/12/25 02:11
- Visual Basic(VBA) VBA。複数のChangeイベントをまとめる方法 2 2022/03/31 12:03
- Excel(エクセル) Excel VBA 3 2023/04/22 10:46
- SQL Server ACCESSで3ファイルを結合して、表を作成するやり方を教えて下さい。 17 2022/08/15 20:34
- Visual Basic(VBA) 複数シートの複数列に入力されているデータを重複なしで抽出するVBAを作りたいです。 9 2022/06/17 10:33
- SQL Server ACCESSで複数テーブルを結合して、リストを作る方法を教えてください。 2 2022/08/12 19:32
- JavaScript jsonテキストデータの並び替えができるサービスを教えてください 2 2022/08/05 20:16
- JavaScript 指定したパスが現URLに含まれていたら特定要素を削除するJavascriptのコードを教えてください 2 2023/04/27 17:58
- JavaScript JavaScript|特定URLだった時、特定の要素を変更するコードの書き方を教えてほしいです 2 2023/08/25 21:43
このQ&Aを見た人はこんなQ&Aも見ています
-
format関数について
Visual Basic(VBA)
-
VisualBasic6.0のFormat関数でmSecを表示したい
Visual Basic(VBA)
-
エクセルのエラーメッセージ「400」って?
Visual Basic(VBA)
-
-
4
EXCELでミリ秒を計算する方法
Excel(エクセル)
-
5
vba クリップボードクリアについて教えてください
その他(プログラミング・Web制作)
-
6
VB6で正確なミリ秒を計測したいのですが
Visual Basic(VBA)
-
7
Application.Runエラー(1004)
Excel(エクセル)
-
8
ExcelVBAで今開いているユーザ情報を取得できますか?
Visual Basic(VBA)
-
9
時間(ミリ秒を含む)の引き算
Visual Basic(VBA)
-
10
gif画像をエクセルのシートに貼り付けて動かしたい
Excel(エクセル)
-
11
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
12
DoEventsがやはり分からない
Visual Basic(VBA)
-
13
Excel(エクセル) VBA プロシージャーをミリ秒で繰り返し実行する方法
Excel(エクセル)
-
14
Excel VBA のFunctionプロシージャの戻り値のエラー
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
有効数字について 以前質問をし...
-
VS2010でのint float数値について
-
乱数について
-
4096bitを95種類で表現すると何...
-
計算が合わない
-
2進数 → 10進数変換 模範解答と...
-
O(n log n)について2
-
2進数の足し算(C言語)
-
VisualBasic6.0 SP5 のおもしろ...
-
0.1の10000回の累積
-
C言語の実数型の足し算
-
if文がうまく回りません。
-
VBAでの割り算の余りの求め方
-
CRCの計算方法について
-
16進数とかわからないです
-
定数の定義方法 #define
-
floatの有効桁数
-
MATLABでの行列の全要素の和
-
ExcelでPC(パソコン)によって...
-
Excelで小数点以下の値が正常に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
O(n log n)について2
-
有効数字について 以前質問をし...
-
三菱シーケンサ(Aシリーズ)で...
-
ExcelでPC(パソコン)によって...
-
c languageで 簡単な質問があ...
-
ExcelのINT関数の計算結果がお...
-
VB.net Double と...
-
VBAでミリ秒まで出力する方法
-
16進数 加算 減算 C言語
-
EXCELの関数"STDEV(標準偏差)"...
-
floatの有効桁数
-
除算を使わずに10で割りたい。
-
計算の丸め誤差の解消について
-
VB6.0での小数点の扱いについて
-
コンピューターは指数関数をど...
-
2038年問題 日付算出
-
時刻の比較
-
2進数、16進数、10進数のことを...
-
浮動小数演算は実行環境の変化...
-
2進数の足し算(C言語)
おすすめ情報