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

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

ただいまの
回答率

87.49%

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,876

score 50

前提・実現したいこと

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文字変えただけでなぜエラーになるのでしょうか?

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • Y.H.

    2019/03/26 18:39

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

    キャンセル

  • amatsuno

    2019/03/26 18:41

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

    キャンセル

  • tukatter

    2019/03/28 13:16

    >②が発生する状態:(select文のカラム・ORDEY BY 句のみ変更)
    ORDER BYはどこに記述がありますか?
    ORDER BY 日時, 端末機名 が抜けているのでは。

    SELECT 端末機名としているなら なぜ GROUP BY コンピューター名 となっているのでしょうか。

    操作種別が開始 終了なのに where 操作種別 = '操作終了'" & _ で取得できますか?

    キャンセル

  • amatsuno

    2019/03/28 13:25

    すいません。
    ORDER BYはGROUP BYの記載ミスです
    (ORDER BY については、別途実施してました)
    select の「端末機名」は結果を2バイト文字で出したくて、
    コンピューター名は、そこに紐づいている連番なので、この順番で指定したかったからです

    コンピューター名の連番ごとに、そこに紐づく名前(端末機名)
    で出力させようとしております

    操作種別が開始 終了なのに where 操作種別 = '操作終了'" & _ で取得できますか?
     ⇒すいません。記載ミスです
      (元データのcsvが「操作終了」なので、ここの箇所は問題ありません)

    キャンセル

回答 3

+1

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

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

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');"

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/28 14:02

    名前をそろえても結果は同じでした。

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

    キャンセル

  • 2019/03/28 14:25

    項目名にカッコが要るのでは? これみたいに[日時]
    なんで端末機名にはないんですか?

    > ⇒テーブル'time_master#csv'は既に存在しています
    >   と逆に存在していることがエラーで出ます
    削除してから実行すればいいのでは?

    キャンセル

  • 2019/03/28 14:44

    項目名にカッコが要るのでは? これみたいに[日時]
    なんで端末機名にはないんですか?

     ⇒[端末機名]は、不処理でそのまま出力しているので、カラム名扱いのため[]をつけいていません



    > ⇒テーブル'time_master#csv'は既に存在しています
    >   と逆に存在していることがエラーで出ます
    削除してから実行すればいいのでは?

     ⇒削除してから実行している状態が、②の結果です

    キャンセル

checkベストアンサー

0

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/28 14:55

    すいません。
    未記載でしたが、
    schema.ini
    はvbs中で削除を実施しています
    (コードの最上位処理で実施)
    strfile5 = "schema.ini"
    strDelFile5 = strPath & strfile5

    If objFso.FileExists(strDelFile5) Then
    objFSO.DeleteFile strDelFile5
    End If


    ただ、これがうまく削除されていない可能性がありそうなので、
    (ファイルの作成日時がおかしい)
    確認してみます

    キャンセル

  • 2019/03/28 15:04

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

    キャンセル

  • 2019/03/28 15:07

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

    キャンセル

0

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

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

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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