- ベストアンサー
これはVBAでできますか?
スペクトラムアナライザを用いると、ある時間の電圧と周波数をxls形式(txt形式でも保存可)のファイルが保存されます。時間を1秒間刻みで計測する場合、1秒ごとにファイルが形成されていきますが、長時間やるとたくさんのファイルができてしまい、HDDがいっぱいになってしまいます。 そこで、60個のファイルのデータを平均して1つのファイルを作り、平均した60個のファイルを消去していくようなことをリアルタイムでできるのでしょうか?もし、できるなら今から勉強するつもりです。 また、できない場合はC言語では作ることはできないのでしょうか? 分かりにくい文章ですがよろしくお願いします。 分からない点がありましたら、補足いたします。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
(かなり長文かんべんしてね) 私の認識として、1秒間に新しいファイルが作成される。60ファイル毎に処理を行い平均値ファイルを作成する。この平均値ファイルを元にして、61~120ファイルの平均値ファイルを作成する。以後繰り返し、最終的に残るのは全ての平均値を記述したファイル1つ。 こういう認識です。(違ってたらごめんなさい。) 一応これから書くのは、このような認識を根底にしてってことで。 私がひっかかったのは、時間。 1秒間に1つのファイルができるということは、60秒(1分間)に60個ファイルができるってことでしょ。 これをまとめるってことだから、1サイクルの処理が1分以内で終了するかちょっと怪しかったんです。 次の1分後にはまた新しいバッチが走っちゃうから。 簡単な処理を書くと、 [初回のみ] 1.ファイルを開く 2.ファイルを読んで、中身の値を計算して平均値を取り出す。 3.ファイルを閉じる 4.ファイルを削除する 5.平均値のファイル1つを新規作成する [2回目以降] 1.ファイルを開く 2.ファイルを読んで、中身の値を計算して平均値を取り出す。 3.ファイルを閉じる 4.平均値のファイルを開く 5.平均値のファイルを読んで、中身の値を再計算する 6.平均値のファイルを閉じる ってのが、たぶん1サイクルの処理となると思うんだけど、合計60ファイル分行うわけじゃない。 この処理が1分以内で終了するかがちょっと引っかかったのね。 なんで1分かってのは、1秒毎に新しいファイルが作成されて、60ファイルで1サイクルの処理だから1分って計算。 何も裏で動いてないのであれば、ぜんぜん余裕なんだけれども、裏では1秒毎に新しいファイルが作られてるでしょ。 つまり、ハードディスクへの読み書きが発生してるから、ファイルを開く→閉じるって処理がどうしても遅くなると思ったんです。 タスクスケジューラは決まった時間に決まった処理を必ず実行してしまうのです。 今回の処理だと、全ての値の平均値を出すためには、必ず最新の平均値が書かれてるファイルを使わないといけないでしょ。 そうしないと、平均値の値が全然信頼できないものになっちゃうし。 例えば、1分1秒~2分0秒までのファイルをまとめる処理が1分以内で終了しなかった場合。 1.開始1分後にバッチが走って、0分0秒~1分0秒の平均値ファイル(1)が作成される。(1分30秒に正常に作成完了したとする) 2.開始2分後、バッチが走って、1分1秒~2分0秒の平均値ファイル(2)作成処理を平均値ファイル(1)を元に作成される処理が開始される。 3.開始3分後、バッチが走って、2分1秒~3分0秒の平均値ファイル(3)を作成する処理が"""平均値ファイル(1)"""を元にして開始される。(2.の処理はまだ完了してないため) 4.開始2分後のバッチ処理が終了で、平均値ファイル(2)で平均値ファイル(1)が上書きされる。 5.開始3分後のバッチ処理が終了で、ここで平均値(2)ファイルが平均値ファイル(3)で上書きされる。 仮にこのように5.まで処理が進んだ場合、平均値ファイル(3)は0分0秒~1分0秒、及び2分0秒~3分0秒の平均値。つまり、1分1秒~2分0秒までの値が抜けてる平均値だから、全然信頼できない値になっちゃうでしょ。 たぶん、処理の2、3、4で、エラー発生しちゃうんじゃないかな?と思うんだけれども。 このプログラムは1分前の処理で平均値ファイルが最新の状態で作成されていることが絶対条件になるから、1分だとどうかな??と思ったわけです、はい。 ただこれは、PCの性能に左右されるから、十分なスペックであれば問題ないんだけどね。 回避策としてはは、60ファイル毎じゃなくて、例えば300ファイル毎(5分毎)とかに行うとか、 全てのファイルが作成された後、(トータル何ファイルできるかわからないんだけど)全てのファイルの平均値を求める処理を1回流すとか。 または、1分間隔での平均値ファイルを名前を変えて複数作成するとか。(例えば、10分間なら平均値ファイルが10個できる)とかいろいろあるんだけど。 かなり長文でわかりにくいかもしれないけれど、一応これが根拠です。 文章力なくて、わかりずらかったらごめんね。m(_ _)m
その他の回答 (7)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 #5の回答者です。 DDE が分からないというよりも、スペクトラムアナライザを使っていて、それをパソコンにつなげ、その出力の操作をソフトで行うわけだと思いますから、その設定で、まず、Excelのファイルにしたら、それを一つのファイル(ブック)にすることだと思いますね。 そこが押さえられないと、できると思いません。 一応、ここでも、年に何回か、同じような質問が出ていますから、その人たちと、そんなに変わる内容とは思いません。 ファイルを数限りなく作られても、オブジェクトというか、プログラムのハンドルを取らない限りは、その出力時のイベントで取れないと思います。 スペクトラムアナライザのソフトウェアのマニュアル等があるかと思います。 DDEInitiate(App, Topic) なお、今のスクリプトの現状を紹介しておきます。 Hey Scripting Guy! http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/default.mspx
お礼
回答が遅れてすいません。 >>DDE が分からないというよりも、スペクトラムアナライザを使っていて、それをパソコンにつなげ、その出力の操作をソフトで行うわけだと思いますから、その設定で、まず、Excelのファイルにしたら、それを一つのファイル(ブック)にすることだと思いますね。 そのとおりです。 英語のマニュアルを熟読して頑張ってみます。
認識違いだったみたいだね。 60ファイルから平均値ファイルが1つできて、例えばトータル600ファイル出力されるのであれば、平均値ファイルが10ファイルできるってことだよね。 であれば、前の処理の結果は後の処理の結果に影響しないから、60ファイルが必ず出力される時間+@でタスクを回せばできるかも。。 た だ ・・・・。 No5さんの回答みて、今更ながら気づいてしまったんだけども・・・・。 (というか、No5さんのWendy02さんってVBAの超スペシャリストじゃん。 その人の前で、VBSについて語ってしまった自分がすっごい恥ずかしい。orz) (ま、まぁ、気をとりなおして・・・) それはね、どうやって60ファイルを区分するかってことなんだけどもさ。 1秒に1ファイル作成されると勘違いしてしまったから、ファイル操作する時に、ファイルの作成時間で60ファイル抜けるかなと思ったのね。 例えば、1分10秒にこのまとめるバッチを流すとすれば、(バッチ開始時間-1分10秒)~(バッチ開始時間-1分10秒+60秒)。 つまり、0分0秒以上、かつ1分0秒以下の時間に作成されたファイルを対象としてたんです(私の頭の中ではですけども)。 1秒に1ファイルだから60秒で60ファイルみたいな。 だけども、1秒毎に保存されるわけじゃないみたいだから、どうやって60ファイルを認識するかが問題になってくるかもね。 正直、結構頭つかわないといけないかも。。 なんか思ってたより、複雑な処理みたいで私レベルでは回答してはいけなかったかなぁ・・・などと今更ながら思ってたりして・・・。(汗) あと、VBSって変わって難しくなっちゃったみたいだね。 ごめんね、新しい情報に弱くって。 私は、今の技術に置いてかれてるっぽいね・・・。。 (´・ω・`)ショボーン
お礼
回答が遅くなってすいません。 VBは大変難しく周りに教えてくれる方がいないので苦戦しています。 教授はC言語なら使えるから、C言語でやってみたらいいとおっしゃっていました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 まず、最初の段階の話ですが、それは、DDE を使っているのではありませんか?それを、 設定で、Excelに入るようになっているのではないでしょうか?この手の質問の回答は、世界中(とは言っても、私は英語しか分かりません)が、あまり出ていないし、MSサポートは、95-97 の対処法で、やってみましたが、うまく行きませんでした。 C言語で、受け取る側からという必要はないというか、古いメソッドが残されていますから、それを使ってもよいとは思います。VBAの専売特許は、確かに、Excel だけではないのですが、こういう場合は、Excelしかないでしょうね。 まず、確認しなくてはならないのは、通信手段は、DDE または、OLEであって、その設定のソフトがあるはずです。 参考 http://www.imaico.jp/function/dde/index.htm うーん、かなり古いコードです。 ただ、私としては、データの入りさえ確認できれば、後は、Excelで出来ると思います。 これが私の成功例です。 http://oshiete1.goo.ne.jp/kotaeru.php3?qid=4242307 私の場合は、DDE のエクスポートは、Access から行っております。 なお、今どきのVBScript は、昔とは違って半端でなく難しいです。 >>>タスクスケジューラの機能ではちょっと無理かな・・・ >なぜ、無理なのでしょうか? タスクスケジューラでは、私も無理だと思います。 一種のタイマーですから、 >60個のファイルのデータ を待つような機能はありません。
お礼
回答ありがとうございます。 >>DDE を使っているのではありませんか 私の勉強不足でDDEを使っているのかというのがよく分からないです。 >>VBScript は、昔とは違って半端でなく難しいです。 図書館で本を借りてきましたが、ものすごく難しかったですorz
VBスクリプト(今更ながら、この言葉であってるのかどうか不安なんだけれども)っていうのは、Windowsを基盤にして動くプログラムって考えてもいいと思うよ。 たぶん、質問者さんがいってるVBAっていうのは、EXCELとかACCESSとかの上で動くプログラムのことだと思うけど、イメージとしては、それがWindowsの上で動くと考えれば良いかな。つまり、EXCELとかACCESSがインストールされてなくてもWindowsさえインストールされてればOKみたいな。なので、ソフトウェアは買う必要はないです。ただし、WindowsはWindows98以降じゃないとダメみたい。なので、Windows2000とかWindowsXPとかならOKってことですね。 基本的に、"WSH 入門"とか"VBスクリプト 入門"とか"VBS 入門"とかで検索すればヒットするよ。 一応、有名どころ@ITより。 http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh01/cformwsh01_01.html VBスクリプトは、ExcelのVBAが出来ればすんなりできると思うよ。 こっちも@ITから。 http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh02/cformwsh02_02.html このサイトでいう"VBS"ってのがそれになります。 http://www.happy2-island.com/ タスクスケジューラというのは、Windowsの機能で、ある時間、または間隔で任意のプログラムを実行するスケジューラ機能。 タスクスケジューラの設定方法(これまた@ITから) http://www.atmarkit.co.jp/fwin2k/win2ktips/335tasksched/tasksched.html ***ちょっと重要*** 今回私が回答した内容は、No1さんの回答しているバッチ処理の方法の1つです。一定時間(例えば、5分間隔)で複数個あるファイルをまとめるような感じ。もし、質問者さんの思ってるリアルタイム処理を求めているのであれば、タスクスケジューラの機能ではちょっと無理かなと思われるのでこんな方法もあるよー程度の認識でよろしくです。
お礼
>>タスクスケジューラの機能ではちょっと無理かな・・・ なぜ、無理なのでしょうか? 一定時間で複数のファイルをまとめていくような感じを私も想像していたのでうまくいきそうな感じがしたのですが…
- mt2008
- ベストアンサー率52% (885/1701)
No.1です。 > >>出来上がったファイル群に対して処理を行うマクロを作り、手動起動で行わせる方が良いと思います。 > プログラムを2つ作り、別々で実行させるということでしょうか? プログラム(マクロ)を動かしっぱなしにして1時間周期で集計を行うのではなく、集計を行いたい時だけプログラムを動かすほうが良いという事です。 例えば、起動すると集計を行いたい日時の入力を求めてきて、その日時(既に60ファイル揃っている)の集計だけを行う様なプログラムを想定しています。 このような物で良いのでしたらVBAで十分可能です。
お礼
なるほど。ある程度ファイルが揃ったらそのつど実行していくということですね。 ただ、パソコンの前に定期的に実行しに行かなくてはならないので夜間などは厳しいですね(そう簡単にHDDの容量がなくなるとは思っていないですが、先生がそうしろというのでいやはや)。 しかし、とても参考になりました。
参考意見として。。質問に対する回答とは違うんだけれども。 お手軽て方法として、VBAのコードが使いたかったら、VBスクリプト作ってタスクスケジューラで回すという手もあるよ。 VBスクリプトは、テキストエディタとWindows環境あればできるし。
お礼
>>VBスクリプトは、テキストエディタとWindows環境あればできるし 新しくソフトを買わなくてもいいのですね。 >>VBスクリプト作ってタスクスケジューラで回すという手もあるよ このあたりはよく分からないので、何かお勧めの参考書がありましたら教えてくれませんか?
- mt2008
- ベストアンサー率52% (885/1701)
VBAと言っても色々な製品にVBAがありますが、xls形式のファイルの話が出てきますのでExcelのVBAと判断して回答します。 Excelは、常時起動しておいて定周期で何らかの処理を行う用途には向きません(やろうと思えば可能ですが、表計算と言う本来の目的から外れていますので安定しません)。 やるのでしたら、リアルタイム処理ではなく、出来上がったファイル群に対して処理を行うマクロを作り、手動起動で行わせる方が良いと思います。
お礼
さっそく回答ありがとうございます。 >>VBAと言っても色々な製品にVBAがありますが 恥ずかしながらVBAはエクセルにしかないと思っていました。 >>出来上がったファイル群に対して処理を行うマクロを作り、手動起動で行わせる方が良いと思います。 プログラムを2つ作り、別々で実行させるということでしょうか?
お礼
>>最終的に残るのは全ての平均値を記述したファイル1つ 途中までは合っていますが最後だけ違いまして、私のやりたいことは平均したファイルを違うフォルダに保存して時間と周波数と電圧の3次元グラフを作るというのが今のところの目標です。 記録されているデータは1秒ごとなんですが、保存されるスピードは1秒ごとではないですね。となると、1秒より長くして保存しないといけないということですね。大変分かりやすい説明ありがとうございます。 図書館で「Excelでパーフェクトマスター VBA」という本を借りてきましたがかなり難しいですね。
補足
私のやりたい事としては ファイル内のデータの平均するのではなく、ファイル1とファイル2・・・ファイル60のデータを平均したいのです。軽く本を見てみたのですが、ファイル外の操作が難しいですね。 例) ファイル1 ファイル2 ファイル3 ・・・ 電圧 周波数 電圧 周波数 電圧 周波数 3 1 2 1 1 1 1 10 4 10 5 10 2 100 5 100 3 100 3 1000 3 1000 2 1000 平均値ファイル 周波数 電圧 1 (3+2+1…)/60 10 (1+4+5…)/60 100 (2+5+3…)/60 1000 (3+3+2…)/60 といった感じです