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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

Q&A

解決済

2回答

1040閲覧

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

amatsuno

総合スコア54

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

0グッド

1クリップ

投稿2019/03/22 05:05

編集2019/03/25 00:14

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

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

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

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の日付別)
に、「選択カラム」が[終了]のレコードの
「利用時間表示」の値を合計して表示したい

(ココマデ)

となります

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

imihito

2019/03/22 10:29

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

2019/03/22 12:19

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

回答2

0

ベストアンサー

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

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

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

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

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

SQL

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

VBSのコードは、

vbscript

1Dim objADO 2Dim strPath 3 4strPath = "C:\csvdata\" 5 6Set objADO = CreateObject("ADODB.Connection") 7objADO.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=" & _ 8 strPath & ";ReadOnly=0" 9 10objADO.Execute _ 11"SELECT カラム1, Format([日時],'yyyy/mm/dd') AS 日付, Format(Sum([利用時間表示]),'hh:nn:ss') AS 利用時間計" & _ 12" INTO time_master.csv " & _ 13" FROM master1.csv where 選択カラム = '終了'" & _ 14" GROUP BY カラム1, Format([日時],'yyyy/mm/dd');" 15 16objADO.Close 17Set objADO = Nothing

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

time_master.csv

csv

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

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

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

投稿2019/03/22 17:18

編集2019/03/26 05:06
hatena19

総合スコア33699

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amatsuno

2019/03/26 03:46

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

2019/03/26 05:08

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

2019/03/26 05:11

ありがとうございます。 確かにstring変換のところは考えていたのですが、 そのまま使用していました。 こちらで気が付かなければいけないことですね。 お手数をおかけいたしました
amatsuno

2019/03/26 05:14

ありがとうございます。 目標の処理ができました。 accessが入っていなかったので、そもそもSQLを考慮していないことが一番の問題でした。
guest

0

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

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

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

vbscript

1Option Explicit 2'https://teratail.com/questions/180685 3 4Dim date1 'As Date 5date1 = #1899/12/30 0:00:05# 6WSH.Echo "date1" & vbLf & _ 7 TypeName(date1) & vbLf & _ 8 CStr(date1) 9 10Dim date2 'As Date 11date2 = #0:00:05# 12WSH.Echo "date2" & vbLf & _ 13 TypeName(date2) & vbLf & _ 14 CStr(date2) 15 16 17WSH.Echo "date1 と date2 は同じ?" & vbLf & _ 18 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 ---------------------------

投稿2019/03/22 10:25

imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問