• ベストアンサー

エクセルのデータの処理はVB?orVBA?

エクセルのデータを処理するときVBAとVBどちらで処理することが多いですか? また、処理する理由は何ですか? 自分はVBAで処理していますが、VBAだとメモリがたりなくなったり、処理に時間がかかるので困っています。 VBAで処理する理由は、はじめに学んだからです。 VBで処理するように変えようか迷っています。 教えていただけないでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kazne
  • ベストアンサー率66% (8/12)
回答No.8

こんにちわ >エクセルのデータを処理するときVBAとVBどちらで処理することが多いですか? >また、処理する理由は何ですか? 単純に、Excelだけで済む処理を他のアプリケーションをわざわざ導入するって、費用対効果薄くなりますよね? Excelで済むなら、Excelに付属しているVBAを使うほうがスマートだと思いますよ。 なので、Excelデータの処理する場合は、圧倒的にVBAが多いと思います。 >自分はVBAで処理していますが、VBAだとメモリがたりなくなったり、処理に時間がかかるので困っています。 >VBAで処理する理由は、はじめに学んだからです。 メモリが足りなくなるってのは、相当件数のインスタンス生成等をしてるんですかね? それとも、Excel関数をびっしり散りばめてあるとか? 私の経験上、Excelで済む範囲でこういった事象に出くわした事ないです。 処理に時間がかかるのは、大抵ロジックが悪いケースが多いです。 逆にいうと、ロジックを見直す事さえできれば、飛躍して時間の短縮が望めると思います。 今までいろんな人が作ったコードを見てきましたが、大抵無駄があります。 たとえば、関数を沢山つかってて、値参照しているセルに更新をかける際、 自動計算を手動に切り替えないとか(Application.Calculation = xlCalculationManual) 画面更新を止めないとか(Application.ScreenUpdating = False) ワークシートのChangeイベントを組んでるにも関わらず、 イベントを止めていないとか(Application.EnableEvents = False) それ以外にも沢山ありますけど、大抵そういった事がなされていないが為に遅くなっています。 それにExcelのVBAって他の言語と比べても、実はそれなりに高速ですよ。 少なくとも、VB.NETとかに比べれば、機能自体制限があるので、やはり高速ですね。 VBといってるのは、VB6でしょうか? VB6は、確かに早い部類に入ると思いますが、それもやはりロジックと処理次第です。 各言語には向き不向きがあるので、実現したい目的に応じて選択するのがベストです。 ExcelとVBAだけで実現の難しい、またはAPI等をふんだんに使用する、 描画させたり、OSの機能を引き出したいというのであれば、 VBにする、または他の言語を選択するってのは有りだと思います。 ってのは、たぶん皆同じ意見だと思うので、別の角度を用意しましょうか。 Excelは何が魅力なのかって、当然優れたスプレッド機能です。 他の言語からスプレッドを用意しようと思うと、色々手間だし、 何より自分一人で作るなんて不可能に近いぐらい、Excelのスプレッドってのは、よくできています。 豊富なExcel関数郡、オートシェイプ、直感的なUI、etc...、そこにVBAによるオートメーション。 ほぼ、最強じゃないでしょうか。 つまり、ユーザーインターフェイスとして、スプレッドを使用しないで、 ユーザーフォームに各コントロールを配置して動かすってのなら、 VBにするのは、有りだと思います。 逆に、Excelのワークシートに値を入力させたい、表示したい、Excel関数を使いたいってゆうのであれば、 VBAで作ったほうが楽だと思いますよ。 んで、大抵の場合どっちも必要って結論がでるんですが、 その為のVBAだと思って使うのがいいんじゃないでしょうか? 私は、VBAをずっと使ってますが、 これはExcelでやらせるべきではないってライン引きをして、 フォームオンリーのアプリケーションにしたり、 逆に、フォームなんてほとんど使用しないで、ExcelのスプレッドとExcel関数と簡単なプロシージャで 結果を得たりしています。

saterain20
質問者

お礼

ありがとうございます。

その他の回答 (7)

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.7

>エクセルのデータを処理するときVBAとVBどちらで処理することが多いですか? 使い方で決めます。 データ処理の途中で手作業が入る、特に、A列とK列とBA列を見比べてCC列の値をチェックするとか フィルタかけてチェックしてフィルタを戻して処理を進めるとか、 そういう手作業をVB.Net等でさせようと思うとちょっとやりにくい。 (EXCEL自体を画面に表示すればいいんですけどね、  その画面で勝手に保存終了されたりなんかするとVB.NET側がいささか困ったことになりかねない。) 一方で、単純にEXCELファイルから、データベースに保存するだけとか、 手作業が入らないなら、VB.Net等でさせようと思いますね。 また、利用者のレベルにもよります。 なにするかわからない利用者なら、なにもさせないようにしたVB.Net等の方がいいかなと。 ま、VBAでもIEを利用したインターネット接続やODBC等によるデータベース接続など大抵のことは できるので、何がしたいかで決めることはあまりないです。 で、 >VBAだとメモリがたりなくなったり、処理に時間がかかるので困っています。 という処理をそのまま、VB.Netへもっていってもやはり同じようにメモリ不足などはおきる可能性があります。処理に時間がかかるのが、ロジックが悪くて遅い場合はどれを使っても遅いです。 例えば、最終行の判定をせずに、65535行目まで調べていたりとか・・・。 あるいは、VB.Netへもっていったら速くなったといっても、実は、画面表示していないから速いだけで VBAでも処理中の画面更新をとめたり、再計算をOffにすると実は早かったというのはよくある話です。

saterain20
質問者

お礼

ありがとうございます。

  • aspnet
  • ベストアンサー率79% (72/91)
回答No.6

「エクセルでVB」とは、エクセル内蔵のVBAではなく、Visual Studioを使用したVSTO「Visual Studio Tools For Office」を使用したOfficeアプリの開発、ということでしょうか? それならば、VBAとは完全に別物で、VB.NETを使い、Excel(やWORD等)をフロントエンドにして、.NET Ftrameworkを駆使する、さまざまな機能アプリケーション、ということになります。 Windows Formの代わりに、Excel Workbookがあるようなイメージです。 VBAのような手軽さはないですが、汎用開発環境を使用するので、ライブラリやデバッガは強力で、データベースハンドリングやコンピュータ間通信、インターネット対応など、VBAでは不可能なことも全て可能になります。 大量のデータ処理をともなうアプリケーションなら、SQL ServerやAccessなどと難なくインテグレーションできるVSTOが圧倒的に有利です。役者が違う、といった感じかな。 VB.NETをある程度理解できる方なら、仕様が一時代前のVBAより、VSTOを使うべきかもしれません。 Microsoftもそちらを推奨しています。 ただし、VB.NETは完全なオブジェクト指向言語ですし、.NETフレームワークは膨大ですからそのつもりでどうぞ。 あ、あと市販の学習書などもほとんどありません。

saterain20
質問者

お礼

ありがとうございます。

  • ap_2
  • ベストアンサー率64% (70/109)
回答No.5

VBとVBAって、基本的に同じモノかと…。 また、メモリも処理速度も、セル操作など、エクセル自身の機能が原因であることが多いので、外部からエクセル操作しても変わらないかも知れないです。 ・処理速度について 今時はVB/VBAもコンパイルできるので、C言語と比べても遜色ないという噂です。ただ、エクセル自体に罠があるので、「VBA 高速化」で検索してみてください。 ・メモリ不足について VBAは動的に確保メモリを増やしていくから制限はほぼない、と聞いたことがありますが…どうなんでしょうね。「メモリ不足」は、文字数オーバーなんかでも表示され、何かが溢れた/制限を超えた感じであって言葉通りの不足だとは限らないので、要注意ですよ。

saterain20
質問者

お礼

ありがとうございます。

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.4

>エクセルのデータを処理するときVBAとVBどちらで処理することが多いですか? ほとんどの方が同じ回答だと思いますが エクセルVBAで処理します。 >また、処理する理由は何ですか? 理由は、エクセルのシートを処理するには、便利だからです。 >VBAだとメモリがたりなくなったり、処理に時間がかかる メモリ不足がでる理由を考えるべきでしょう。 1、元々のエクセルのファイルが大きくなった。   データの部分をAccessなどデータベースに移行するべき時期の可能性があります。 2、コードの中でObjectなどメモリを使用する変数をたくさん使っている。   無駄に再計算されるような関数を配置していないか   エクセルの一般機能(ピボットなど)で処理できないか VBでもエクセルのVBAでも使い方次第ということです。 データが膨大な数ということであれば、データベース(Accessあるいは SQL Serverなど)を導入 する時期になったということです。 それでも、エクセルは便利なので、処理に必要なデータだけをシートに取り込んで、集計など処理を 行って、グラフ化などできますの使っています。 もちろんVBでもデータベースに接続はできます。Officeがインストールされていないパソコンからも 処理したいというのであれば、VBで開発する必要が出てくるということですね。

saterain20
質問者

お礼

ありがとうございます。

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.3

VB から Excel を操作しても、実際に動くのは Excel のライブラリに登録されている 関数です。だから処理が遅いというのはプログラムが悪いのであって、VB に変えても さほど変わらないはずです。 逆に、最新の VB である VB.NET は使った Excel オブジェクトを開放してやらないと 裏で動いている Excel.EXE のプロセスが終わらない問題があります。これは、手作業で 次回、Book を開いた時に正常に表示されないという実害があります。 私は、VB6.0 の時代からプログラミングしてますので、VBA でも十分にプログラム 出来る事を知っています。VBA だけで100万件の顧客データ(CSV)の統計処理をできる プログラムを組んだ事もあります。処理時間は40分程度掛かりますが、お客さんは 十分に評価できるスピードだと判断されました。 もちろん、開発中は何回かメモリが足りなくなるエラーも表示されましたが、修正 して安定した稼動を実現しました。 私が VB と VBA の比較から VB を選ぶとしたら、コントロールの豊富さです。 フォームをベースとした処理が多い場合は、VB を選びます。 質問は、 > エクセルのデータを処理するとき ですので、どちらで開発しても同じだと感じています。 > メモリがたりなくなったり、処理に時間がかかるので これは、VB に変えても改善されないと思います。 わざわざ外部(VB)から Excel を操作するより、内部(Excel)から Excel を操作 した方が色々と便利なので、VBA を選択すると思います。

saterain20
質問者

お礼

ありがとうございます。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

質問者は、 全然論点がずれている。 エクセルVBAはエクセルのシートなどエクセルのオブジェクトを使うから、用意されているメソッドやプロパティなどを使うべきものであって、そういうのと関係ない計算(例えば円周率パイの近似値を何桁計算するなど)なら使う必要は無い。 たまたまVBAのVBの部分を利用して使える場合があるというだけだし、特定目的のCOMがあると、エクセルと関係が無いことにも、VBAでも使えるということにも見えるが、エクセルVBAの領分とはいえない。 >VBで処理するように変えようか迷っています 処理する中身による。エクセルVBAで、不要なシート画面を毎度更新したりしたらVBAでもベテランに比べれば時間がかかる。処理するアルゴリズムやロジックでも、メモリの使用度合や処理時間に差が出る。初心者がVBAだとメモリが足りないとか、処理が遅いといっても、当てにならない。よく判った人がチェックしないと、ものが言えない。 配列にデータを溜め込んだりするのは、初心者に多い。昔は使えるメモリが少なく、いかに使用メモリを少なくするか苦労があった。画像を表示するなど速度の面から実用にならなかった時代も長い。最近は様変わりしているが。

saterain20
質問者

お礼

ありがとうございます。

  • FEX2053
  • ベストアンサー率37% (7987/21355)
回答No.1

そりゃ確かにVBを使ってExcel外部でCOMファイルを作って動かせば速いこと速いですけど、VBじゃ直接セルをいじることは確か出来なかった筈じゃ? VBAでも「ScreenUpDating」を上手く使うと、処理速度は上がりますよ。それと、何でもかんでもVBAでやろうとしないで、Excel自体の関数を使ってセル上で可能な限り処理すると、結構速度は上がりますけど。 http://officetanaka.net/excel/vba/speed/s1.htm

saterain20
質問者

お礼

ありがとうございます。

関連するQ&A

  • 【VB】セルが空になるまで処理を繰り返したい

    Excel VBAを使用してです。 列Aにデータがずらっと入っています。 そのデータを列Bに、 Do while ~loop か Do until ~loopを使って データが無くなるまでコピーするという処理を書きたいのです。 VB歴が浅いためひらめきません。よろしくお願いします。m(__)m

  • EXCEL VBAから、VBのフォームを開くためには?

    EXCEL VBAからVBへプログラムを移そうと努力しています。 そこで、エクセルのシートのコマンドボタンを押すと、 VBで作成したフォームが開き、そこからEXCELの処理を させたいと考えています。 VBからエクセルの処理は Excel.Application のあたりをつかうことでなんとかなりそうなんですが その逆がわからず行き詰まっています。 EXCELは2000 VBは6.0 です ご存じの方、よろしくお願いします。

  • VB.NET Excelの読み取り(ループ処理)

    VB.NETでExcelをループ処理で読み取る際に、While文を使用して1行ずつ読み込む処理をするのですが、皆さんはどのようにして書かれてますか? While文の条件は「空白の行が見つかったらループを辞める」という条件で処理をするのですが、書き方がいまいちピンとこないので、皆様の情報を参考にさせて頂ければと思いました。 ・Excelのデータは約3000~4000件ほど(データによって件数は若干変動) ・Excelの6行目(A:6)から読み込む 是非ともよろしくお願いいたします。

  • VB及びエクセルのVBAにて、

    VB及びエクセルのVBAにて、 300000行のCSVデータを読み込もうと試みました。 ファイルOpenで、Line InputやInputBを使用しましたが、 どちらもあまり処理速度は変わらないようです。 高速で1行ずつCSVデータを読み込む方法をご存じないでしょうか。 ご存知でしたら、関連するサイトを教えていただければ助かります。 お手数をおかけしますが、よろしくお願いします。

  • VBから、エクセルでファイルを開くには・・・

    またまた、お世話になりますm(__)m 環境はVB.net2003、エクセルは2002でプログラミングの勉強、データ処理をしているのですが、VBでエクセルを開き、そのエクセル上でファイル(csvやテキストなど)を開きたいのですが、VB上でどのように書けばよいのでしょうか? VBでエクセルをたちあげたり、bookやsheetを開くことはできました。 どなたかご教授お願いしますm(__)m

  • VB6からEXCELマクロの終了を判断する方法を教えてください。

    VB6からEXCELマクロの終了を判断する方法を教えてください。 VB6とEXCEL(VBAも含む)を使って次のような流れの処理を行うソフトを作っています。 そこでどうしてもEXCELマクロの終了をVB6から判断する必要があり、方法を教えて頂けないでしょうか。 1)VB6でEXCELファイルを起動 2)VB6からセルA1に10,A2に20を代入 3)VB6からEXCELファイル内のマクロをコール 4)マクロはA1+A2の計算を行いA3に代入(30) 5)VB6からA3の値を読み込む (実際にはマクロは複雑な処理をします。) 1)~5)の処理を5000回程度行います。 VB6から送られるデータは毎回変わり、EXCELとマクロで計算させたデータを回収してテキストファイルに書き出します。 一通りのプログラムは完成したのですが、計算したデータを見ると10+20が1.99999とか15.51414とかおかしい結果になっています。 もしかしたらマクロの実行が終わっていない段階でVB6がデータを拾ってしまっている??と考え、マクロの終了をVB6で判断してからデータを回収するようにしたいと思っています。 何か方法はないでしょうか。(または他に間違っているところがあるのでしょうか。) 長文ですみません。よろしくご教示ねがいます。

  • HTMLをVBで動かす

    主にAccess や Excelを使ってデータ処理をしています。  ホームページのあるサイトを開いてそこのデータをExceに取り込み、Excel で処理する。  こうした作業をVBで自動化したいと考えています。 Access や Excel のVBA、Visual Basic 等はそこそこ使えるのですが、HTML を Visual Basic で操作する方法が全くわかりません。 これを勉強するには何が最適でしょうか。書籍でも結構です。 ご存知の方、紹介していただけませんか。

  • VB6.0 エクセルシートにデータ保存

    いつもお世話になっております。 VB6.0を使用しています。 VBフォーム上にエクセルシートを貼り付けて(OLEの利用),測定器から出力されたテキストデータ(重量,製品の番号)をCOM1に取り込んでいます。 例えば,200回データを受け取るとして,エクセルのシートにA列(重量),B列(製品の番号)としてともに200行データを保存していきたいと考えています。 このようなことをしたい場合,どのような知識が必要になってくるのでしょうか?勉強したいのですが,何が必要な知識なのかわからない状態です。(例,OLE・VBAなど) 宜しくお願いします。

  • VB エクセルデータ取り込みについて

    VBにエクセル(CVS)データを取り込みたいのですがコード等分かりません。 20行、100列位のデータをVBに取り込み作図したいのですが、取り込み方が分かりません、どうか宜しくお願いします。

  • VB6.0からエクセルを起動

    現在VBとVBAの勉強をしているのですが、VB6.0からエクセルを起動する際に、エクセルにはVB6.0から引数を渡したいのですがどうすれば良いでしょうか? どなたか、ご存じの方が居ましたら教えてください。

専門家に質問してみよう