質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.48%

vbsで時間の足し算をしたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,147

score 50

一覧のファイルから、
①時間の足し算を行いたい項目を抽出
②そこから時間の足し算を行いたい
のですが、①の時点で、カラムのデータ型が変わってしまいます。
そのため、②の処理にたどり着けません

データの抽出でカラム指定、あるいは時間型のまま抽出するにはどのようにすればよいのでしょうか?

以下、①の項目を抽出しようとしているコードです

Dim objADO
Dim strPath

strPath = "c;\csvdata\"

Set objADO = CreateObject("ADODB.Connection")
objADO.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=" & _
            strPath & ";ReadOnly=0"

objADO.Execute "SELECT * INTO time_master.csv " & _
" FROM master1.csv where 選択カラム = '終了';"

objADO.Close
Set objADO = Nothing

````````````````````````````````````````````````````````````

入力ファイル:master1.csv

カラム1,日時,選択カラム,利用時間表示
PC1,2019/2/6 9:56,終了,0:00:05
PC1,2019/2/6 9:56,開始,0:00:05
PC1,2019/2/6 9:41,終了,0:02:23
PC1,2019/2/6 9:39,開始,0:02:23
PC1,2019/2/6 9:23,終了,0:05:08
PC1,2019/2/6 9:18,開始,0:05:08
PC2,2019/2/6 15:18,終了,2:19:53
PC2,2019/2/6 12:58,開始,2:19:53
PC2,2019/2/6 12:06,終了,0:00:44
PC2,2019/2/6 12:05,開始,0:00:44
PC2,2019/2/6 12:01,終了,1:27:49
PC2,2019/2/6 10:33,開始,1:27:49
PC1,2019/2/8 9:56,終了,1:00:05
PC1,2019/2/8 9:56,開始,10:00:05
PC1,2019/2/8 9:41,終了,1:02:23
PC1,2019/2/8 9:39,開始,1:02:23
PC1,2019/2/8 9:23,終了,1:05:08
PC1,2019/2/8 9:18,開始,1:05:08
PC2,2019/2/8 15:18,終了,2:19:53
PC2,2019/2/8 12:58,開始,2:19:53
PC2,2019/2/8 12:06,終了,1:00:44
PC2,2019/2/8 12:05,開始,1:00:44
PC2,2019/2/8 12:01,終了,1:27:49
PC2,2019/2/8 10:33,開始,1:27:49

出力ファイル(このように出したい):time_master.csv

カラム1,日時,選択カラム,利用時間表示
PC1,2019/2/6 9:56,終了,0:00:05
PC1,2019/2/6 9:41,終了,0:02:23
PC1,2019/2/6 9:23,終了,0:05:08
PC2,2019/2/6 15:18,終了,2:19:53
PC2,2019/2/6 12:06,終了,0:00:44
PC2,2019/2/6 12:01,終了,1:27:49
PC1,2019/2/8 9:56,終了,1:00:05
PC1,2019/2/8 9:41,終了,1:02:23
PC1,2019/2/8 9:23,終了,1:05:08
PC2,2019/2/8 15:18,終了,2:19:53
PC2,2019/2/8 12:06,終了,1:00:44
PC2,2019/2/8 12:01,終了,1:27:49

出力ファイル(現状、こうなってしまう):time_master.csv
※上記のコードで実施したところ、このような表示がされてしまう

カラム1,日時,選択カラム,利用時間表示
PC1,2019/2/6 9:56,終了,1899/12/30 0:00:05
PC1,2019/2/6 9:41,終了,1899/12/30 0:02:23
PC1,2019/2/6 9:23,終了,1899/12/30 0:05:08
PC2,2019/2/6 15:18,終了,1899/12/30 2:19:53
PC2,2019/2/6 12:06,終了,1899/12/30 0:00:44
PC2,2019/2/6 12:01,終了,1899/12/30 1:27:49
PC1,2019/2/8 9:56,終了,1899/12/30 1:00:05
PC1,2019/2/8 9:41,終了,1899/12/30 1:02:23
PC1,2019/2/8 9:23,終了,1899/12/30 1:05:08
PC2,2019/2/8 15:18,終了,1899/12/30 2:19:53
PC2,2019/2/8 12:06,終了,1899/12/30 1:00:44
PC2,2019/2/8 12:01,終了,1899/12/30 1:27:49

上記①の処理がうまくいった(このように出したいの通りに出力されたら)後、②の処理でこのように出したいと思っています

dateaddを使用するとできそうなのですが、
dateaddの使い方がよくわからず、このような質問となってしまいました
すいません
(①がうまくいっていないので、②にまだ進めないこともあります)

②の処理結果:出力ファイル:time_add.csv
PC1,2019/2/6,0:07:36 
PC2,2019/2/6,3:48:26 
PC1,2019/2/8,3:07:36 
PC2,2019/2/8,4:48:26 

第3カラムは上記の各の利用時間の合計

どのようなコードで記載すればよいか、
申し訳ございませんがお分かりになられる方、
よろしくお願いいたします

追記:
すいません。
記載の方法が悪くて申し訳ございません。
やろうとしていることは、

(ココカラ)

・PC別(カラム1の種類別)
・日付別(カラム2の日付別)
に、「選択カラム」が[終了]のレコードの
「利用時間表示」の値を合計して表示したい

(ココマデ)

となります

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • imihito

    2019/03/22 19:29

    質問投稿・編集時にプレビューは確認されていますか? マークダウンにおいて「>」は引用を示すメタ文字となるため、無駄に「>」を重ねるとよく分からない表示になってしまいます。また、コードも前後の行を「```」を囲むことで見やすく、なおかつコピペしやすくなります。

    キャンセル

  • amatsuno

    2019/03/22 21:19

    すいません。
    見づらくなっているところを修正しました

    キャンセル

回答 2

checkベストアンサー

+2

まず、VBS(VBAも)では、時間型というデータ型はありません。
Date型(日付/時刻型)になります。
また、時刻と時間は違う概念ということも認識しておく必要があります。

ただ、Date型は内部的には、1899/12/30 0:00:00 を起点とした経過時間が倍精度浮動小数点型で格納されているので時間として扱うことも可能です。

あと、VBS と SQL は別ものだということも意識する必要があります。
そして、ADO は VBS と SQL の間の橋渡しをするものです。

さて、今回のご希望のことは、最終的には、csvデータを、PC別、日付別に利用時間を集計したいということですよね。
グループ化して集計するというのはSQLの得意分野ですので、SQLに任せるのが得策です。

SQLなら、下記のようなコードで③の結果出力になるはずです。

SELECT カラム1, Format([日時],'yyyy/mm/dd') AS 日付, Format(Sum([利用時間表示]),'hh:nn:ss') AS 利用時間計
 INTO time_master.csv_
 FROM master1.csv where 選択カラム = '終了'
 GROUP BY カラム1, Format([日時],'yyyy/mm/dd');

VBSのコードは、

Dim objADO
Dim strPath

strPath = "C:\csvdata\"

Set objADO = CreateObject("ADODB.Connection")
objADO.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=" & _
            strPath & ";ReadOnly=0"

objADO.Execute _
"SELECT カラム1, Format([日時],'yyyy/mm/dd') AS 日付, Format(Sum([利用時間表示]),'hh:nn:ss') AS 利用時間計" & _
" INTO time_master.csv " & _
" FROM master1.csv where 選択カラム = '終了'" & _
" GROUP BY カラム1, Format([日時],'yyyy/mm/dd');"

objADO.Close
Set objADO = Nothing

上記を実行した出力結果は、

time_master.csv

"カラム1","日付","利用時間計"
"PC1",2019/02/06 00:00:00,"00:07:36"
"PC1",2019/02/08 00:00:00,"03:07:36"
"PC2",2019/02/06 00:00:00,"03:48:26"
"PC2",2019/02/08 00:00:00,"04:48:26"


フォーマットはご希望と違いますが、データ的には問題ないです。

ご希望のフォーマット、00:00:00なし、" なし、にするには、結果csvをテキストとして読み込んで、Replaceで置換すればいいでしょう。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/26 12:46

    このコードを実行(VBS)したのですが、
    エラー:集計関数の一部として指定された式'Format([日時],'yyyy/mm/dd')'
    を含んでいないクエリを実行しようとしました

    のエらーが表示されます

    キャンセル

  • 2019/03/26 14:08

    SQLコードに間違いがありました。テストしたコードの転記ミスです。回答を修正しておきます。

    キャンセル

  • 2019/03/26 14:11

    ありがとうございます。
    確かにstring変換のところは考えていたのですが、
    そのまま使用していました。

    こちらで気が付かなければいけないことですね。
    お手数をおかけいたしました

    キャンセル

  • 2019/03/26 14:14

    ありがとうございます。
    目標の処理ができました。

    accessが入っていなかったので、そもそもSQLを考慮していないことが一番の問題でした。

    キャンセル

+1

ADO は詳しくないのですが、とりあえず VBA / VBScript の仕様の話を。

VBA や VBScript では時間はDate型で表現されます。
これは日付と時間を合わせて扱う型になります。

そして、0:00:051899/12/30 0:00:05は、Date型としては同じ値を示します。
つまり、VBScript で処理するのであれば、表示上はともかくとして、示す情報に変わりはないのでは?ということです。

Option Explicit
'https://teratail.com/questions/180685

Dim date1 'As Date
date1 = #1899/12/30 0:00:05#
WSH.Echo "date1" & vbLf & _
         TypeName(date1) & vbLf & _
         CStr(date1)

Dim date2 'As Date
date2 = #0:00:05#
WSH.Echo "date2" & vbLf & _
         TypeName(date2) & vbLf & _
         CStr(date2)


WSH.Echo "date1 と date2 は同じ?" & vbLf & _
         CStr(date1 = date2)

実行結果

---------------------------
Windows Script Host
---------------------------
date1
Date
0:00:05
---------------------------
OK   
---------------------------

---------------------------
Windows Script Host
---------------------------
date2
Date
0:00:05
---------------------------
OK   
---------------------------

---------------------------
Windows Script Host
---------------------------
date1 と date2 は同じ?
True
---------------------------
OK   
---------------------------

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る