• 締切済み

マクロを効率よく作成するには

会計事務所で、エクセルのマクロの作成をよく行います。 ですが、新しいマクロを作成する時に、すべてタイピングしてコードを書いているのが、もっと効率良くするほうほうがある様な気がしています。 ネットで検索すると、クラスモジュールの利用が良いらしいのですが、少し使ってみても、今一つ理解ができません。 標準モジュールで子プロシージャを使っても同じ事だと感じてしまいます。 そこで、クラスモジュールで効率が上がるポイントと、クラスモジュールでなくても、何かマクロ作成の効率を上げる方法を、ご教授頂ければと思います。 宜しくお願い致します。

みんなの回答

回答No.6

こんばんは。 遅くなってしまいました。 >フリーテキストエディタはエクセルVBAでも便利になるんでしょうか? いえ、たぶん、ならないでしょうね。(^^;しかし、コードを管理する時にツールのひとつだと考えておけばよいと思います。私は、VBAを書く時は、テキストエディタも開いています。 >コーディング規約は作ってみます。 大雑把なルール(VB6)はネットでも出ています。 誰も教わらないと、自力ではむつかしいです。それは大勢の人が、それで携わってきたからです。 以下は自分の考えている方法とぶつかることがないので、ログに残っていました。 「初心者のためのExcel エクセルマクロVBA入門-変数の名前付けの達人になれ! 」 http://shuhho.hatenablog.com/entry/excelvba-59 『変数名に全角文字が使えることって違和感』については、全漢字の中で、エラーを起こし、使えないものが数個あるという記憶があります。(調べた人のほうがすごいですが) 「私が思う『プログラマーに必要な能力』とは何かを語りたいCommentsAdd Star」 これは、以下の文章だけでは無理ですが、命名規則というものがあります。 (私自身、掲示板等では、守ってはいないのですが、一応は心得ています。) http://d.hatena.ne.jp/Asmodeus-DB/20120130/p3 >1.名前が的確でないものは他人に理解されない(バグの温床) >2.名前を的確に付けられないものはその存在に誤りがある可能性が高いが、命名が適当な人はそのことに気付きづらい(構成の誤りに気付けない) Microsoft のVB用のコーディング規則 http://msdn.microsoft.com/ja-jp/library/h63fsef3.aspx 「エクセル大事典 > エクセルVBAを極める」 ここの著者は、Excel VBA界の中でも、大御所の一人ですが、内容は古くなってきています。 VBAといえども、プロの人はすでに移行していますが、セミプロに近い人たちも、C#やVB.Net による移行を考えているからです。 http://home.att.ne.jp/zeta/gen/excel/c04p15.htm ハンガリアン記法(ハンガリー記法)は、多用しないこと。 VB.Net 移行後、意味を見間違うことが多いからです。 %, &, !, #, @, $ の、いわゆる型宣言文字は、現在では禁止。 例: Dim Count& Dim Password$ (これは、マイクロソフト側が、言い出した話なのです。アメリカではもう少しユーザーと開発者の距離が近いです。) 上級者の書いたプログラムを良く読むことですね。コードの美感に意識していけば、必ず上達します。 クラスの問題よりも、WMIやオートメーション(IE, VBScript, JavaScript)、可能ならWen32 APIなど、既存のものに手を出すのが手っ取り早いです。また、本格的にアルゴリズムを勉強しておくと将来に役立ちます。有名なクイックソートやバブルソート、二分探索木法など、掲示板ではあまりお目に掛からないはずです。 私は、パソコンの出始めた頃、ずっと「正規表現」を学びましたが、それは、VBAでも生きています。ただ、前回、掲示板で気づいかされたのですが、私の書き方は古かったでした。 今、ネットの中でも、VB6/VBA の情報は減りつつありますから、ある程度欲張って情報を蓄えておかないと、取り直しが出来ません。私などでも、昔、やっとVB6までは、ある程度を揃えたものの、肝心のVBA側は、十分とは言えませんでした。 私の書いているのは、VBAオタクのようにも思えますが、オタクとマニアの違いは、オタクは、現在と未来に希望を持っていますが、マニアは過去のことばかりなので、私はVBAマニアでしょう。もうVBAの未来は見ていません。私は、最初は、Excelがないので、VBAを紙の上で考えていました。一応、私は、VBA歴は、13年ぐらいになります。最初の5年ぐらいがピークでした。 こんな脱線めいた話ばかりで、すみません。

marusan10
質問者

お礼

いえいえ、有難うございました。知らなかった情報を沢山お教えいただいて、当分は今回のご回答を色々試すのに一杯になりそうなほどです。少しでも、マクロの効率が上がり、仕事も効率が上がっていけたらと思っているので、とても有意義な情報でした。 有難うございました。

回答No.5

こんにちは。 >クラスの利用は、他のc言語などでの開発経験者からすると当然のように薦めるものなんですかね。 そうとも言えません。それ自体は、全体の一部ではないでしょうか。 私は、昔はパソコン教室などに行きましたが、講師が、オブジェクト指向について正しく説明できた人は知りませんし、近年、私自身も放送大学を視聴して、まったく違った印象になりました。 放送大学 http://www.ouj.ac.jp/hp/kamoku/H26/kyouyou/B/joho/1570099.html VBAではその機能はありません。それでも、自作イベントを作るというのも面白いです。 >メモ帳にも幾つか保存して フリーのテキストエディタで、アウトライン機能を持ったものは便利です。 私のテキストファイルは、書き溜めたメモは、Excel VBAのマクロ集だけで、7万行を超えています。 それを別にフラッシュメモリなどに入れていて、自宅でない場所で開発する場合も、参照可能のようにしていました。 "プログラミングに使える!フリーのテキストエディタ10選" http://techacademy.jp/magazine/986 TeraPadとSakuraは、テキストエディタとして、かなり有名です。VBのエディタ機能というほどではないのですが、VB系の識別子に色を付けられるのは、とても便利です。Notepad++は、標準で色がつきますが、あまりに豪華すぎます。それから、タグ・ジャンプ機能、要するにハイパーリンクのようなものをつけると、複数のテキストファイルの管理が可能になります。 >アクセスを使う人がいるのですが、その人のプログラムの変更の素早さ Accessは、他のOffice ソフトとは、ちょっと世界が違うのです。 Accessは、中途半端のソフトではあっても、Access単独の開発者が、それで食べられますからね。いくら、Excel VBAが使えますと言っても、Excelだけでは、それ自身の完成度が低いし、Excel VBAの高度な技など、今さら手が届きません。 それは、VBAを少しでも深めるためには、VB6の知識が必要だったのに、それができなくなってしまいました。私自身も、途中から、VB.Netなどに手を出したもので、VB6は、中途半端になってしまいました。 私は、VSのVB6もC++も、VB.Net も買いましたが、今は、Windows7には、ボーランド製のC++しか入れていません。私にとって、今、VBAというのは、本当に宙に浮いた感じです。私は、もう本格的には、VBAはやらないつもりです。 可読性を上げるために、 http://okwave.jp/qa/q8677289.html そのリンク先の 「第15話 コーディング規約は必要か?」 http://el.jibun.atmarkit.co.jp/happy/2009/10/15-176d.html は、なかなか身につかないものです。ただ、掲示板でも、自分が書いたような錯覚を起こすほど、同じパターン、コーディングルールを持っている人に出会います。そういう時に、自分は間違っていなかったと思うことがあります。 あと、整形ツールは、ご存知ですか? 字下げをしてくれる、COMのツールです。 "VBePlus"は、mougの渡辺ひかるさんが作ったです。残念ながら、Windows7 では、設定の変更が管理者モードでないと保存できなくなってしまいました。しかし、Office 2010でも使えます。 http://www.vector.co.jp/soft/win95/prog/se176543.html 英語版では、"Smart Indenter" というものがあります。 http://www.oaltd.co.uk/Indenter/Default.htm 掲示板の一部の回答者などは、この種の整形ツールを使っているようです。 あまり、直接の参考にはならなかったと思いますが、頑張って精進してください。

marusan10
質問者

お礼

また参考になる貴重な情報をありがとうございました。 放送大学は、ちょっと税や会計の勉強でも時間が足りていないので、また機会をみてからにしたいと思います。。 フリーテキストエディタはエクセルVBAでも便利になるんでしょうか?ちょっと実感がわかなかったのですが、少し試してみます。 コーディング規約は作ってみます。自分ひとりしかマクロは作成してないのですが、いつも行き当りばったりで統一感がなく、非効率なので。 整形ツールは知らなかったです。これは便利そうですね! 有意義な情報を本当に有難うございます。知らない事が無数にあったことに驚き、同時に色々と改善できそうなのでワクワクしてきました。 有難うございました。

marusan10
質問者

補足

ふと気になったのですが、エクセルVBAでクラスモジュールに書いたコードは、常に他のエクセルVBAのブックにもコピーして、同じクラスモジュールを使いまわすという事ですか? というか、標準モジュールで書いたとしても、同様に他のブックでもコピーして、それをcallして使いまわすという事なんでしょうか? みんなそうしているんでしょうか?

回答No.4

こんにちは。 最近は、私は、VBAもなおざりなのですが、#1さんの「オブジェクト指向の専門書」というのは、VBAであるかというと、ほとんどないですね。むろん、私は、オブジェクト指向の専門書は持っていますが、それは、C言語によるものです。VB.Net のオブジェクト指向でも、VBAではマネが出来ません。概念を学ぶ程度なら、実践を交えますが、放送大学でも可能です。 >標準モジュールで子プロシージャを使っても同じ事だと感じてしまいます。 おっしゃる通りなのですが、クラスモジュールは、プロシージャ等が、オブジェクト化するのです。 一つのブックに対しては、オブジェクト化した所で、サブクラスも出来ないのだから、あまり旨味がありません。手続きが多くなるだけと感じるでしょう。ユーザー定義関数の場合は、アドインのちょっとした手続きは必要ですが、簡単にグローバル化してしまうので、あまり違いは感じられません。 Office のVBAのクラス化の多くはイベントに限られると思ったほうがよいです。ふつうは、ActiveX コントロールのイベントに手を加えるものです。ワークシートやブックもオブジェクトですから、新規のオブジェクトに対して、イベントを加えられます。おそらくは、一般の人が知らないようなイベントも出てくるはずです。 中には、カプセル化にこだわる人がいますが、私自身は、VBAで、そういう人の理由がよく分かりません。VBAでカプセル化した所で、ソースが見えてしまえばあまり意味がありませんし、もともと、ソースを隠しても、主にExcelにはなるのですが、大したことではありません。 しかし、 >新しいマクロを作成する時に、すべてタイピングしてコードを書いているのが、もっと効率良くするほうほうがある様な気がしています。 クラス設計とは別に、二つの方法があると思います。ひとつは、今、詳しいことは忘れてしまいましたが、Officeのデベロッパーツールの中に、Visual SourceSafe(VSS)というデータベースがあって、それが書いたマクロを自動的に収録してくれるものです。デベロッパーそのものは、高価なものです。現在は、VSSの提供自体は終わっています。 http://msdn.microsoft.com/ja-jp/library/cc343971.aspx (文章のみ) 私自身は、小物から大物まで、数千という単位でマクロを作っていたので、VSSをしばらく使っていましたが、個別の要素が含まれてしまい、とても管理できるものではありませんでした。むろん、Office用のVSSのフリーソフトもあったようですが、ここのサイトを検索すれば、書いている人がいたように思います。 また、google 検索で、「VBA visual sourcesafe replacement」を調べれば、最近のものが出てくるかもしれません。 もう一つは、定型文を登録しておく方法で、MZ-Tool というもので、 http://www.mztools.com/v3/download.aspx ここに定型文(スニペット)を登録して呼びだして使うものです。Find メソッドなどはややこしいので、ここで登録しています。数は限られています。いわゆる、マクロのマクロとして、定形マクロを書いてくれる道具というわけです。このツールは、他にも、不要の変数の宣言を弾き出したり、大文字・小文字に変更してくれたり、また、複数のプロジェクト(Projects)で、文字検索をしてくれたりするので、開発には重宝しています。 他には、ソース自体に、コメントを書いたりして、テキストファイルに保存し、検索できるようにしておくことです。私が掲示板に頻繁に書いていた頃には、他の方たちも、実際のリファレンスは、テキストファイルにしておくというのは、だいたい同じようでした。 本来は、暗記するべきだと思うのですが、大雑把な構文しか覚えていません。

marusan10
質問者

お礼

遅くなってすみません。また貴重な情報をありがとうございました。 クラスの利用は、他のc言語などでの開発経験者からすると当然のように薦めるものなんですかね。オブジェクト化することでそんなに便利になるのかと思ってしまいます。 ご紹介頂いたツールも覗いて試してみます。 でもやっぱり、地味だけどテキストファイルを、見つけやすいように管理していくのがいいのかもしれないと思いました。 でも一方で、知り合いにアクセスを使う人がいるのですが、その人のプログラムの変更の素早さを見ると、やっぱりオブジェクトを理解して使いこなすのが良いのかもと思ってしまいます。 とりあえず、ツールを使ってみて、メモ帳にも幾つか保存して様子を見ようと思います。 ありがとうございました。

回答No.3

No2です。補足します。 参照URLは過去のQ&Aですが、URLを辿るとクラスの概念など詳細に書かれてます。VBAでない普通のVisual Basicではクラスを知らないと書けないと聞きます。 最近見つけたものでは、以下があります。どちらかというと、概念は既知として実際に作ることを目的としてます。作ってなんぼですからね。 http://www.excellenceweb.net/vba/class/what_vba_class.html

参考URL:
http://okwave.jp/qa/q8677289.html
marusan10
質問者

お礼

ありがとうごっざいました。ご紹介のページを拝見しました。(一つ目はつながりませんでした) クラスを伝授するサイトは多くはないですが、ちゃんとあるわけですし、参考にしながら実践したいと思います。 ありがとうございました。

回答No.2

よく使う機能を部分ごとにサブプロシージャにまとめるのです。 例えば私は多数のファイルを開いて、データを読み出して、処理して、シートに書き出し、閉じる、という作業を延々とやります。下記のような3個構成のプロシージャで動かしてます。 sub Test() call ファイル一覧の取得 For i=~ 1個ずつ開く  call 実際の処理を書いたプロシージャ next i end Sub sub ファイル一覧の取得 処理 end sub sub 実際の処理を書いたプロシージャ 処理 end sub 最近はいちいちコピーしたりフォーマット合わせるのも面倒なので、そろそろクラスモジュール化?を考えてます。コツはとにかく「毎回毎回使うおなじみの機能を探し、1個のプロシージャなりクラスなりにまとめる」ことです。 現状のコーディングでも、普段から1個の作業ごとにブロック化する癖を付けた方がいいです。1個のFor nextループ内にあれもこれもとゴテゴテつけるよりも、何回かに分けて「このブロックでの作業はこれ、次ブロックでの作業はアレ」と分けた方が後々見やすい(可読性がいい)と思います。

marusan10
質問者

お礼

遅くなってすみません。なるほどですね。前に作ったことのあるプロシージャ-を思い出せたときは、そのブックを開いてコードをコピーしてアレンジしていますが、まだ定番の処理というほどのものを見出せないでいます。 でも方針としては納得です。参考にさせて頂きます。 可読性は、いつも頭を悩ませます。コメントをつけても、次に見た時に全然頭に入ってこない・・・。結局時間をかけてデバッグを続けています。これも何か間違っていますよね・・・。 有難うございました。

回答No.1

>そこで、クラスモジュールで効率が上がるポイントと、クラスモジュール これを勉強、あるいは理解するまえの、基本知識が抜けているために起きている質問です。 すでに30年の歴史がある、 ・オブジェクト指向プログラミング ・カプセル化技術 これらを専門書を買って勉強する覚悟で理解してください。そうれうば、この質問はでないと思います。

marusan10
質問者

お礼

遅くなってすみません。ということは、クラスモジュールを駆使するのが、明らかに効率がいいということなんですね。なかなか忙しさと、税務会計の勉強ばかりで、VBAの勉強に時間がとれないでいますが、どこかで切りかえた方が良さそうですね。 有難うございました。