ちくのう症(蓄膿症)は「菌」が原因!?

現在、VB6でAPI関数timeGetTimeを使って処理時間を測定する
プログラムを作成しています。

ミリ秒まで取得・表示しているのですが、ミリ秒を含む時間の引き算方法がわかりません。
以下のような引き算を行い、処理開始・終了時間と経過時間を表示させたいです。
例)
15:13:59.054(終了時間)-15:12:57.112(開始時間)
=99:99:99.999(経過時間)

どなたか教えて頂けないでしょうか。
宜しくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

何処が不明なのでしょうか?


通常の引き算だと思いますけど …

時 - 時、分 - 分、秒.ミリ - 秒.ミリ
と言ったパートで計算すれば良いのでは 桁借りが生じるのであればそれなりに計算でしょう
経過時間は 00:01:01.942 となると思います

timeGetTimeで取得した Long型で減算してから時分秒に直してみて方が簡単かも知れませんよ

文字列になってしまっているのであれば Split関数で ":"を区切り文字にして分解して演算でしょう
    • good
    • 0

Public Function XferLongToTime(ByVal Jikan As Long) As String


  Dim H As Integer
  Dim M As Integer
  Dim S As Integer
  Dim T As Integer
    • good
    • 0

どうも間違いはなさそうな・・・。


下記の関数は、あくまでも素人の作成したもの。
世の中には、もっと洗練された書き方もあるかと思います。
質問者は、あくまでも批判的に吟味し自作の関数に挑戦して下さい。

Public Function XferTimeToLong(ByVal Jikan As String) As Long
  Dim H As String
  Dim M As String
  Dim S As String
  Dim T As String
  
  H = CutStr(Jikan, ":", 1)
  M = CutStr(Jikan, ":", 2)
  S = CutStr(CutStr(Jikan, ":", 3), ".", 1)
  T = CutStr(CutStr(Jikan, ":", 3), ".", 2)
  XferTimeToLong = T + S * 1000 + M * 60000 + H * 3600000
End Function

Public Function XferLongToTime(ByVal Jikan As Long) As String
  Dim H As String
  Dim M As String
  Dim S As String
  Dim T As String
  
  H = Jikan \ 3600000
  M = (Jikan - H * 3600000) \ 60000
  S = (Jikan - H * 3600000 - M * 60000) \ 1000
  T = Jikan Mod 1000
  XferLongToTime = Format(H, "00:") & Format(M, "00:") & Format(S, "00.") & Format(T, "000")
End Function

Public Function CutStr(ByVal Text As String, _
            ByVal Separator As String, _
            ByVal N As Integer) As String
  Dim strDatas() As String
  
  strDatas = Split("" & Separator & Text, Separator, , 0)
  CutStr = strDatas(N * Abs((N <= UBound(strDatas))))
End Function
    • good
    • 0

[イミディエイト]


? XferTimeToLong("15:13:59.054")
54839054
? XferTimeToLong("15:12:57.112")
54777112
? XferLongToTime(54839054)
15:13:59.054
? XferLongToTime(54777112)
15:12:57.112
? XferLongToTime(XferTimeToLong("15:13:59.054")-XferTimeToLong("15:12:57.112"))
00:01:01.942

服飾デザイナでプログラマではありません。
が、一旦、長整数にして計算し、その後に時刻形式に戻したらいいのじゃないかとおもいます。
XferTimeToLong()、XferLongToTime() もDim文を除けば5行程度の関数です。

※ところで、実行結果は間違いありませんか?
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVisualBasic6.0のFormat関数でmSecを表示したい

VisualBasic6.0のFormat関数で時刻をあらわす方法でFormat(CStr(Now),"h:mm:ss")としていますが、mSecをあらわすときはどうしたらいいのでしょうか。どなたか教えてください。
VB.NETのffを使ってみましたがだめでした。

Aベストアンサー

Now関数では ミリセカンドの精度は持っていないようです
dim d as Double
d = now
' 日付部分を削除
d = d - Fix(d)
' 秒単位に変換
d = d * 24. * 60 *60
' 秒部分を削除
d = d - Fix(d)
といった具合にすれば 秒未満の数値が取り出せそうですがここまでの分解能が無いため浮動小数点の誤差程度の値しか求まりません

ミリ秒を取得するのであれば WinAPIのGetSystemTimeなどを使ったほうがいいでしょう

Private Declare Sub GetSystemTime Lib "kernel32" (lpSystemTime 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
といった具合で宣言して

dim st as STSEMTIME
GetSystemTime st
debug.print st.wMilliseconds
といった具合で取り出せますよ

Now関数では ミリセカンドの精度は持っていないようです
dim d as Double
d = now
' 日付部分を削除
d = d - Fix(d)
' 秒単位に変換
d = d * 24. * 60 *60
' 秒部分を削除
d = d - Fix(d)
といった具合にすれば 秒未満の数値が取り出せそうですがここまでの分解能が無いため浮動小数点の誤差程度の値しか求まりません

ミリ秒を取得するのであれば WinAPIのGetSystemTimeなどを使ったほうがいいでしょう

Private Declare Sub GetSystemTime Lib "kernel32" (lpSystemTime As SYSTEMTIME)
Private T...続きを読む

QExcelでミリsecまでの2つの時刻の差を求める方法

タイムスタンプで、以下の時刻を表す数値があります。

18.11.31.349827
18.11.32.046075

この差をワークシート上で求めたいと思います。
何か良い方法はありませんか?

Aベストアンサー

18:11:31.349827 のように時刻形式で入力してしまうと、0.1ミリ秒の桁を
四捨五入した 18:11:31.350 でしか保存されないので困ってしまうわけですが、
秒の部分を切り離して 18:11 と31.349827にしておき、別のセルで
= 18:11 + 31.349827/(24*60*60)
とまとめてやると、ちゃんと計算できます。

QVBで時間計算

教えてください。
VBで時間の足し算をしたいのですが、方法が分かりません。
例えば、毎日の通信時間の合計を出したい場合ですが、
00:15:30(15分30秒)
00:45:31(45分31秒)
の日があったとします。
この合計は01:01:01(1時間1分1秒)になると思います。この計算ができずに困っています。
教えて頂けないでしょうか。

Aベストアンサー

こんばんは。

ヘルプに書いてありましたね。
演算子(\)

  除算を実行する前に、数式はバイト型 (Byte)、整数型 (Integer)、また
  は長整数型 (Long) の式に丸められます。

となっていましたね。うっかりしていました。

これは負の値がないのなら、単に、Int(Sum) で大丈夫のような気もしますね。

しかし、今、気が付いたのですが、
>毎日の通信時間の合計を出したい場合ですが、
>00:15:30(15分30秒)
>00:45:31(45分31秒)

累積時間の計算でしたら、私の前回のコードはダメですね。エラーが発生します。全面的に見直しました。

いくら、その都度計算していっても、累積時間だから、以下のような結果もありますね。時間(hour)は、時間(hour)だけの計算にしました。

 "25:15:40"
 "28:45:31"
 ----------
 "54:01:11"

Sub TimeCalc()
 Dim myTime1 As String, myTime2 As String
 Dim ans As String

 myTime1 = "09:15:30"
 myTime2 = "08:45:31"
 
 ans = TimeSum(myTime1, myTime2)

 MsgBox ans
End Sub
Private Function TimeSum(ByVal arg1 As String, ByVal arg2 As String) As String
 Dim h1 As Long, h2 As Long, t1 As String, t2 As String
 Dim Sum As Double, d As Long, h As Long, dh As Long
 Dim m As Long, s As Long
 
 h1 = Mid(arg1, 1, InStr(arg1, ":") - 1)
 t1 = "00:" & Mid$(arg1, InStr(arg1, ":") + 1)
  
 h2 = Mid(arg2, 1, InStr(arg2, ":") - 1)
 t2 = "00:" & Mid$(arg2, InStr(arg2, ":") + 1)
 
 If h1 + h2 > 23 Then
  d = Int((h1 + h2) / 24)
  dh = (h1 + h2) Mod 24
 Else
  dh = h1 + h2
 End If
  Sum = CDbl(TimeValue(t1)) + CDbl(TimeValue(t2))
  h = Hour(Sum): m = Minute(Sum): s = Second(Sum)
  h = d * 24 + dh + h
  TimeSum = Format$(h, "00") & ":" & Format$(m, "00") & ":" & Format$(s, "00")
End Function

こんばんは。

ヘルプに書いてありましたね。
演算子(\)

  除算を実行する前に、数式はバイト型 (Byte)、整数型 (Integer)、また
  は長整数型 (Long) の式に丸められます。

となっていましたね。うっかりしていました。

これは負の値がないのなら、単に、Int(Sum) で大丈夫のような気もしますね。

しかし、今、気が付いたのですが、
>毎日の通信時間の合計を出したい場合ですが、
>00:15:30(15分30秒)
>00:45:31(45分31秒)

累積時間の計算でしたら、私の前回のコードはダメ...続きを読む

QVB6で正確なミリ秒を計測したいのですが

VisualBasic6で処理の時間を計算したく、正確な(ミリ秒単位?)計測ができる関数を探しています。

長さは最長10日まで対応しているものはありますか?
できれば、1/1000秒以下が計れるものです。

Aベストアンサー

使ったことがあまりないので自信なし。
GetTickCountとtimeGetTime
http://www.sm.rim.or.jp/~shishido/tick.html
経過時間計測色々
http://www.bcap.co.jp/hanafusa/VBHLP/GetTime.htm

#引数がLongなので【計算してないけど10日まで対応するとはあまり思えなかったり】

QEXCELでミリ秒を計算する方法

ミリ秒単位まで入力された時刻表記のセルがあります。
このセルの値をミリ秒に換算する方法を教えてください。

【セル書式】hh:mm:ss.000 ※hhは00固定
【例】
値は、「00:01:02.123」
これを、1*60000+2*1000+123=62123(ミリ秒)
というように算出したいのです。
計算式は、「mm*60000+ss*10000+000(ミリ秒部分)」です。

VBAはやったことがないので、出来れば、関数等で出来る
方法をお願いします。

Aベストアンサー

A1が時間のセルとして
=A1*24*60*60*1000

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

QDate型の範囲を超える数値について

経過時間を求めるときに、

dim Time as Date
dim Keika as Date
Keika = Now - Time
Keika = Format(Keika, "hh:mm:ss")

でよいと思うのですが、経過時間が24時間以上になる可能性のある
プログラムはどのように書けばいいのでしょうか?
例えば、53:49:12のように計算したいのですが。
Date型は23:59:59の範囲しかダメなんですよね・・・・。

Aベストアンサー

こんにちは。itohhといいます。

たしかに、Date型だと上手く計算できません。
でも、経過時間を計算してくれる関数(DateDiff)を併用するとうまくいきますよ。

例.
Dim wTime As Date
Dim Keika As Date
Dim wBuf As String
Dim wNow As Date

wTime = DateValue("2001/7/16")
wNow = Now
Keika = wNow - wTime
wBuf = DateDiff("h", wTime, wNow) & Format(Keika, ":nn:ss")

QVB6.0の「vbFromUnicode」はVB.NETではどれに相当しますか?

VB6.0で、例:StrConv(Text, vbFromUnicode)とかで使用する、
「vbFromUnicode」(文字列を Unicode からシステムの既定のコードページに変換する)
は、VB.NETでは使用できないようです。(相当する定数はない?)

「vbFromUnicode」と同等の機能を、VB.NETで使用したいのですが、
どうすれば良いでしょうか?

Aベストアンサー

思いっきり、例文に「COM1」と書いてますが、USBに書き換えてくださいね^^;

それとふと思ったのですが
udtReaderWriterModeWithoutEncryption
変数は構造体ですよね?

メンバが
lngPortName
lngBardRate
というのは、型宣言をINTEGERに変換してますよね?

ちょっとばかり不安に思ったので、追記しておきました。

参考URL:http://okweb.jp/kotaeru.php3?q=1257613

Qラジオボタンの初期指定

ラジオボタンを12個使用する画面を今作っているのですが、初期立ち上げ時に1番目のラジオボタンを選択した状態にするのはどうすれば良いのでしょうか?

プログラムの流れ上選んでいなくても、1番目を選んだ状態に次のウィンドウは開くのですが、聞く話で、それは不安定要素があるって聞いた物ですから。

Aベストアンサー

VB.NETだったら
デザイン時に
Checkedをtrue

QVB6.0-整数と余りを求める

表題の通り、整数と余りを求める関数を教えてほしいです:例:100/60=1余り40
整数:1
余り:40
よろしくお願いいたします。

Aベストアンサー

Dim A,B,C,D as integer
A=100
B=60
C=Int(A/B) <---答は1
D=A mod B

●IntはAをBで割った時の整数部分を求める関数ですが、答が負の場合は
注意が必要です。 例 Int(-100/40)=-2
これを回避する場合 Fixがいいです

●mod は A を B で割った時の余りを求める関数


人気Q&Aランキング