[[20190307211007]] 『VBA テキストファイルの日付時刻を変数に代入させ』(JIRO) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBA テキストファイルの日付時刻を変数に代入させたい』(JIRO)

初めて質問させていただきます。VBA初心者です。
どうしても分からないため、教えてください。

このような記載内容のテキストファイルがあります
日付    開始時間       終了時間
19021215 19/02/15 15:26:14.00 19/02/15 15:27:14.24

日付 開始時間 終了時間の間はタブ区切り
開始、終了の日時の間は半角スペース

上記のテキストファイルを読み込んで
開始と終了の時間差の計算を変数の中だけで求めたいのですが、
Date型に代入できません。

Sub DataRead()
Dim MyFSO As FileSystemObject
Dim Mytxt As TextStream
Dim Filename As String
Dim Nichiji() As String
Dim niti As String
Dim kaisi As String
Dim syuuryou As String
Dim dtkaisi As Date
Dim dtsyuuryou As Date
Dim Shoritime As Date

Filename=ファイルパス名
Set Mytxt=MyFSO.OpenTextFile(Filename,ForReading)
Do Until Mytxt.AtEndOfStream=True

  Nichiji = Split(Mytxt.ReadLine,vbTab)
  niti = Mid(Nichiji(0),1,6)
  kaisi = "20" & Nichiji(1)
  syuuryou = "20" & Nichiji(2)

kaisiとsyuuryouをDate型の変数に入れて差分を計算したいのですが、
型が違いますとエラーになります 
  dtkaisi = CDate(kaisi)
  dtsyuuryou = CDate(syuuryou)
  
  Shoritime = dtsyuuryou - dtkaisi

全体像としては、
テキストファイルを読み込み
処理時間の算出
処理時間が3秒以上の場合セルに書き込む
3秒未満だった場合、セルに書き込まず次の処理をする
・・・・という処理をさせたいと思っていますが・・・・
変数に代入できず・・・つまづいています。
計算はシリアル値で行いたいと思っています・・・・

よろしくお願いします。使用OSはwin7です

< 使用 Excel:Excel2010、使用 OS:unknown >


 timevalueとか?
https://www.vba-ie.net/sp/function/timevalue.php
(稲葉) 2019/03/07(木) 23:15

これでは、どうですか。
 dtkaisi = TimeValue(Left(kaisi, 19)) + Right(kaisi, 2) / 100
 dtsyuuryou = TimeValue(Left(syuuryou, 19)) + Right(syuuryou, 2) / 100

(マナ) 2019/03/07(木) 23:47


 秒以下の数字は、日付リテラルとして認識されないみたいですね。

 EVALUATEを噛ます案

   dtkaisi = Evaluate("""" & kaisi & """*1")
   dtsyuuryou = Evaluate("""" & syuuryou & """*1")

(半平太) 2019/03/08(金) 00:12


稲葉様
マナ様
半平太様

夜分の質問にも関わらず、迅速な回答ありがとうございます。
こんなに早く回答していただけるとは・・・助かります。

明日・・・(もう今日でした)試したいと思います・・・

(JIRO) 2019/03/08(金) 00:30


皆様の回答を試してみました。

読み込んだテキストファイル↓
19021515 19/02/15 15:26:14.00 19/02/15 15:27:14.24
19021518 19/02/15 18:05:00.20 19/02/15 18:05:51.66

**************************************************************

稲葉様
dtkaisi = TimeValue(kaisi)
dtsyuuryou = TimeValue(syu uryou)
結果・・・型が違いますのエラー・・・となってしまいました。

**************************************************************

マナ様
dtkaisi = TimeValue(Left(kaisi, 19)) + Right(kaisi, 2) / 100
dtsyuuryou = TimeValue(Left(syuuryou, 19)) + Right(syuuryou, 2) / 100
Debug.Print結果・・・時間のみ取得 最初の結果のみテキスト通り取得
できましたが、以降がテキストとは違う時間が取得
15:26:14
16:24:50
22:05:00
16:49:07
【質問】取り出した結果に対して 何故 /100 するのかが分からず・・・
すみません 教えてください。

**************************************************************

半平太様
dtkaisi = Evaluate("""" & kaisi & """*1")
dtsyuuryou = Evaluate("""" & syuuryou & """*1")
Debug.Print結果・・・日時取得したものの、秒未満が切り上げになる
2019/02/15 15:26:14
2019/02/15 15:27:14
2019/02/15 18:05:00
2019/02/15 18:05:52
【質問1】*1するということは、 kaisi 自身の結果を取り出す理由で*1を
かけていると理解して良いでしょうか?
【質問2】ExcelVBAでは秒未満をDateでは認識しないので、
ExcelVBAを使用するならば、その制限を考えた処理をさせる・・・
が前提になると理解で良いでしょうか?

**************************************************************

3秒以上か、未満で条件分岐をさせたいため、
kaisi = "20" & Left(Nichiji(1), 17)
syuuryou = "20" & Left(Nichiji(2), 17)
配列の時に、Leftで切ろうかと思います・・・。
こんな考えで良いのか・・・? 初心者として悩むところですが・・・。

皆様、回答ありがとうございました。

(JIRO) 2019/03/08(金) 17:14


 >Debug.Print結果・・・日時取得したものの、秒未満が切り上げになる

 そんなことないと思いますけど・・

     skaisi  = "2019/02/15 15:26:14.60"
     sKaisi2 = "2019/02/15 15:26:14.50"

     dtkaisi = Evaluate("""" & skaisi & """*1")
     dtkaisi2 = Evaluate("""" & sKaisi2 & """*1")

     Debug.Print dtkaisi - dtkaisi2 = 0 '←チャンと「False」が出ますよ。

 >【質問1】*1するということは、 kaisi 自身の結果を取り出す理由で*1を 
 >かけていると理解して良いでしょうか?

 CDate関数は、秒より下に文字が入ると「日時文字」として認識してくれない様なので、
 別手段で値を求めたんですが?

 シート上なら問題なく日時データに変換されますので、それに準じた処理をしたものです。

 >【質問2】ExcelVBAでは秒未満をDateでは認識しないので、 
 >ExcelVBAを使用するならば、その制限を考えた処理をさせる・・・ 
 >が前提になると理解で良いでしょうか? 

 いえ、ExcelVBAでも秒未満をチャンと認識します。(文字からの変換がダメなだけです)

(半平太) 2019/03/08(金) 17:43


ごめんさい。
小数点部分が問題ということだけで、
深く考えないで、適当に回答していました。
正しくは、

 /100/24/60/60

でした。
しかも、TimeValueなので、日またぐと使えません。
日付と時刻部分も分けて処理すればできそうですが、
そんな面倒なことしなくても、
半平太さんの方法で対応してください。

(マナ) 2019/03/08(金) 18:56


 私も適当に回答してすみませんでした。
(稲葉) 2019/03/08(金) 19:15

 3秒以上かどうかを判定するなら、以下の様な処理でいいんじゃないですか?

   sKaisi =  "2019/02/15 15:26:14.60"
   sKaisi2 = "2019/02/15 15:26:14.55"

   dtkaisi = Evaluate("""" & sKaisi & """*1")
   dtkaisi2 = Evaluate("""" & sKaisi2 & """*1")

   Shoritime = dtkaisi - dtkaisi2

   Debug.Print CDbl(Round(Shoritime * 86400, 2)) & " 秒掛かった" ’←「0.05 秒掛かった」と出ます

(半平太) 2019/03/08(金) 23:43


 なるほど!
ミリ秒までもとめられますね。すごいですね。
( ..)φメモメモ、勉強になりました。
JIROさん横入り済みません、お邪魔致しました。
(隠居じーさん) 2019/03/09(土) 07:55

返信が遅くなり、すみません。
稲葉様
マナ様
半平太様
皆さま 回答ありがとうございます。

稲葉様、マナ様:色々考えるきっかけを作って頂けたのでありがたいです。

半平太様:詳しい方法を教えて頂きありがとうございます。
【質問1】と【質問2】は
一度セルに書き出し→セルの値を呼び出し計算→ミリ秒まで計算できることは確認できていたのですが、
変数上で計算しようとするとDate型にならない???・・・
Evaluateを試したものの、ミリ秒が正しくでない(←これは私の確認不足、すみませんでした)
・・・なので制限があるのかな?と思い、質問させていただきました。
教えて頂いたこと、試してみたいと思います。
本当にありがとうございました。

隠居じーさん様:横入りどうぞ、どうぞ(^^)
どうやったら回答のようなことが思いつくのか・・・・すごいですね

(JIRO) 2019/03/09(土) 09:22


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.