- ベストアンサー
PC起動からの時間を取得する方法
- オーバーフローしちゃった・・・
- PC起動からの時間を取得するVBAコードを紹介します。
- GetTickCount関数を使用してPC起動からの時間をミリ秒で取得し、hh:mm形式にフォーマットします。しかし、このコードを実行するとオーバーフローしてしまいます。何が原因なのか解説してください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
横からしゃしゃり出て、断定させていただきますが、 > Tickcount = Format(Tickcount, "hh:mm") 原因はココです。 とりあえず、確認。ココを Debug.Print Format(Tickcount, "hh:mm") に置き換えて動かしてみてください。 これでも、オーバーフローが出るはずです。 つまり、Tickcountの値を"hh:mm"形式にしようとした、 Format関数でのオーバーフローです。 ちなみに"hh:mm"形式を受け付けてくれる最大値は「2958465.99999421」です。 (エクセルで(普通に)表示できる小数部分桁数で、です。) これを超えるとオーバーフローします。 お試しいただけるとわかりやすいのですが、、この数字は「9999年12月31日23:59:59」です。 なので、ココが原因であると断定できるわけです。 まぁ、時刻の数値の取り扱いが根本にあるわけですが。 (その前に「ミリ秒」に関する勘違いかな。) 回避策は、他の回答にもある通りですが・・ Sub TEST1() Dim Tickcount As Long Dim HR As Long, MN As Long, SC As Long 'GetTickCount関数から、起動からの時間が返される Tickcount = GetTickCount() Tickcount = Int(Tickcount / 1000) 'ミリ秒以下は要らない HR = Int(Tickcount / 60 / 60) '○時間 MN = Int((Tickcount - (HR * 60 * 60)) / 60) '□分 SC = Tickcount - ((HR * 60 * 60) + (MN * 60)) '△秒 '○時間□□分△△秒 の形式で出力 Debug.Print "PC起動から " & HR & "時間" & Format(MN, "00") & "分" & Format(SC, "00") & "秒 経過しました" End Sub わかりやすく(づらく?)いつもより括弧()多めで書いてみていますが、 つまり割り返して求めなさい、ってことですね。 ミリ秒=1/1000秒ですから。 こんな感じが・・ベターかと思われます。 ベストとは言いません。
その他の回答 (3)
- nicotinism
- ベストアンサー率70% (1019/1452)
VBAでの話だとして。 Dim Tickcount As Long Tickcount = GetTickCount() 1/1000秒単位の値が入ります。23秒なら23*1000 これを1000で割って1秒単位にする必要があります。 さらに、 Tickcount = Format(Tickcount, "hh:mm") Format(Tickcount, "hh:mm") で日時にしたい場合には Tickcountの値を、1日を1とし日時部分は小数点で表わさねばなりません。 10000秒なら日の部分は10000/60/60/24の商、日時は余りになります。 計算結果は 0.115740740740741なので format(0.115740740740741,"hh:nn")の返り値は、02:46 になります。 Tickcountの値が適切な範囲ならオーバーフローのエラーにはならないハズ。 しかし、 Format関数が返すのは、String型なので 今度はLong(長整数型)の変数にString型を入れようとしているので データ型が合わない!と新たなエラーになるハズです。 解説はこの辺にして、あなたと同じことをしようとした方への以前の回答です。 http://okwave.jp/qa/q7312184.html #3さんの回答が上記の解説に沿ったものに近い方法です。 VBAの関数を使えば簡単になります。
お礼
回答ありがとうございました。
- ariseru
- ベストアンサー率56% (928/1657)
>Tickcount = Format(Tickcount, "hh:mm") 原因はココかな。 Tickcountという変数はLong型として宣言しているので、入れることができるデータは整数型のみです。 それなのに、「○○時間○○分」という文字列型のデータを入れようとしているんだからエラーもでますよ。 文字列型のデータを変数に入れたいのなら、String型などで宣言した別の変数に入れてください。 あとは、Format関数の使い方もダメダメですね。 Tickcountという変数がDate型(日付型)ならその使い方でいいのですが、単なるLong型のデータですとその使い方では「○○時間○○分」という形式には変換できません。 Long型から「○○時間○○分」という形式に変換したいのでしたら、地道に計算してやるしかないかと。
お礼
回答ありがとうございました。
- FEX2053
- ベストアンサー率37% (7991/21371)
Dim Tickcount As Long こいつを Dim Tickcount As Double こうしてみたら? オーバーフローするのはこの辺しかなさそうなので。
お礼
回答ありがとうございました。
お礼
回答ありがとうございました。