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

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

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

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

Q&A

解決済

3回答

3924閲覧

vbsのadodb処理について(集計関数)

amatsuno

総合スコア54

VBScript

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

0グッド

0クリップ

投稿2019/03/26 09:33

編集2019/03/28 04:26

前提・実現したいこと

csvから指定したカラムで
ファイルの集計を実現したい

発生している問題・エラーメッセージ

①集計を行おうとするカラムを変更すると、
集計関数の一部として指定された式を含んでいないクエリを実行しようとしました
とエラーが出てしまう

②集計を行おうとするカラムを指定すると、
オブジェクトtime_master.csvが見つかりませんでした。オブジェクトが存在していること、名前やパスが正しいことを確認してください
とエラーが出てしまう

該当のソースコード

VBSで記載しています

CSVファイル:log_master1.csv
コンピューター名,日時,操作種別,期間,端末機No,端末機名
PC1,2019/2/6 9:56,終了,0:00:05,1,吉田1
PC1,2019/2/6 9:56,開始,0:00:05,1,吉田1
PC1,2019/2/6 9:41,終了,0:02:23,1,吉田1
PC1,2019/2/6 9:39,開始,0:02:23,1,吉田1
PC1,2019/2/6 9:23,終了,0:05:08,1,吉田1
PC1,2019/2/6 9:18,開始,0:05:08,1,吉田1
PC2,2019/2/6 15:18,終了,2:19:53,15,田中2
PC2,2019/2/6 12:58,開始,2:19:53,15,田中2
PC2,2019/2/6 12:06,終了,0:00:44,15,田中2
PC2,2019/2/6 12:05,開始,0:00:44,15,田中2
PC2,2019/2/6 12:01,終了,1:27:49,15,田中2
PC2,2019/2/6 10:33,開始,1:27:49,15,田中2
PC1,2019/2/8 9:56,終了,1:00:05,1,吉田1
PC1,2019/2/8 9:56,開始,10:00:05,1,吉田1
PC1,2019/2/8 9:41,終了,1:02:23,1,吉田1
PC1,2019/2/8 9:39,開始,1:02:23,1,吉田1
PC1,2019/2/8 9:23,終了,1:05:08,1,吉田1
PC1,2019/2/8 9:18,開始,1:05:08,1,吉田1
PC2,2019/2/8 15:18,終了,2:19:53,15,田中2
PC2,2019/2/8 12:58,開始,2:19:53,15,田中2
PC2,2019/2/8 12:06,終了,1:00:44,15,田中2
PC2,2019/2/8 12:05,開始,1:00:44,15,田中2
PC2,2019/2/8 12:01,終了,1:27:49,15,田中2
PC2,2019/2/8 10:33,開始,1:27:49,15,田中2

目標:このように出したい :time_master.csv
端末機名,日付,稼働時間,
吉田1,2019/2/6,0:07:36
田中2,2019/2/6,3:48:26
吉田1,2019/2/8,3:07:36
田中2,2019/2/8,4:48:26

コンピューター名と端末機名は完全に一致しています。

ソート順は、
1)日時
2)端末機名
です

正常に完了する状態:
sub time_add()

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 コンピューター名, Format([日時],'yyyy/mm/dd') AS 日付, Format(Sum([期間]),'hh:nn:ss') AS 利用時間計" & _
" INTO time_master.csv " & _
" FROM log_master1.csv where 操作種別 = '終了'" & _
" GROUP BY コンピューター名, Format([日時],'yyyy/mm/dd');"

objADO.Close
Set objADO = Nothing

end sub

①が発生する状態:(select文のカラムのみ変更)
sub time_add()

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 端末機名, Format([日時],'yyyy/mm/dd') AS 日付, Format(Sum([期間]),'hh:nn:ss') AS 利用時間計" & _
" INTO time_master.csv " & _
" FROM log_master1.csv where 操作種別 = '終了'" & _
" GROUP BY コンピューター名, Format([日時],'yyyy/mm/dd');"

objADO.Close
Set objADO = Nothing

end sub

↑は集計関数の関係上、GROUP BY側も変更が必要かと考えました

②が発生する状態:(select文のカラム・GROUP BY 句のみ変更)
sub time_add()

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 端末機名, Format([日時],'yyyy/mm/dd') AS 日付, Format(Sum([期間]),'hh:nn:ss') AS 利用時間計" & _
" INTO time_master.csv " & _
" FROM log_master1.csv where 操作種別 = '終了'" & _
" GROUP BY コンピューター名, Format([日時],'yyyy/mm/dd');"

objADO.Close
Set objADO = Nothing

end sub

試したこと

GROUP BY 以下の指定カラムを変更したり、削除したりしたのですが、
②が発生します

また、AS句の文言を変更した場合にも②が発生します
(利用時間計 → 利用時間計2)

GROUP BYでは2バイト文字が使用できないのでしょうか?
AS句を1文字変えただけでなぜエラーになるのでしょうか?

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

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

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

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

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

Y.H.

2019/03/26 09:39

strPath = "c;\csvdata\"で:(コロン)ではなく;(セミコロン)になっているのはtypoですか?
amatsuno

2019/03/26 09:41

すいませんtypoです "c:\csvdata\" です
tukatter

2019/03/28 04:16

>②が発生する状態:(select文のカラム・ORDEY BY 句のみ変更) ORDER BYはどこに記述がありますか? ORDER BY 日時, 端末機名 が抜けているのでは。 SELECT 端末機名としているなら なぜ GROUP BY コンピューター名 となっているのでしょうか。 操作種別が開始 終了なのに where 操作種別 = '操作終了'" & _ で取得できますか?
amatsuno

2019/03/28 04:25

すいません。 ORDER BYはGROUP BYの記載ミスです (ORDER BY については、別途実施してました) select の「端末機名」は結果を2バイト文字で出したくて、 コンピューター名は、そこに紐づいている連番なので、この順番で指定したかったからです コンピューター名の連番ごとに、そこに紐づく名前(端末機名) で出力させようとしております 操作種別が開始 終了なのに where 操作種別 = '操作終了'" & _ で取得できますか?  ⇒すいません。記載ミスです   (元データのcsvが「操作終了」なので、ここの箇所は問題ありません)
guest

回答3

0

①集計を行おうとするカラムを変更すると、
集計関数の一部として指定された式を含んでいないクエリを実行しようとしました
とエラーが出てしまう

以下のようにSELECTの項目 端末機名と Group by の項目を揃えるといいです。

vbs

1objADO.Execute _ 2"SELECT 端末機名, Format([日時],'yyyy/mm/dd') AS 日付, Format(Sum([期間]),'hh:nn:ss') AS 利用時間計" & _ 3" INTO time_master.csv " & _ 4" FROM log_master1.csv where 操作種別 = '終了'" & _ 5" GROUP BY 端末機名, Format([日時],'yyyy/mm/dd');"

②は実行前に strPath = "c:\csvdata" このパスのところに
ファイル(time_master.csv)があるか確認してください。

投稿2019/03/28 04:54

tukatter

総合スコア284

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

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

amatsuno

2019/03/28 05:02

名前をそろえても結果は同じでした。 また、 ②は実行前に strPath = "c:\csvdata\" このパスのところに ファイル(time_master.csv)があるか確認してください。 に関しては、  ⇒テーブル'time_master#csv'は既に存在しています    と逆に存在していることがエラーで出ます
tukatter

2019/03/28 05:25

項目名にカッコが要るのでは? これみたいに[日時] なんで端末機名にはないんですか? > ⇒テーブル'time_master#csv'は既に存在しています >   と逆に存在していることがエラーで出ます 削除してから実行すればいいのでは?
amatsuno

2019/03/28 05:44

項目名にカッコが要るのでは? これみたいに[日時] なんで端末機名にはないんですか?  ⇒[端末機名]は、不処理でそのまま出力しているので、カラム名扱いのため[]をつけいていません > ⇒テーブル'time_master#csv'は既に存在しています >   と逆に存在していることがエラーで出ます 削除してから実行すればいいのでは?  ⇒削除してから実行している状態が、②の結果です
guest

0

すいません。
原因がわかりました

上記の処理をタスクスケジューラで設定して実行していたのですが、
タスク実行時の処理においてiniファイルの削除に失敗していたことが原因でした

最終利用の想定上、
iniファイルを隠しファイルにしてかつ実行ユーザに権限を与えていなかったことが理由でした。

お騒がせして申し訳ございませんでした

投稿2019/03/28 06:05

amatsuno

総合スコア54

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

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

0

ベストアンサー

CSVファイルのところに、schema.ini というファイルがありませんか?
出力項目が変わったため、作成しなおす必要があるかと思います。削除するだけでいいかと思いますが。

投稿2019/03/28 05:52

x_x

総合スコア13749

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

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

amatsuno

2019/03/28 05:55

すいません。 未記載でしたが、 schema.ini はvbs中で削除を実施しています (コードの最上位処理で実施) strfile5 = "schema.ini" strDelFile5 = strPath & strfile5 If objFso.FileExists(strDelFile5) Then objFSO.DeleteFile strDelFile5 End If ただ、これがうまく削除されていない可能性がありそうなので、 (ファイルの作成日時がおかしい) 確認してみます
x_x

2019/03/28 06:04

そうそう変わらないのであれば、いったん手動で削除してしまってもいいかもしれません。
amatsuno

2019/03/28 06:07

すいません。 自己解決に記載の内容が原因でした。 問題を気づかせていただいてありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問