• ベストアンサー

秒以下は取得できないですか?

VBAで現在時刻を取得する時は秒以下は取得できないですか? Sub Nowを取得する() Debug.Print Now End Sub だと、秒までしか取得できません。 APIなどを使えば秒以下の取得は可能でしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

>Debug.Print Now 必要がなかったので、考えてもみなかったのですが、確かに、 Sub Test1() Dim myDate As Date Dim myTime As Date Dim ret As Double ret = Time MsgBox Format(ret, "hh:nn:ss.000") End Sub これでは、秒以下の数字は取れないようですね。確か、ワークシート側には、秒以下の表示はあったはずです。 以下のような、Win32 APIは、マニアックな世界なので、あまりお勧めしませんが、GetLocalTime を使って、以下のようにしてみたらいかがですか?実際は、秒以下そのものを用いるというよりも、自家製イベントなどに用いたりすることになるのでしょうから、その場合は、劇薬ですから、くれぐれも慎重にお使いください。 '//標準モジュール Private Declare Sub GetLocalTime Lib "kernel32" (lpSystem As SYSTEMTIME) Private Type SYSTEMTIME    wYear     As Integer    wMonth     As Integer    wDayOfWeek   As Integer    wDay      As Integer    wHour     As Integer    wMinute    As Integer    wSecond    As Integer    wMilliseconds As Integer End Type Private sysLocalTime As SYSTEMTIME Sub Test2()  GetLocalTime sysLocalTime  MsgBox sysLocalTime.wHour & ":" & _  sysLocalTime.wMinute & ":" & _  sysLocalTime.wSecond & ":" & _  sysLocalTime.wMilliseconds End Sub

BLKEIYIL
質問者

お礼

どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.2

3.4 1/1000秒単位の時間を取得 http://www.happy2-island.com/excelsmile/smile04/capter00304.shtml 時間を取得するときは、VBAのTime関数(※)で取れますが、Time関数で取得できるのは1秒単位です。ゲームを作る場合には「0.02秒毎に…」や「アニメーションの間隔は1.57秒」など1/100秒単位の制御をすることが多いのでTime関数では物足りません。 こんな場合(1/1000秒を取得したい場合)は、APIのGetTickCount関数、またはtimeGetTime関数を使います。ちなみに、この関数で取得できる値はWindowsが起動してから何ミリ秒経過したかという値です。 GetTickCount関数、またはtimeGetTime関数は、どちらを使ってもほとんど同じ情報を取得できますが、推奨はGetTickCount関数です。 また、これらの関数では一応1/1000秒までの時刻を取得できますが、1/1000の位はかなりいい加減なので、基本的には1/100秒単位の時間を計るときに使うと考えてください。 -------------------------------------------------------------------------------- ※Timer関数という関数で1/100単位の時間を取得できますが、日付が変わるたびに0に戻るという性質上から省略しています。なお、GetTickCount関数、またはtimeGetTime関数は、Windows起動から50日弱は0に戻りません。 GetTickCount関数を定義する API「GetTickCount関数」または「timeGetTime関数」を使うときですが、まずはこの関数がどこにある、どんなヤツなのかなど、この関数を使うための準備(宣言)を行います。 この関数を使うときは、標準モジュールを準備し(General)(Declarations)の所へ次のように記述します。なお、標準モジュールの追加方法はエクセルスマイルの「4.マクロを書く場所/標準モジュール」をどうぞ。 '標準モジュールの(General)(Declarations)へ記述します Declare Function GetTickCount Lib "kernel32" () As Long Declare Function timeGetTime Lib "winmm.dll" () As Long  ※このエクセルマクロは標準モジュール内へ記述するマクロです 簡単に説明すると、DeclareはDLLの中にある関数を呼び出すときに付ける物で、Functionは関数の宣言、次が関数名(GetTickCountまたはtimeGetTime)、Libで関数の居場所を指定します。居場所には、GetTickCountにはkernel32を、timeGetTimeにはwinmm.dllを指定してください。なお、これらの関数の戻り値はLong型です。

BLKEIYIL
質問者

お礼

どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

キーワードを「VBA FORMAT 書式 ミリ秒(1/1000秒)を求める」で検索すると サンプルを公開なさってるWebページが見つかります。

BLKEIYIL
質問者

お礼

どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • アプリケーションの横幅の値を取得したい vba

    アクセスのアプリケーションの横幅の値をvbaで取得する事は可能でしょうか? Sub サンプル() Debug.Print Application.Width End Sub はエラーになっちゃいました。

  • VBA 「何時間何分何秒」にするにはどうすればいい

    Declare Function GetTickCount Lib "KERNEL32" () As Long Sub Sample() Debug.Print GetTickCount & "ミリ秒" End Sub これで取得される値を 「何時間何分何秒」にするにはどうすればいいでしょうか? Format(GetTickCount, "hh:mm:ss") にするとなぜかオーバーフローしてしまいました。

  • VBAコードでイミディエイトウィンドウを表示する方

    VBAコードでイミディエイトウィンドウを表示する方法はありますか? 例えば、 Sub test() Debug.Print Now End Sub を実行したときに イミディエイトウィンドウが表示されていなければ結果がわかりませんよね。 Ctrl+Gでイミディエイトウィンドウを表示出来る事は知っていますが サブプロシージャーと実行とともに、 イミディエイトウィンドウをVBAで表示する方法を教えてください。 Sub test() Debug.Print Now イミディエイトウィンドウを表示 End Sub のようにしたいです。 ご回答よろしくお願いします。

  • NowとNow()とどちらを使った方が良いですか?

    どちらも結果は同じでした。 Sub test1() Debug.Print Now End Sub Sub test2() Debug.Print Now() End Sub TechNet

  • LocationNameを取得するとアウトルックが

    エクセルvba2010です。よろしくお願いします。 Sub Sample() Dim ie As Object For Each ie In CreateObject("Shell.Application").Windows() Debug.Print ie.LocationName Next End Sub このコードで、現在開いているURL名を取得すると、 アウトルックを立ち上げてると outlook:%26%2321463・・・ と言うのが取得されるのですが、これは何のパスでしょうか? メールは立ち上げていません。

  • ミリ秒を○時間○分○秒にしたい

    http://www.excellenceweb.net/vba/api/what_windows_api.html のページを参考にPC起動時間を取得したいのですが サンプルは単位がミリ秒になっています。 -------------------------------------------------- Declare Function GetTickCount Lib "kernel32.dll" () As Long Sub TEST1() Dim Tickcount As Long 'GetTickCount関数から、起動からの時間が返される Tickcount = GetTickCount() MsgBox "PC起動から " & Tickcount & " ミリ秒経過しています" End Sub -------------------------------------------------- ○時間○分○秒にしたいのですが どうすればいいでしょうか? Formatを使うと思うのですが どういうコードを書けばいいのかわかりません。 ご教授よろしくお願いします。

  • computerNameを取得したい

    UserNameではなく、computerNameを取得したい エクセルで複数人でファイルを開いてる場合、 コンピューター名を取得したいのですが Sub test1() Dim v As Variant v = ActiveWorkbook.UserStatus Debug.Print v(1, 1) End Sub これをやると、UserNameが取得されます。 UserStatusの中には、computerNameは格納されないのでしょうか? Sub test() Debug.Print Environ("computerName") End Sub で、自身のコンピューター名は取得できるのですが 複数ファイルを開いているときのみんなのコンピューター名を取得する方法を教えてください。

  • 何が間違ってるのか教えていただけませんか?

    VBAエクセルです。 *********************************************** Sub OSのDefaultPrinterを取得() Dim プリンタ As Object Set プリンタ = CreateObject("WScript.Network") Debug.Print プリンタ.SetDefaultPrinter End Sub *********************************************** を実行すると、 (Debug.Print プリンタ.SetDefaultPrinter)の部分で、 引数の数が一致していません。または不正なプロパティを指定しています。(Error 450) となってしまいます。 どう修正すれば、現在のデフォルトのプリンター名を取得できるのでしょうか? ちなみに Sub tset() Debug.Print ActivePrinter End Sub で取得出来る事は知っています。 ご回答よろしくお願いします。

  • AddressとAddressLocal 違い

    エクセルvbaなのですが Sub test01() Debug.Print Range("a1").Address Debug.Print Range("a1").AddressLocal End Sub この二つの違いは何ですか? どちらも$A$1が返るのですが。 アドレスを取得したい場合、どちらを使った方がよろしいでしょうか?

  • ●分●秒 時間 表示形式

    時間を取得するコードを使っていますが Declare Function timeGetTime Lib "winmm.dll" () As Long Sub Sample() Dim nStart As Long Dim nEnd As Long nStart = timeGetTime() nEnd = timeGetTime Debug.Print (CDbl(nEnd) - CDbl(nStart)) / 100 & "秒" End Sub これだと結果が、 11607271.9221569秒 秒になってしまいました。 ●分●秒で取得したいのですが、 どのような書式にすればよいですか?

専門家に質問してみよう