VBScriptでExcelを起動せずに内容をチェックするには?


故障ログファイルを案件毎に所定の書式(個別のExcelシート)に記録してあるのですが、これまでの案件(50件くらい)に対して、統計を取りたいと考えています。

各ログファイルを一々めくって解析するのは大変なので、若い子に集計ツール作ってもらっているところなのですが今あるプロトタイプは、ExcelのVBAで、各故障ログ(のExcelシート)を一つずつ起動していくので、開くだけで結構な時間がかかります。

VBScriptとかを使って、Excelを起動せずにデータを収集できたら早くならないかな?と思い質問しました。
こうしたらExcel起動が高速になるよ! とか Powershellならできるよ! とかそういう回答でも構いません。

よろしくお願い致します。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2019/07/25 00:54:05
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。
id:gm91

質問者から

GM912019/08/14 19:08:07

補足:

・故障は1件1行、それぞれ発生時刻やエラーコードが記録されている。

→時間帯やコード別にグラフ化したいと考えています。

・集計対象の項目はどの行に書くか書式で決まっていますが、社内の機密文書なので具体的な内容は公開できません。すみません。

→詳細は自力で勉強してアレンジする気でいるので、簡単な事例でサンプル紹介してもらえると助かります。

サンプルのイメージ:

1)案件別のフォルダにある、特定の名前のExcelファイルの内容をチェックする。

2)フォルダ構成/ファイル名は以下のイメージで格納されている。各案件毎のフォルダ構成は共通。

 \2019\案件A\故障ログ\故障ログ_xxxxx.xlsx

 \2019\案件B\故障ログ\故障ログ_xxxxx.xlsx

 \2019\案件C\故障ログ\故障ログ_xxxxx.xlsx

 ※ xxxxxの部分は任意の文字列 文字数可変(1~20)、半角英数字のみ、他の案件と重複する場合あり。

3)検索範囲と制約事項

・フォルダの検索範囲は親フォルダを固定値、絶対パスで指定。

・指定されたフォルダ以下の全フォルダを検索し、

 「故障ログ」フォルダ内にある、故障ログ_xxxxx.xlsx 形式のファイルのみにアクセスする。

・「故障ログ」フォルダ内には複数の故障ログ_xxxxx.xlsx が存在する場合あり。

4)ファイル内のアクセス対象データは以下のイメージ

・A1セル 案件名 全角で5~20字前後、空白含む:例)8時間耐久 鈴鹿サーキット

・A2セル 担当者名 5名で固定、表記ゆれなし:例)スズキ、カワサキ、ホンダ、ヤマハ、Piaggio

・A3セル 案件番号 半角英数字で10字固定:例)GSX-R12345


5)集計結果の出力

以下の情報を、CSV形式で出力。生成ファイル名は固定で可。

・故障ログのファイル名と絶対パス

・上記A1~A3の値

※1つの故障ログファイルに対し、CSVは1行で書く。

ベストアンサー

id:kimuram No.2

回答回数27ベストアンサー獲得回数11

ポイント43pt

以前に試したことあるのですが、Excelでですが、「他ブックのデータを、ブックを開かずにセルデータを取得する」のVBA処理を紹介しておきます。
昔のバージョンであった機能(Excel4.0のマクロ)で、若干時代に逆行するところもありますが。
現在でもEXCEL2016でも処理は可能のようです。

最終的にCSVにするのなら、Excelワークシートの形でもいいでしょう。
その後でCSVにも出来るし、そのまま処理することも出来るし。
要は対象の多数のブックをいちいち開かないで処理に時間をかけないで行いたいことだと思うので。

方法は、VBAで、
受取データ = ExecuteExcel4Macro("'" & パス & "[" & ブック名 & "]" & シート名 & "'!R" & 行番号 & "C" & 列番号)
のような形でVBAで記述します。
 対象ブックのパス名は最後に"\"(円マーク)を付けた形で指定
 ブック名の前後は"[" 、"]"で括るように指定
 ブックのパスとブック名とシート名の全体をシングルクォート(')で括る
 その次に"!"を付加し、その後に"R"に続けて行番号、"C"に続けて列番号を指定

ただし、以下のような注意点あり。
・ブックから取り出すのは1回の起動では指定した一つのセルだけであること。
 (対象セルの数が多くなればそれだけ起動する回数が多くなり、処理時間の速さの効果は段々に失われていく)
・対象のワークシート名はあらかじめプログラムに固定で指定すること。(変数指定できないようだ)(⇒ん、変数指定で出来たけど)
・取得できるのはセルの値のみ

「補足」に記述されているような、例えば、対象データがA1セル、A2セル、A3セルと3個程度でなら適用の効果があろうかと。

また、これをVBAで行うので、フォルダ内のファイルを求めるとかの処理は、Dir関数の利用やファイルオブジェクトを使うことで処理を構成することもできますね。

参考ページ:(ExecuteExcel4Macroで検索すればいろいろ見つかる)

※追記
 ワークシート名の指定は変数で指定することも可能だった。
 対象ブックはxlsxもxlsmでも処理できた。

id:gm91

ありがとうございます。ちょっと調べてみたのですがやはり
>ブックから取り出すのは1回の起動では指定した一つのセル
これがちょっとネックかなと思います。
ファイル数と対象データが少なければあるいは、とも思いますのでもう少し調べてみます。

2019/07/17 20:52:11

その他の回答2件)

id:degucho No.1

回答回数281ベストアンサー獲得回数75

ポイント33pt

VBScript=COM経由なのでExcelを起動するのと実質同じです。
2007以降のxlsxはzip圧縮されたXMLなので
PowerShellとClosedXMLとか、可能であればPython+Excel用ライブラリかなと思います

現実的には片っ端からSaveAsでCSVにするVBAを前日帰り際とかに叩いて帰って
翌朝CSVを集計した方が早そうですが

id:gm91

ありがとうございます。
PCはシャットダウンして帰宅しないといけないので翌朝までにという作戦は難しいです。

2019/07/17 20:50:12
id:kimuram No.2

回答回数27ベストアンサー獲得回数11ここでベストアンサー

ポイント43pt

以前に試したことあるのですが、Excelでですが、「他ブックのデータを、ブックを開かずにセルデータを取得する」のVBA処理を紹介しておきます。
昔のバージョンであった機能(Excel4.0のマクロ)で、若干時代に逆行するところもありますが。
現在でもEXCEL2016でも処理は可能のようです。

最終的にCSVにするのなら、Excelワークシートの形でもいいでしょう。
その後でCSVにも出来るし、そのまま処理することも出来るし。
要は対象の多数のブックをいちいち開かないで処理に時間をかけないで行いたいことだと思うので。

方法は、VBAで、
受取データ = ExecuteExcel4Macro("'" & パス & "[" & ブック名 & "]" & シート名 & "'!R" & 行番号 & "C" & 列番号)
のような形でVBAで記述します。
 対象ブックのパス名は最後に"\"(円マーク)を付けた形で指定
 ブック名の前後は"[" 、"]"で括るように指定
 ブックのパスとブック名とシート名の全体をシングルクォート(')で括る
 その次に"!"を付加し、その後に"R"に続けて行番号、"C"に続けて列番号を指定

ただし、以下のような注意点あり。
・ブックから取り出すのは1回の起動では指定した一つのセルだけであること。
 (対象セルの数が多くなればそれだけ起動する回数が多くなり、処理時間の速さの効果は段々に失われていく)
・対象のワークシート名はあらかじめプログラムに固定で指定すること。(変数指定できないようだ)(⇒ん、変数指定で出来たけど)
・取得できるのはセルの値のみ

「補足」に記述されているような、例えば、対象データがA1セル、A2セル、A3セルと3個程度でなら適用の効果があろうかと。

また、これをVBAで行うので、フォルダ内のファイルを求めるとかの処理は、Dir関数の利用やファイルオブジェクトを使うことで処理を構成することもできますね。

参考ページ:(ExecuteExcel4Macroで検索すればいろいろ見つかる)

※追記
 ワークシート名の指定は変数で指定することも可能だった。
 対象ブックはxlsxもxlsmでも処理できた。

id:gm91

ありがとうございます。ちょっと調べてみたのですがやはり
>ブックから取り出すのは1回の起動では指定した一つのセル
これがちょっとネックかなと思います。
ファイル数と対象データが少なければあるいは、とも思いますのでもう少し調べてみます。

2019/07/17 20:52:11
id:kaoato No.3

回答回数236ベストアンサー獲得回数86

ポイント33pt

実際にどの処理の部分が遅いかを計測して、対策しないと、期待ほど早くならないと思う。


まずは、現状の処理で、
1.EXCEL起動
2.集計ロジック
などのように、処理別に時間を計測するのがよいと思う。

データ数(行数)が多いみたいなので、2の部分でも、処理の方式次第で、遅くなったりするとは思う。



1.故障ログ_xxxxx.xlsx を一度すべて、csvファイルに変換する
2.CSVファイルを、VBAなどで集計する


EXCELは起動も遅いけど、セル操作・参照も遅いので、上記でも早くなる可能性はある。

他1件のコメントを見る
id:kaoato

Excel起動時に、集計処理などを書いてるからとかいう初歩的なことはないのでしょうか?

2019/07/21 18:44:12
id:gm91

「Excel起動時に、集計処理などを書いてるから」というのがどういう状態なのかイメージしづらいのですが、質問文の通りで、開くだけで結構な時間がかかります。
(起動後の具体的な処理は何もしない状態です)

これは多分当方のシステム上の問題(サーバアクセス、暗号化処理などの影響)だと睨んでいます。そこを直接どうこうするのは難しいので、Excel起動の高速化よりも、どちらかと言えばExcelそのものを起動せずに直接編集できないかと考えています。

2019/07/21 21:52:35
id:gm91

質問者から

GM912019/08/14 19:08:07

ありがとうございました。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません