• 締切済み

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

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

みんなの回答

回答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の勉強に時間がとれないでいますが、どこかで切りかえた方が良さそうですね。 有難うございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルのマクロについて

    エクセルにてシート名タブ右クリック→「コードの表示」で開く画面に打つマクロはどういう意味(役割・機能)があるのですか? 通常、マクロ作成時の「挿入」→「標準モジュール」で開く画面に打ち込むマクロと何が違うのですか?

  • マクロからマクロを作成

    こんばんは。 あるエクセルファイル(A)の標準モジュールにVBAを書きます。 例えば、 workbook.add とかでワークブックを作成し、新しく作ったこのエクセルファイル(B)に(A)に登録されている標準モジュールを移植することは可能でしょうか? 可能でしたら、やり方をご教示くらはい!お願いしますmm -- エクセル2003です。

  • エクセルマクロの記録で記録した、ショートカットキーで起動するプロシージャの移動方法

    エクセル2002で、マクロの記録で記録した、ショートカットキーで起動するプロシージャを作成しました。このプロシージャは、作成するたびに新たなモジュールを自動で造りその中に記録されます。  このように作成したプロシージャを一つのモジュールにまとめたいのですが、切り取り~貼り付けを行って移動すると、起動しなくなります。 マクロの記録で記録した、ショートカットキーで起動するプロシージャのモジュール間での移動方法をお教え下さい。若しくは、指定するモジュールに上記プロシージャを記録する方法をお教え下さい。

  • Excel2002・マクロ ツールバー、メニューバーの追加・変更方法

    Excel2002において、自分で作成したマクロを実行させるツールバー、メニューバーを追加したいのですが、 どのようにすれば、追加や変更ができるのでしょうか? Excel Ver7.0の時に作成したマクロをExcel 2002で読み込んだのですが、ツールバー・メニューバーはちゃんと表示されているのに、VisualBasic Editorを開いてみると標準モジュール、クラスモジュールのどこにも、このコード記述が見あたりません。 Ver7.0の時は、ツールバー、メニューバーを表示させるコードを直接モジュールシートに記述しており、参照できるようになっていました。 Excel 2002では、コード記述ではなく、どこか別の所、プロパティウィンドウなどで設定するのですか? どうすれば、ツールバー・メニューバーの追加や変更が可能になるのでしょうか? どなたか、ご回答をよろしくお願いします。 5年のブランクがあり、新しいバージョンの仕様が 変わっているので、戸惑っています。 どなたか助けてください! よろしくお願いします。

  • VBAで作成したComboboxにVBAでマクロを割り当てたい。

    下記コードでcomboboxをつくったのですが 作成されたCombobox1のComboBox1_Changeエベントに 標準モジュール内のSub cal をVBAで割り当てたいのですが可能でしょうか。 コンボボックス作成マクロ x=0 y=0 With Worksheets("Sheet1").OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, DisplayAsIcon:=False) .Left = X .Top = Y .Width = 53.25 .HEIGHT = 18 .ListFillRange = "AAA" End With これで作成したコンボボックスに標準モジュール内マクロをVBAで割りあてしたい。 標準モジュール sub cal ・ ・ end sub

  • ACCESSのマクロに関しまして

    お願いします。 ACCESS97で追加クエリを作成し、その後自動起動にしようと思い、マクロで追加クエリを項目に入れマクロを作りました。 マクロを作成する際に、モジュールでレコード追加するテーブルを一度削除しようと思い、「DELETE文」でモジュールを作成し、マクロの追加クエリの前に「プロシージャの実行」でモジュールのプロシージャを実行するようマクロに記述しました。 <マクロ内容> (1)「プロシージャの実行」  (追加クエリで追加するテーブルの中身をDELする) (2)「クエリを開く」  (追加クエリでレコード追加) この用に記述し、マクロ名を「AutoExec」で記述して、ファイルを実行してもマクロが起動しません。 (1)の「プロシージャの実行」までは、実行されているようなのですが(テーブル内確認)、以降の追加クエリが実行されません。 何か他の設定があるのでしょうか? お願い致します。

  • [VBA] マクロファイルの管理について

    こちらの識者の方々にはいつもお世話になっております。 VBAの質問で、環境は下記になります。 OS=windows7 pro 64bit Office=Excel2010(14.0.7128.5000) 業務でたくさんのマクロを作成(仮にA-Zとします)し、複数人が使用しているのですが、作成しすぎて管理が大変になってきました。 そこで、1つのxlamファイル(仮にmasterファイルとします)に全ての実行コードを書き、A-Zのファイルからはmasterファイルを読み取り専用で開き、指定のプロシージャを必要な引数を渡して呼び出すだけのコードを記載する、という方式に変えようと思っています。(masterファイルには書き込みのパスワードを設定します) masterファイルのコードは全て標準モジュールに記載し、基本的には1モジュールあたり1プロシージャにしようと思っています。(masterのプロシージャから別のプロシージャを呼び出すことはせず、A-Zのマクロからmasterの1つのプロシージャを呼び出して完結させる) さらにFunctionや定数用のモジュールを一つ作り、よく使うfunctionや定数などはそこに書こうと思っています。 メリットとしては下記のようなものがあげられると思っています。 ・コードの改修が容易(誰かが開いていても改修できる) ・作成したマクロの管理が容易 ・よく使うFunctionなどは1回だけ書けばどのプロシージャでも使いまわせる この運用方法で問題ないと思っているのですが、懸念されるような事項はありますでしょうか? また別件なのですが、masterファイルのセキュリティを高める意味で、 「A-Zのファイルから開く以外の手段でmasterファイルが開かれた場合は、自動でmasterファイルを閉じる」 というような処理は可能でしょうか? 例えば、workbook_openイベントなどを使って、特定の引数が受け渡されなければ thisworkbook.close false などでmasterファイルを閉じる、といったような感じです。 質問に不備不足等ございましたらご指摘ください。 ご面倒お掛けしますがよろしくお願いします。

  • subプロシージャーは標準モジュールではなくフォームのコードを書く部分

    subプロシージャーは標準モジュールではなくフォームのコードを書く部分に書いても問題ないのでしょうか? エクセルにVBAでフォームを挿入し、 「Private Sub UserForm_Initialize()」 などのフォームのモジュールに、 Sub test() MsgBox "あああ" End Sub という標準モジュールに書くべきのsubプロシージャーを書いてもなにもエラーにならないし正常に動きます。 subプロシージャーは標準モジュールではなくフォームのコードを書く部分に書いても問題ないのでしょうか? それともエラーにならなくても標準モジュールに書いた方がいいですか?

  • Excel>マクロを使っていないはずなのにマクロを有効にするかどうか聞かれてしまう

    こんにちはtmgmです。 Excelについての質問です。Excelのブックを開くとマクロが有効かどうか毎度聞いてきます。作業としては次のような手順を踏みました。 ------------------------- (1)Book1.xlsにマクロを作成し、保存して閉じる (2)再度Book1.xlsを開き、マクロが不要になったので、コード編集画面を開き、モジュールの解放後、保存(マクロが割り当てられていたボタンも消去) (3)改めてBook1.xlsを開くと、「マクロを有効にするかどうか聞いてくる」(メッセージからも判るとおりセキュリティは中にしています。) ------------------------- 毎回マクロが有効かきかれなくするにはどうすればよろしいでしょうか?モジュールの解放だけではだめでしょうか?お分かりになる方、ご返答宜しく御願いします。

  • VBAで作成したマクロをデスクトップで起動

    ExcelのVBAで作成したマクロをモジュールのみ抜き取って モジュールのみ起動させる事ってできますか? 初心者ですので、分かり易い回答お願い致します。

このQ&Aのポイント
  • 連結子会社と就業規則の関係について説明します。
  • 連結子会社で100パーセント子会社であり、親会社の敷地の一部に追い出し部屋みたいな会社がある場合、子会社の就業規則だけが厳しく、親会社とは異なることがあるのか疑問です。
  • 連結子会社であり、親会社と同じ業務を請負っている場合でも、子会社の就業規則がフレックスが使えなかったり、育児休業期間が短かったりすると法的に問題はないのか不明です。また、就業規則において追い出されてしまう場合、法律が保護してくれるのか疑問です。
回答を見る

専門家に質問してみよう