Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5193 / 13646 ツリー ←次へ | 前へ→

【52083】時刻同士の計算(ミリ秒単位)方法ってありますか ふぁっしー 07/10/19(金) 15:00 質問[未読]
【52084】Re:時刻同士の計算(ミリ秒単位)方法って... ichinose 07/10/19(金) 17:43 発言[未読]
【52136】Re:時刻同士の計算(ミリ秒単位)方法って... ふぁっしー 07/10/23(火) 14:40 お礼[未読]
【52138】Re:時刻同士の計算(ミリ秒単位)方法って... ichinose 07/10/23(火) 20:42 発言[未読]
【52141】Re:時刻同士の計算(ミリ秒単位)方法って... ふぁっしー 07/10/24(水) 14:05 お礼[未読]
【52085】Re:時刻同士の計算(ミリ秒単位)方法って... neptune 07/10/19(金) 17:51 発言[未読]
【52137】Re:時刻同士の計算(ミリ秒単位)方法って... ふぁっしー 07/10/23(火) 15:26 お礼[未読]
【52142】Re:時刻同士の計算(ミリ秒単位)方法って... neptune 07/10/24(水) 15:03 発言[未読]
【52162】Re:時刻同士の計算(ミリ秒単位)方法って... ふぁっしー 07/10/25(木) 22:03 お礼[未読]

【52083】時刻同士の計算(ミリ秒単位)方法ってあ...
質問  ふぁっしー  - 07/10/19(金) 15:00 -

引用なし
パスワード
   はじめまして。
Excel2000 を利用しているものです。

現在次のことで悩んでいます。
50ミリ秒間隔でデータが記述されているCSVファイルが2つあります。二つのファイルは同期がとられていないため、CSV内に記述されている時間データを比較することで、可能な限り近い時間のデータ同士を比較したいと考えています。CSVを吐き出す機械の時刻設定が手動のため、機器の内部時計での同期もとれない状況です。

例 Data1.CSVとData2.CSVの比較

Data1.CSV           Data2.CSV
時間[mm:ss:000]   データ  時間[mm:ss:000]     データ      
01:00:050      100    01:00:331        40
01:00:100      101    01:00:381        25
01:00:150      100    01:00:431        20
01:00:200      100    01:00:481        20
01:00:250      100    01:00:531        20
01:00:300      100    01:00:581        20
01:00:350      200    01:00:631        30

このようなデータがあったとき、
Data1.CSVの01:00:350の200というデータと
Data2.CSVの01:00:331の40というデータを
比較したいです。

second()のようにシリアル値から秒ではなく、ミリ秒を算出する関数があれば可能だと思うのですが、見つけることができませんでした。
皆様のお力をお貸しください。

【52084】Re:時刻同士の計算(ミリ秒単位)方法っ...
発言  ichinose  - 07/10/19(金) 17:43 -

引用なし
パスワード
   ▼ふぁっしー さん:
こんばんは。


>
>例 Data1.CSVとData2.CSVの比較
>
>Data1.CSV           Data2.CSV
>時間[mm:ss:000]   データ  時間[mm:ss:000]     データ      
>01:00:050      100    01:00:331        40
>01:00:100      101    01:00:381        25
>01:00:150      100    01:00:431        20
>01:00:200      100    01:00:481        20
>01:00:250      100    01:00:531        20
>01:00:300      100    01:00:581        20
>01:00:350      200    01:00:631        30
↑Excelシートにこの形式では、シリアル値として正しくは入力はできませんよね?
↑これをセルに入力するには、文字列として指定しなければ設定できません。

>second()のようにシリアル値から秒ではなく、ミリ秒を算出する関数があれば可能だと思うのですが、見つけることができませんでした。

シリアル値として、入力するには 01:00.331という形式にしないと入力できませんよね?
文字列としての時間から秒以下を取得するなら、

=VALUE(TEXT(SUBSTITUTE(C2,":",".",2),"s.000")-INT(TEXT(SUBSTITUTE(C2,":",".",2),"s.000")))
MM:SS.000 の書式でよいなら、

=VALUE(TEXT(C3,"s.000")-INT(TEXT(C3,"s.000")))
こんな数式で秒以下の値が取得できます。

【52085】Re:時刻同士の計算(ミリ秒単位)方法っ...
発言  neptune  - 07/10/19(金) 17:51 -

引用なし
パスワード
   ▼ふぁっしー さん:
>このようなデータがあったとき、
>Data1.CSVの01:00:350の200というデータと
>Data2.CSVの01:00:331の40というデータを
>比較したいです。

殆ど検証してないのですが、検証は出来るようです。
※↑なので保障なし+このままでは実用不可
Sub t()
  Dim Ret1 As Date, Ret2 As Date
  
  Ret1 = FormatTime("01:00:050")
  Ret2 = FormatTime("01:00:100")
  
  MsgBox "Ret2 > Ret1 :" & (Ret2 > Ret1)
End Sub

'これにはデータ確認の処理が必要。サンプルなのでしてない。
Function FormatTime(pData As String) As Date
Dim sBuf() As String
Dim dtmBuf As String
Dim dblBuf As Double
Const sSpliter As String = ":"

  sBuf = Split(pData, sSpliter)
  dtmBuf = Format(CDate("00" & sSpliter & sBuf(0) & sSpliter & sBuf(1)), "hh:mm:ss")
  If sBuf(2) > 0 Then
    dblBuf = Val(sBuf(2)) / (24 * 60) / 60 '秒以下を秒単位に成型 data/1日の分(1440分)/60秒
  End If
  dtmBuf = dtmBuf + CDate(dblBuf)
  FormatTime = dtmBuf
End Function

>second()のようにシリアル値から秒ではなく、ミリ秒を算出する関数があれば可能だと思うのですが、見つけることができませんでした。
関数は無いです。

【52136】Re:時刻同士の計算(ミリ秒単位)方法っ...
お礼  ふぁっしー  - 07/10/23(火) 14:40 -

引用なし
パスワード
   ▼ichinose さん:
出張のため返信が遅れてしまい申し訳ありませんでした。
ichinoseさんから教えていただいた方法でうまくできました。

ただ、ひとつ
=VALUE(TEXT(SUBSTITUTE(C2,":",".",2),"s.000")-INT(TEXT(SUBSTITUTE(C2,":",".",2),"s.000")))
のINTが入っている状態だとERRORとなってしまうので、INTをはずした状態にしたらうまくいきました(型が合わないためでしょうか?)。

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

【52137】Re:時刻同士の計算(ミリ秒単位)方法っ...
お礼  ふぁっしー  - 07/10/23(火) 15:26 -

引用なし
パスワード
   neptune さん

返信が遅れてしまい申し訳ありません。
貴重な情報ありがとうございます。

文字列操作でうまいことすれば計算できるのですね。
大変参考になりました。
ご回答いただきありがとうございました。

【52138】Re:時刻同士の計算(ミリ秒単位)方法っ...
発言  ichinose  - 07/10/23(火) 20:42 -

引用なし
パスワード
   ▼ふぁっしー さん:
こんばんは。

>ただ、ひとつ
>=VALUE(TEXT(SUBSTITUTE(C2,":",".",2),"s.000")-INT(TEXT(SUBSTITUTE(C2,":",".",2),"s.000")))
>のINTが入っている状態だとERRORとなってしまうので、INTをはずした状態にしたらうまくいきました(型が合わないためでしょうか?)。
ん?INT関数を外してしまうと正しい数値は出ないはずなんですが・・・。

VBAで数式のサンプルを作成しました。

新規ブックの標準モジュールに
'=============================================================
Sub main()
  With Range("a1")
    .NumberFormatLocal = "@"
    .Value = "01:00:331"
    MsgBox "セルA1の " & .Value & "から、セルA2に秒以下の値を取得します"
    With .Cells(2)
     .NumberFormatLocal = "G/標準"
     .Value = "=VALUE(TEXT(SUBSTITUTE(a1,"":"",""."",2),""s.000"")-" & _
         "INT(TEXT(SUBSTITUTE(a1,"":"",""."",2),""s.000"")))"
     End With
    End With
  MsgBox "いかがですか?"
End Sub

上記のmainを実行してみてください。

アクティブシートのセルA1に文字列として01:00:331が入力されます。
このセルA1の値に対して、セルA2に
=VALUE(TEXT(SUBSTITUTE(A1,":",".",2),"s.000")-INT(TEXT(SUBSTITUTE(A1,":",".",2),"s.000")))

という数式で 0.331が取得されるはずです。

再度、確認してみてください。

尚、Excel2002で確認しました。

【52141】Re:時刻同士の計算(ミリ秒単位)方法っ...
お礼  ふぁっしー  - 07/10/24(水) 14:05 -

引用なし
パスワード
   ▼ichinose さん

ご指摘ありがとうございます。
載せていただいたマクロ実行してみました。
結果、セルA1のミリ秒以下の値がセルA2に表示されました。

私は、
Sub main()
  Range("A1").NumberFormatLocal = "@"
  Range("A1").Value = "01:00:331"
  Range("A2").NumberFormatLocal = "@"
  Range("A2").Value = "01:00:382"
  
  Range("B1").Value = "=VALUE(TEXT(SUBSTITUTE(a2,"":"",""."",2),""s.000"")-" & _
         "(TEXT(SUBSTITUTE(a1,"":"",""."",2),""s.000"")))"
End Sub

このように利用するものだと思い込んでいて、ichinoseさんが意図していたことを正確に捉えていませんでした(すいません)。

丁寧に対応していただきありがとうございました。

【52142】Re:時刻同士の計算(ミリ秒単位)方法っ...
発言  neptune  - 07/10/24(水) 15:03 -

引用なし
パスワード
   ▼ふぁっしー さん:
こんにちは

もう見ないかな?

たぶん利用することは無いでしょうが、
>dtmBuf = Format(CDate("00" & sSpliter & sBuf(0) & sSpliter & sBuf(1)), "hh:mm:ss")
の"00"ですが、これはUPされていたデータの全てが、分単位で、時間単位の物が
無かった為ですので、念の為。時間単位があるならそのように改造必要です。

もし、使うなら、思いつくままに書いたので関数の処理はもっと整理できますね。
但し、エラーの出ないように各データのチェックはしなければなりませんけど。

【52162】Re:時刻同士の計算(ミリ秒単位)方法っ...
お礼  ふぁっしー  - 07/10/25(木) 22:03 -

引用なし
パスワード
   neptune さん

度々のフォローありがとうございます。
時間混みだと、

Sub t()
  Dim Ret1 As Date, Ret2 As Date
 
  Ret1 = FormatTime("05:01:00:050")
  Ret2 = FormatTime("05:01:00:100")
 
  MsgBox "Ret2 > Ret1 :" & (Ret2 > Ret1)
End Sub

'これにはデータ確認の処理が必要。サンプルなのでしてない。
Function FormatTime(pData As String) As Date
Dim sBuf() As String
Dim dtmBuf As String
Dim dblBuf As Double
Const sSpliter As String = ":"

  sBuf = Split(pData, sSpliter)
  dtmBuf = Format(CDate(sBuf(0) & sSpliter & sBuf(1) & sSpliter & sBuf(2)), "hh:mm:ss")
  If sBuf(3) > 0 Then
    dblBuf = Val(sBuf(3)) / (24 * 60) / 60 '秒以下を秒単位に成型 data/1日の分(1440分)/60秒
  End If
  dtmBuf = dtmBuf + CDate(dblBuf)
  FormatTime = dtmBuf
End Function

というように変更する必要があるのですね。
私では思いつかない方法なので、大変参考になりました。
丁寧かつ迅速に対応していただきありがとうございました。

5193 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free