tag:crieit.net,2005:https://crieit.net/magazines/33hata33/%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88ExcelVBA/feed [連載]「パーフェクトExcelVBA」の本で勉強中〜の投稿 - Crieit Crieitで連載「[連載]「パーフェクトExcelVBA」の本で勉強中〜」の最近の投稿 2020-02-03T06:00:51+09:00 https://crieit.net/magazines/33hata33/%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88ExcelVBA/feed tag:crieit.net,2005:PublicArticle/15706 2020-02-03T05:49:23+09:00 2020-02-03T06:00:51+09:00 https://crieit.net/posts/VBA-6-7-8-Excel-VBA VBAをパーフェクトにマスターするシリーズ♪ 6章-7,8「モジュール」「パーフェクトExcel VBA」 <h2 id="■前回までの記事"><a href="#%E2%96%A0%E5%89%8D%E5%9B%9E%E3%81%BE%E3%81%A7%E3%81%AE%E8%A8%98%E4%BA%8B">■前回までの記事</a></h2> <p><a href="https://crieit.net/posts/VBA-Excel-VBA">VBAにもっと詳しくなろう♪ 「パーフェクトExcel VBA」</a></p> <p><a href="https://crieit.net/posts/VBA-2-Excel-VBA">VBAをパーフェクトにマスターするシリーズ♪ 2章「式と値」「パーフェクトExcel VBA」</a></p> <p><a href="https://crieit.net/posts/VBA-3-Excel-VBA">VBAをパーフェクトにマスターするシリーズ♪ 3章「ステートメント」「パーフェクトExcel VBA」</a></p> <p><a href="https://crieit.net/posts/VBA-4-Excel-VBA">VBAをパーフェクトにマスターするシリーズ♪ 4章「フロー制御ステートメント」「パーフェクトExcel VBA」</a></p> <p><a href="https://crieit.net/posts/VBA-5-Excel-VBA">VBAをパーフェクトにマスターするシリーズ♪ 5章「プロシージャ」「パーフェクトExcel VBA」</a></p> <p><a href="https://crieit.net/posts/VBA-6-1-Excel-VBA">VBAをパーフェクトにマスターするシリーズ♪ 6章-1「モジュール」「パーフェクトExcel VBA」</a></p> <p><a href="https://crieit.net/posts/VBA-6-2-3-Excel-VBA">VBAをパーフェクトにマスターするシリーズ♪ 6章-2,3,4,5,6「モジュール」「パーフェクトExcel VBA」</a></p> <p>(前回の4,5,6は2,3と統合しました。)</p> <p>続きを書きました。<br /> VBAをパーフェクトにマスターするシリーズ♪<br /> 今回は「6章-7,8」で新しく知ったことと、思ったことを簡単にまとめました。</p> <p><strong>6章は分厚いので少しずつ進めていきたいと思います。。。</strong></p> <p>※これは学習記録です。<br /> 書籍の内容はあえて多くは載せていません。<br /> 大事なことも省いていますので、詳細につきましては書籍をご覧ください。</p> <h2 id="■6章「モジュール」プログラムを部品ごとにまとめる"><a href="#%E2%96%A06%E7%AB%A0%E3%80%8C%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%80%8D%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E9%83%A8%E5%93%81%E3%81%94%E3%81%A8%E3%81%AB%E3%81%BE%E3%81%A8%E3%82%81%E3%82%8B">■6章「モジュール」プログラムを部品ごとにまとめる</a></h2> <h3 id="6-7  クラスモジュール"><a href="#6-7+%E3%80%80%E3%82%AF%E3%83%A9%E3%82%B9%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB">6-7  クラスモジュール</a></h3> <p><strong>6-7-1 クラスモジュールとは</strong></p> <blockquote> <p>クラスモジュールは、独自のオブジェクトを作成するためのモジュールです。</p> </blockquote> <p><strong>6-7-2 クラスとインスタンス</strong></p> <blockquote> <p>シートモジュール、ブックモジュールは既に存在しているオブジェクトに機能や処理を追加することができるモジュールでした。また、フォームモジュールは、ユーザーフォームの挿入を行うと同時に追加されますので、</p> </blockquote> <p>クラスモジュールは、上記と異なり、オブジェクトを作るまでは実体がありません。</p> <p>使い方としては、クラスモジュールを追加すると、<br /> そのクラスを型として使えるようになるので、SETするときにNewします。</p> <p><strong>6-7-3 クラスメンバーの定義</strong></p> <p>クラスには独自のプロパティやメソッドを追加できます。<br /> クラスを指定してオブジェクトを作ると(SETしてNewすると)、そのオブジェクトに対して、設定したプロパティもメソッドも使えるようになります。</p> <p><strong>6-7-4 クラスのイベントプロシージャ</strong></p> <blockquote> <p>VBAではクラスで使用できるイベントが2つ用意されています。</p> <p>Initialize インスタンスが生成されたとき(コンストラクタ)<br /> Terminate インスタンスへの参照がされなくなったとき(デストラクタ)</p> </blockquote> <p>このシリーズの学習記録を書いている途中で「クラスモジュール便利やん!使ったほうがいいやん!」って思ったことがあったのですが、なぜでしたっけ。(少し間が空いて忘れてしまった)</p> <p>今ある記憶では「クラスモジュールを作って活用すれば、プログラム全体に対してのPublicなメソッド?プロシージャ?関数?をむやみに増やさなくて済む=プログラムの修正や追加するときに影響範囲を絞り込みやすい」という感じなのですが</p> <p>そレほど多機能なシステムを作るのでなければ、なるべく関数?処理?プロシージャ?はPrivateにすることで、ある程度は対応できそうです。<br /> でも重複して同じコードがあちこちに書かれるのは避けたいですね(コードが増えるとその分、メンテナンスも大変になるので)</p> <p>クラスモジュールを使って、「この機能に対してのPublicな関数?プロシージャ?はこれを使いましょう」という限定ができるのは、良いと思いますが、</p> <p>ただ、(例えば初心者が)作るときにそこまで考えて作れるかな?というとちょっと疑問です。<br /> ある程度慣れてきたらそういう使い方に変えていく、とかじゃないと、<br /> 誰にも教わらずに、本だけで基礎を学んでも、<br /> それを実務で活用しようとする段階で、「まず、クラスを作って分けなければ」とやろうとしても、<br /> わからなくなって、何も進まなくなるような気もします。<br /> それともすんなり、この場合はこうしたほうがいい、とか、わかるものなのでしょうか。</p> <p>そういえば今、実務で扱っているVBAに一部、謎のクラスモジュールが存在していて、<br /> どこで使ってるんだこれ・・・というものがあるのですが、<br /> それを解析しないとですね・・・。</p> <p>VBAの「クラスモジュール」の使い方は、ここで基本がわかったので、<br /> クラスモジュールを恐れずに、解析していきたいと思います。</p> <h3 id="6-8  イベントを活用する"><a href="#6-8+%E3%80%80%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%82%92%E6%B4%BB%E7%94%A8%E3%81%99%E3%82%8B">6-8  イベントを活用する</a></h3> <p><strong>6-8-1 イベントに応答するオブジェクト変数を宣言する</strong></p> <blockquote> <p>シートやブックで発生するイベントで動作するイベントプロシージャは、その属するオブジェクトモジュールであるシートモジュールまたはブックモジュールに記述する必要がありました。<br /> しかしマクロの実行中に新規作成したシートやブックに対しては、そのモジュールにコードを記述することは叶いません。</p> <p>また、ユーザーフォームの複数のコントロールに同じイベントで同じ処理を追加したい場合、全てのコントロールについて同じイベントプロシージャを定義するのは明らかに冗長ですから、共通化したいと考えるでしょう</p> <p>そのようなときに、WithEventsキーワードを使うことができます。<br /> WithEventsキーワードを付与して宣言したオブジェクト変数は、イベントに応答するようになります。</p> </blockquote> <p>Private WithEvents varname [As type]</p> <blockquote> <p>変数varname に設定された固有オブジェクト型typeのオブジェクトは、その定義されているイベントに応答するようになり、そのイベントの発生をきっかけとしたイベントプロシージャを定義することができるようになります。</p> </blockquote> <p>具体的なコードの例として、マクロ実行中に追加したシートに対して、イベントが発生した時の処理を記述してあります。これは知りませんでした。便利そうです。<br /> ですが、共通化するときにはどうやって使うのだろう(具体的な記述のイメージがわかない)</p> <p><strong>6-8-2 独自のイベントを定義する</strong></p> <blockquote> <p>作成したクラスに独自のイベントを定義して使用することができます。</p> <p>クラス独自のイベントを定義するEventステートメント</p> </blockquote> <p>[Public] Event name [(arglist)]</p> <blockquote> <p>定義したイベントを発生させるRaiseEventステートメント</p> </blockquote> <p>RaiseEvent name [(argumentlsit)]</p> <p>具体的なコードの例が記述されています。<br /> 説明をされてからコードを見ると、やろうとしていることはわかりますが<br /> 何の説明もなくこのコードだけ書いてあったら、読むの辛いなあと思いました。<br /> (つまりコメントをしっかり書いておかないと、何をしているのかわからなくなりそう)</p> <p>確かに、コードは読めなくはないのだけど、実際に使うときは、なるべく独自イベント使わないで欲しいなあと願ってしまうのでした・・・。</p> <p>VBA、いろいろできるということを知ってとても勉強になるけど、<br /> 知ってても、できればあまり凝ったことをやらないでほしい(後からのメンテナンスが大変だから)</p> <p>と思ってしまうのは、いけないことでしょうか・・・。<br /> 基本的なところをしっかり書けるようになれば、後から読む人も(たとえそれが未来の自分であっても) 助かるので、<br /> 基本的なところはしっかり書けるようになってほしい(自分を含め)。</p> <p>でも何でもかんでも独自で作らないでほしい、一生自分でメンテナンスするなら止めないけど、<br /> 後から見た人が直すの大変よ、、、と思ってしまう私でした。</p> <p>使うなら、どうしてもその独自の方法しかない?それ以外の方法ない?っていうのを、検討してからにしてほしい・・・。</p> <p>(7章の最後までは書きたいので)続きます</p> <h2 id="▼著者サイト"><a href="#%E2%96%BC%E8%91%97%E8%80%85%E3%82%B5%E3%82%A4%E3%83%88">▼著者サイト</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://tonari-it.com/perfect-excel-vba/">書籍「パーフェクトExcel VBA」発売についてのお知らせ </a></p> <h2 id="▼Amazonリンク"><a href="#%E2%96%BCAmazon%E3%83%AA%E3%83%B3%E3%82%AF">▼Amazonリンク</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://www.amazon.co.jp/dp/4297108755/ref=cm_sw_r_tw_dp_U_x_Jab-DbGJPCAZ1">パーフェクトExcel VBA (PERFECT SERIES)   高橋 宣成著</a></p> Hata tag:crieit.net,2005:PublicArticle/15693 2020-01-23T05:41:01+09:00 2020-02-03T04:45:17+09:00 https://crieit.net/posts/VBA-6-2-3-Excel-VBA VBAをパーフェクトにマスターするシリーズ♪ 6章-2,3,4,5,6「モジュール」「パーフェクトExcel VBA」 <h2 id="■前回までの記事"><a href="#%E2%96%A0%E5%89%8D%E5%9B%9E%E3%81%BE%E3%81%A7%E3%81%AE%E8%A8%98%E4%BA%8B">■前回までの記事</a></h2> <p><a href="https://crieit.net/posts/VBA-Excel-VBA">VBAにもっと詳しくなろう♪ 「パーフェクトExcel VBA」</a></p> <p><a href="https://crieit.net/posts/VBA-2-Excel-VBA">VBAをパーフェクトにマスターするシリーズ♪ 2章「式と値」「パーフェクトExcel VBA」</a></p> <p><a href="https://crieit.net/posts/VBA-3-Excel-VBA">VBAをパーフェクトにマスターするシリーズ♪ 3章「ステートメント」「パーフェクトExcel VBA」</a></p> <p><a href="https://crieit.net/posts/VBA-4-Excel-VBA">VBAをパーフェクトにマスターするシリーズ♪ 4章「フロー制御ステートメント」「パーフェクトExcel VBA」</a></p> <p><a href="https://crieit.net/posts/VBA-5-Excel-VBA">VBAをパーフェクトにマスターするシリーズ♪ 5章「プロシージャ」「パーフェクトExcel VBA」</a></p> <p><a href="https://crieit.net/posts/VBA-6-1-Excel-VBA">VBAをパーフェクトにマスターするシリーズ♪ 6章-1「モジュール」「パーフェクトExcel VBA」</a></p> <p>続きを書きました。<br /> VBAをパーフェクトにマスターするシリーズ♪<br /> 今回は「6章-2,3,4,5,6」で新しく知ったことと、思ったことを簡単にまとめました。</p> <p><strong>6章は分厚いので少しずつ進めていきたいと思います。。。</strong></p> <p>※これは学習記録です。<br /> 書籍の内容はあえて多くは載せていません。<br /> 大事なことも省いていますので、詳細につきましては書籍をご覧ください。</p> <h2 id="■6章「モジュール」プログラムを部品ごとにまとめる"><a href="#%E2%96%A06%E7%AB%A0%E3%80%8C%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%80%8D%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E9%83%A8%E5%93%81%E3%81%94%E3%81%A8%E3%81%AB%E3%81%BE%E3%81%A8%E3%82%81%E3%82%8B">■6章「モジュール」プログラムを部品ごとにまとめる</a></h2> <p>標準モジュールとオブジェクトモジュールの違いは・・・</p> <p>標準モジュール以外が、オブジェクトモジュールのようです(シートモジュール、ブックモジュール、フォームモジュール、クラスモジュール)。</p> <p>それぞれできることとできないことがあります。</p> <h3 id="6-2  標準モジュールとオブジェクトモジュール"><a href="#6-2+%E3%80%80%E6%A8%99%E6%BA%96%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%A8%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB">6-2  標準モジュールとオブジェクトモジュール</a></h3> <p><strong>6-2-1 Meキーワード</strong></p> <p>オブジェクトモジュールでは、Meキーワードが使えます。そしてこのMeは省略できます。</p> <blockquote> <p>一方で、標準モジュールについてのオブジェクトの省略は複雑です。省略されたとみなされるプロパティがどのプロパティなのか、またActiveSheetプロパティやActiveWorkbookプロパティが、どのオブジェクトを指すのか、これらについてはコードの文脈や実行時の状態によって異なるからです。</p> </blockquote> <p>都合により、オブジェクトが固定されるシートモジュール、ブックモジュールはなるべく使いたくないのですが、クラスモジュールに辿り着くためにも、順番に学び進めていきたいと思います。</p> <p><strong>6-2-2 宣言できるメンバー</strong></p> <p>オブジェクトモジュールでは定数(とユーザー定義型)は宣言できません。</p> <blockquote> <p>パブリックレベルの定数、ユーザー定義型及び列挙型は、常に標準モジュールに記述するという方針でよいでしょう。</p> </blockquote> <p>(ユーザー定義型と列挙型はそもそも使っていないというか使えていないです、、、)</p> <p><strong>6-2-3 イベントとイベントプロシージャ</strong></p> <blockquote> <p>Excel VBA では、Workbook、Worksheet、UserFormなどのオブジェクトに対して、ユーザーがすぐに利用できるように、たくさんのイベントがあらかじめ定義されています。</p> <p>あらかじめ用意されているイベントを使用するだけでなく、独自のイベントを定義することができます。<br /> これらイベントについての発展的な活用については6-8で解説します。</p> </blockquote> <p><strong>6-2-4 オブジェクトモジュールの役割</strong></p> <blockquote> <p>シートやブックに関連したコードはシートモジュールやブックモジュールを使うとして、それ以外のコードはオブジェクトに関連しませんから、結果的にほとんどのコードを標準モジュールに記述することになってしまわないでしょうか?<br /> いえ、オブジェクトがないなら作ってしまえばよいのです。それを実現するのがクラスモジュールです。</p> <p>続く節では、オブジェクトモジュールに具体的にメンバーを追加する方法、すなわちプロパティ、メソッド、イベントの定義の方法について解説を進めていきます。</p> </blockquote> <h3 id="6-3  プロパティとメソッドの定義"><a href="#6-3+%E3%80%80%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%81%A8%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AE%E5%AE%9A%E7%BE%A9">6-3  プロパティとメソッドの定義</a></h3> <p><strong>6-3-1 オブジェクトのプロパティとメソッド</strong></p> <blockquote> <p>オブジェクトのプロパティとは、オブジェクトへのデータの設定、オブジェクトからのデータの取得のいずれかの機能、または両方の機能のことをいいます。</p> </blockquote> <p>プロパティを作成する方法<br /> ・モジュールレベル変数<br /> ・Property Let/Setプロシージャ<br /> ・Property Getプロシージャ</p> <blockquote> <p>オブジェクトに対して処理を実行するためのメンバーがメソッドです。<br /> オブジェクトにメソッドを追加するには、以下のどちらかのプロシージャをオブジェクトモジュールに宣言します。</p> </blockquote> <p>・Subプロシージャ<br /> ・Functionプロシージャ</p> <p><strong>6-3-2 パブリック変数によるプロパティ</strong><br /> <strong>6-3-3 プライベート変数によるプロパティ</strong></p> <p>プライベートプロパティは他のモジュールからアクセスできないので、<br /> 以降のプロシージャを使用して読み書きします。</p> <p><strong>6-3-4 Property Let/Setプロシージャによるプロパティの設定</strong></p> <p>書き込み用。</p> <p><strong>6-3-5 Property Getプロシージャによるプロパティの取得</strong></p> <p>読み込み用。</p> <blockquote> <p>設定または取得のいずれかに制限をかけたいときや、なんらかの処理を伴わせたいときは、こちらの手法を選択することになります。</p> </blockquote> <p>この辺は使えるようになると便利かなと思います。<br /> VBAでこのようなプロシージャが使えるということを、この本を読むまで知りませんでした。</p> <p><strong>6-3-6 Subプロシージャによるメソッドの定義</strong><br /> <strong>6-3-7 Functionプロシージャによるメソッドの定義</strong><br /> <strong>6-3-8 プロパティとメソッドを追加する方法の指針</strong></p> <p>Functionで戻り値を取得できるのに、なぜProperty Getもあるの?<br /> →方針を決めておいて(できるだけ)使い分けるようにしましょう。</p> <h3 id="6-4  シートモジュール"><a href="#6-4+%E3%80%80%E3%82%B7%E3%83%BC%E3%83%88%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB">6-4  シートモジュール</a></h3> <p><strong>6-4-2 シートのオブジェクト名とシート名</strong></p> <p>シートには、Excelのタブに表示されている「シート名」とは別に、「オブジェクト名」があります。シート名は誰でも変更することができるので、プログラムを書くときには「オブジェクト名」を使った方が良いでしょう。</p> <p>書籍では「シートモジュールでできることはシートモジュールに書いて、標準モジュールをコンパクトに保ちましょう。」というのが方針のようです。</p> <p>標準モジュールは影響(させることのできる)範囲が広いので、そのシートでしか操作しないこと、またそのシートでのイベント処理は、シートモジュールに書きましょう、というのが基本のスタンスです。</p> <p>(余談ですが、私の今関わっている仕事では、ある目的があって、これの逆をしようとしています。いつでも使えるたった一つの正解はないので、状況によってその都度、最適解を探すのがよいかと思います。)</p> <h3 id="6-5  ブックモジュール"><a href="#6-5+%E3%80%80%E3%83%96%E3%83%83%E3%82%AF%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB">6-5  ブックモジュール</a></h3> <p><strong>6-5-3 ブックモジュールの使用</strong></p> <p>ブックモジュールのイベント処理については、11章で紹介されます。</p> <h3 id="6-6  ユーザーフォーム"><a href="#6-6+%E3%80%80%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0">6-6  ユーザーフォーム</a></h3> <p>**6-6-6 タブオーダー*</p> <p>ユーザーフォームを右クリックして、「タブオーダー」を選ぶと、まとめて順番を変更することができます。</p> <p>し・り・ま・せ・ん・でした!!</p> <p>今まで、プロパティウィンドウの「TabIndex」をちまちまと変えていました。</p> <p>次はいよいよ待望のクラスモジュールです!</p> <p>続く。</p> <h2 id="▼著者サイト"><a href="#%E2%96%BC%E8%91%97%E8%80%85%E3%82%B5%E3%82%A4%E3%83%88">▼著者サイト</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://tonari-it.com/perfect-excel-vba/">書籍「パーフェクトExcel VBA」発売についてのお知らせ </a></p> <h2 id="▼Amazonリンク"><a href="#%E2%96%BCAmazon%E3%83%AA%E3%83%B3%E3%82%AF">▼Amazonリンク</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://www.amazon.co.jp/dp/4297108755/ref=cm_sw_r_tw_dp_U_x_Jab-DbGJPCAZ1">パーフェクトExcel VBA (PERFECT SERIES)   高橋 宣成著</a></p> Hata tag:crieit.net,2005:PublicArticle/15670 2020-01-09T10:28:40+09:00 2020-01-09T10:30:48+09:00 https://crieit.net/posts/VBA-6-1-Excel-VBA VBAをパーフェクトにマスターするシリーズ♪ 6章-1「モジュール」「パーフェクトExcel VBA」 <h2 id="■前回までの記事"><a href="#%E2%96%A0%E5%89%8D%E5%9B%9E%E3%81%BE%E3%81%A7%E3%81%AE%E8%A8%98%E4%BA%8B">■前回までの記事</a></h2> <p><a href="https://crieit.net/posts/VBA-Excel-VBA">VBAにもっと詳しくなろう♪ 「パーフェクトExcel VBA」</a></p> <p><a href="https://crieit.net/posts/VBA-2-Excel-VBA">VBAをパーフェクトにマスターするシリーズ♪ 2章「式と値」「パーフェクトExcel VBA」</a></p> <p><a href="https://crieit.net/posts/VBA-3-Excel-VBA">VBAをパーフェクトにマスターするシリーズ♪ 3章「ステートメント」「パーフェクトExcel VBA」</a></p> <p><a href="https://crieit.net/posts/VBA-4-Excel-VBA">VBAをパーフェクトにマスターするシリーズ♪ 4章「フロー制御ステートメント」「パーフェクトExcel VBA」</a></p> <p><a href="https://crieit.net/posts/VBA-5-Excel-VBA">VBAをパーフェクトにマスターするシリーズ♪ 5章「プロシージャ」「パーフェクトExcel VBA」</a></p> <p>続きを書きました。<br /> VBAをパーフェクトにマスターするシリーズ♪<br /> 今回は「6章-1」で新しく知ったことと、思ったことを簡単にまとめました。</p> <p><strong>6章は分厚いので少しずつ進めていきたいと思います。。。</strong></p> <p>※これは学習記録です。<br /> 書籍の内容は、あえて多くは載せていません。<br /> 大事なことも省いていますので、詳細につきましては、ぜひ書籍をご覧ください。</p> <h2 id="■6章「モジュール」プログラムを部品ごとにまとめる"><a href="#%E2%96%A06%E7%AB%A0%E3%80%8C%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%80%8D%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E9%83%A8%E5%93%81%E3%81%94%E3%81%A8%E3%81%AB%E3%81%BE%E3%81%A8%E3%82%81%E3%82%8B">■6章「モジュール」プログラムを部品ごとにまとめる</a></h2> <h3 id="6-1  モジュールとは"><a href="#6-1+%E3%80%80%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%A8%E3%81%AF">6-1  モジュールとは</a></h3> <p><strong>6-1-1 モジュール化とそのメリット</strong></p> <p>モジュールを分けよう、という話です。<br /> モジュールを分けるのは大事です。前提としてどこを切り離したほうがいいか、わかっている必要がありますが。<br /> 後から分けることも可能です。ただし後から分けようしたときには、すでに複雑になりすぎている場合もありますね、、。</p> <p>合わせて、どのモジュールがどの機能で使われているのか、というドキュメントを作る必要がありそうです(私の場合)。今、ほとんどドキュメント作ってないので、、作ります、、</p> <p><strong>6-1-2 メンバーをどこに追加するか</strong></p> <blockquote> <p>標準モジュールに記述したパブリックレベルのメンバーは、常にグローバルのメンバーとなります。</p> </blockquote> <p>ですよね・・・。<br /> どこからでもアクセスできるうえに、名前がかぶるのは避けたいし、どれがどれだかわからなくなっていく。</p> <blockquote> <p>その問題を解決するための一つの手段として、標準モジュールではなく、オブジェクトモジュールを使うという選択肢が用意されています。</p> <p>このように、モジュールによる機能の部品課をする上で、オブジェクトにメンバーを追加するという選択肢は重要かつ効果的です。それを実現するためには、標準モジュールだけではなく、それ以外のモジュールとその使い方について知る必要があります。</p> </blockquote> <p>解決法が!見えてきました!!(知らなかったです、、キケン!)</p> <p>読んでよかった・・・(涙)</p> <p><strong>6-1-3 モジュールの分類</strong></p> <blockquote> <p>クラスモジュールは、オブジェクトの定義すなわちクラスを作成するためのモジュールです。<br /> クラスモジュールを使用することで、オリジナルのオブジェクトを作成することができます。</p> </blockquote> <p>クラスモジュールを使ったことがないので、これから学んでいきたいです。</p> <p>それにしても、VBA実務を半年近くやっているので、本書がものすごく身に染みています。<br /> 読み進めるごとに、知らないといけない、とても大事なことがたくさん書かれています。<br /> 知らないでよくやってたなーとしみじみ、、、まだ書籍の先は長いですが、、、</p> <p>今のタイミングが、身につくにはちょうど良かったのかもしれません。<br /> 初級から中級にステップアップするために、読み進めていきたいと思います。</p> <p>知らなかったことを知れるのって喜びですよね!</p> <h2 id="▼著者サイト"><a href="#%E2%96%BC%E8%91%97%E8%80%85%E3%82%B5%E3%82%A4%E3%83%88">▼著者サイト</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://tonari-it.com/perfect-excel-vba/">書籍「パーフェクトExcel VBA」発売についてのお知らせ </a></p> <h2 id="▼Amazonリンク"><a href="#%E2%96%BCAmazon%E3%83%AA%E3%83%B3%E3%82%AF">▼Amazonリンク</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://www.amazon.co.jp/dp/4297108755/ref=cm_sw_r_tw_dp_U_x_Jab-DbGJPCAZ1">パーフェクトExcel VBA (PERFECT SERIES)   高橋 宣成著</a></p> Hata tag:crieit.net,2005:PublicArticle/15653 2019-12-29T13:52:00+09:00 2019-12-29T13:56:37+09:00 https://crieit.net/posts/VBA-5-Excel-VBA VBAをパーフェクトにマスターするシリーズ♪ 5章「プロシージャ」「パーフェクトExcel VBA」 <h2 id="■前回までの記事"><a href="#%E2%96%A0%E5%89%8D%E5%9B%9E%E3%81%BE%E3%81%A7%E3%81%AE%E8%A8%98%E4%BA%8B">■前回までの記事</a></h2> <p><a href="https://crieit.net/posts/VBA-Excel-VBA">VBAにもっと詳しくなろう♪ 「パーフェクトExcel VBA」</a></p> <p><a href="https://crieit.net/posts/VBA-2-Excel-VBA">VBAをパーフェクトにマスターするシリーズ♪ 2章「式と値」「パーフェクトExcel VBA」</a></p> <p><a href="https://crieit.net/posts/VBA-3-Excel-VBA">VBAをパーフェクトにマスターするシリーズ♪ 3章「ステートメント」「パーフェクトExcel VBA」</a></p> <p><a href="https://crieit.net/posts/VBA-4-Excel-VBA">VBAをパーフェクトにマスターするシリーズ♪ 4章「フロー制御ステートメント」「パーフェクトExcel VBA」</a></p> <p>続きを書きました。<br /> VBAをパーフェクトにマスターするシリーズ♪<br /> 今回は「5章」で新しく知ったことと、思ったことを簡単にまとめました。</p> <p>これは学習記録です。<br /> 書籍の内容は、あえて多くは載せていません。<br /> 大事なことも省いていますので、詳細につきましては、ぜひ書籍をご覧ください。</p> <h2 id="■5章「プロシージャ」手続きに名前を付ける"><a href="#%E2%96%A05%E7%AB%A0%E3%80%8C%E3%83%97%E3%83%AD%E3%82%B7%E3%83%BC%E3%82%B8%E3%83%A3%E3%80%8D%E6%89%8B%E7%B6%9A%E3%81%8D%E3%81%AB%E5%90%8D%E5%89%8D%E3%82%92%E4%BB%98%E3%81%91%E3%82%8B">■5章「プロシージャ」手続きに名前を付ける</a></h2> <h3 id="5-2  Subプロシージャ"><a href="#5-2+%E3%80%80Sub%E3%83%97%E3%83%AD%E3%82%B7%E3%83%BC%E3%82%B8%E3%83%A3">5-2  Subプロシージャ</a></h3> <p><strong>5-2-2 Subプロシージャの呼び出し</strong></p> <p><strong>[Call]</strong> <em>name [argumentlist]</em></p> <p>Callキーワードは省略可能。<br /> 但し、Callキーワードを書いたときは、引数リストの丸かっこが必要 <strong>Call</strong> <em>name (argumentlist)</em><br /> Callキーワードを省略したときは、引数リストの丸かっこが不要 <em>name argumentlist</em></p> <p>そんな違いがあるそうです。<br /> しかも引数が1つの場合は、Callキーワードなしで丸かっこを付けてもエラーにならない。</p> <p>結論:Callキーワードを書いたほうが見やすいので、常に書くようにしたい。</p> <h3 id="5-3 引数の構文"><a href="#5-3%E3%80%80%E5%BC%95%E6%95%B0%E3%81%AE%E6%A7%8B%E6%96%87">5-3 引数の構文</a></h3> <p><strong>5-3-1 引数の指定項目</strong></p> <p><strong>Sub</strong> <em>name</em> ([<em>arglist</em>])<br /> [<em>statements</em>]<br /> <strong>End Sub</strong></p> <p>▼引数の構文<br /> [<strong>Optional</strong>] [<strong>ByVal</strong>|<strong>ByRef</strong>] [<strong>ParamArray</strong>] <em>varname</em>[()] [<strong>As</strong> <em>type</em>] [ = <em>defaultvalue</em>]</p> <p>・ByVal、ByRefを省略すると、規定はByRefになる。</p> <p>引数では、規定値(defaultvalue)を指定することもできるようです。知りませんでした。<br /> 以降で詳しく説明されています。</p> <p><strong>5-3-2 引数の順序と名前</strong></p> <pre><code>Call SayHello ( name:="Bob", message:="Hello") </code></pre> <p>名前付きで引数を指定することもできる!</p> <p><strong>5-3-3 引数をオプションにする</strong></p> <pre><code>Sub SayHello(message As String, Optional name As String = "Bob") End Sub </code></pre> <p>・引数の構文の先頭にOptionalをつけると省略可能になる。<br /> ・その際に規定値を指定することができる(しないでもOK)。<br /> ・Optionalを付けた引数以降の引数は、すべてOptionalにしなければいけない。</p> <p>・引数のデータ型がオブジェクト型の場合は、規定値にはNotingのみが設定可能だが、規定値を省略してもNotingになる。</p> <p><strong>5-3-4 値渡しと参照渡し</strong></p> <p>・ByVal、ByRefを省略すると、規定はByRefになる。</p> <blockquote> <p>特に理由がなければByValキーワードを付与して値渡しにするほうがよいでしょう。</p> </blockquote> <p>著者曰く、参照渡しには処理速度やメモリ容量の点でメリットもあるが、可読性や現在のPC性能を考えると値渡しのほうを推奨しますとのこと。</p> <p><strong>5-3-5 配列を引数として渡す</strong></p> <p>・引数として配列を渡すことができる。<br /> ・動的配列として受け取る方法とVariant型の変数として受け取る方法がある。</p> <p>・動的配列の場合は参照渡しのみ可。(固定配列は渡せない。上限下限を指定できないため)</p> <pre><code>Sub Increment ( ByRef num() As Long) End Sub </code></pre> <p>・Variant型の変数として受け取る場合、値渡しが可能となる。</p> <pre><code>Sub Increment ( ByVal num As Variant) End Sub </code></pre> <p><strong>5-3-6 パラメーター配列</strong></p> <blockquote> <p>パラメーター配列を使用すると、任意の数の引数を配列として受け取ることができます。</p> </blockquote> <p>引数の数を固定せずに受け取れる機能。扱いに注意が必要。<br /> いくつか条件が記載されています。</p> <p>個人的には、特別な理由があるときに使うもので、敢えて進んで使うものではないように思います。</p> <h3 id="5-4 Functionプロシージャ"><a href="#5-4%E3%80%80Function%E3%83%97%E3%83%AD%E3%82%B7%E3%83%BC%E3%82%B8%E3%83%A3">5-4 Functionプロシージャ</a></h3> <p><strong>5-4-1 Functionプロシージャの定義</strong></p> <blockquote> <p>Functionプロシージャは、手続きを実行した結果戻り値を返すプロシージャです。</p> </blockquote> <p><strong>5-4-2 Functionプロシージャの呼び出し</strong></p> <blockquote> <p>Functionプロシージャを他のプロシージャから呼び出すには、戻り値を使用するかどうかで2つの構文を使い分ける必要があります。</p> </blockquote> <p>戻り値を使用しないのならFunctionプロシージャにしなくて良いのでは?と思いましたが、<br /> 呼び出す側のプログラムが複数あって、使用したい場合とそうでない場合がある、ということであれば、そのような状況もありそうです。</p> <p>えーと。</p> <blockquote> <p>戻り値を受け取らずに、破棄しても良い場合は、Subプロシージャの呼び出しと同様、Callステートメントを使用することでFinctionプロシージャnameを呼び出すことができます。</p> </blockquote> <p>[Call] <em>name</em> [<em>argumentlist</em>]</p> <blockquote> <p>戻り値を受け取るようにFunctionプロシージャを使用する場合は、以下のようにFunctionプロシージャ名nameに続けて、引数リストaumumentlistを丸かっこで囲みます。引数を一つも渡さない場合は丸かっこは不要となります。</p> </blockquote> <p><em>name</em> [ ( <em>argumentlist</em> ) ]</p> <blockquote> <p>このように、Functionプロシージャを呼び出す場合は、戻り値を使用するかどうかで引数リストを丸かっこで囲むかどうかが決まりますので注意が必要です。</p> </blockquote> <p>えーと。。<br /> 今まで私はFunctionプロシージャを使うときは、戻り値を使用する前提で使っていたので、えーと、どういうことだろう、、、いらない場合があるのはわかるのですが、引数をかっこで囲まない? というのが少しややこしくて混乱しています。<br /> 「戻り値を使わない場合、Callで呼べるけど、引数をかっこで囲まない。」という決まりがある、ということですね。</p> <p><strong>5-4-3 Functionプロシージャから複数の値を返す</strong></p> <blockquote> <p>Functionプロシージャの戻り値は複数にすることはできません。したがって、複数の値を返したいというときには、ひと工夫が必要になります。</p> </blockquote> <p>・Typeステートメントによるユーザー定義型を使って複数の値を返すことが可能。<br /> ・引数として複数の値を参照渡しで渡す。参照渡しなので値が変わる。</p> <p>Typeステートメントを使ったことはありませんでした。後者が使われているコードは読んだことがありますが、モジュールレベル変数にしては?と思ったり、なぜSubではなくFuntionなのだろう?と思ったりしていました。</p> <blockquote> <p>「戻り値を複数にする」という課題に対する手段は、多くの選択肢があり、これはVBAという言語の特徴をよく表しています。<br /> つまりVBAは同じ目的に対して多くの選択肢が存在していて、その中からメリットとデメリットを踏まえて判断する能力が求められるということです。</p> </blockquote> <h3 id="5-5 Propertyプロシージャ"><a href="#5-5%E3%80%80Property%E3%83%97%E3%83%AD%E3%82%B7%E3%83%BC%E3%82%B8%E3%83%A3">5-5 Propertyプロシージャ</a></h3> <p>し、知らない。こんな機能があるなんて。</p> <p><strong>5-5-1 Propertyプロシージャとプロパティ</strong></p> <blockquote> <p>Propertyプロシージャは、クラスモジュールで使用されるものと言われることが多いですが、標準モジュールを始め、他のモジュールでも使用することができます。<br /> 詳しくは6章で紹介しますが、</p> <p>本節では、標準モジュールに「プロパティ」を作成していく方法を見ていくことにしましょう。</p> </blockquote> <p><strong>5-5-2 Property Let/Setプロシージャの定義</strong></p> <blockquote> <p>Property LetプロシージャおよびProperty Setプロシージャは、モジュール変数に値またはオブジェクト参照を設定するためのプロシージャです。</p> </blockquote> <p><strong>5-5-3 Property Letプロシージャの呼び出し</strong></p> <p>変数はPrivateにしておいて、Property LetはPublicにしておくと、<br /> Property Letを通るときに、変数に入る値をチェックすることができる。<br /> 適切でない値が変数に入らないようにすることが可能です。(カプセル化ですね。)</p> <p><strong>5-5-4 Property Setプロシージャの呼び出し</strong></p> <p>Letと同様に。</p> <p><strong>5-5-5 Property Getプロシージャの定義</strong></p> <p>Getは取得のほう。</p> <p><strong>5-5-6 Property Getプロシージャの呼び出し</strong></p> <p><em>name [(argumentlist)]</em></p> <p>値を返すので、Callは不要。(だけどいきなり唐突に書いてあるので、コードをパッと見ると「何コレ?!」ってなりますね。</p> <blockquote> <p>Property Getプロシージャは手続きを持つことができますので、モジュール変数に処理を加えて取り出すことができます。つまりモジュール変数を増やさずともプロパティを作ることができます。</p> </blockquote> <p>便利です。</p> <pre><code>Private price_ As Long Public Property Let Price(ByVal newPrice As Long) If newPrice >= 0 Then price_ = newPrice Else price_ = 0 End Property Public Property Get Price() As Long Price = price_ End Property Public Property Get TaxIncluded() As Currency Const TAX_RATE As Currency = 0.08 TaxIncluded = price_ * (1 + TAX_RATE) End Property </code></pre> <p>▼別モジュール</p> <pre><code> Sub MySub() Price = 100 Debug.Print Price, TaxIncluded End Sub </code></pre> <blockquote> <p>適切なプロシージャ化は、ただのコードの羅列についてその役割を浮き彫りにして、使いまわしがきくようにします。また、その守備範囲を線引きして、無関係な処理との関連性を下げます。</p> <p>ある処理が存在するとき、それについてどのようなまとまりでプロシージャ化するのか、またどのようなプロシージャ名にするか、引数や戻り値の受け渡し方法はいかにするかなど常に考えを巡らせて、その判断力を磨き続けていきましょう。</p> </blockquote> <p>これは理想的ですがとても難しいことだなーと思っています。<br /> 実務の場合、ある機能Aを作ったあとに、まったく別の機能Bを作り、次に機能Cを作るときになって、そういえばAの機能で作った箇所が部分的に使えるかも、となることはあります。</p> <p>そのときに、機能Aを見直して、共通の処理を共通のモジュールに移動させることができればいいのですが、「大至急作る」ときにそこまでなかなかできず、結果的に機能Aと機能Cにそれぞれ別の同じ処理を書いてしまうこともあります。</p> <p>もしくは機能Aの箇所に書いている処理を機能Cからも呼び出して使うのですが、そうすると今度は機能を減らすときに、コードを削るのが難しくなります。</p> <p>リファクタリングは大事ですが時間と手間がかかります。<br /> 作る段階で全体像を見渡せればよいのですが、継ぎ足し継ぎ足し作っている場合は、<br /> できるだけ、その都度コードの見直しができたらいいのでしょう。。<br /> すくなくとも、後からでもわかりやすいように命名に気を付けようと思います。</p> <p>今回こうしてまとめて学習して、こんな機能があったのか-知らなかった、ということも多かったです。<br /> 最初からすべてを理解して進めるのは難しいですが、<br /> どこかのタイミングで改めて、総合的に学習することはとても大切な気がしています。</p> <p>本書、まだ1/3にもたどり着いていません。先は長いですね・・・。</p> <h2 id="▼著者サイト"><a href="#%E2%96%BC%E8%91%97%E8%80%85%E3%82%B5%E3%82%A4%E3%83%88">▼著者サイト</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://tonari-it.com/perfect-excel-vba/">書籍「パーフェクトExcel VBA」発売についてのお知らせ </a></p> <h2 id="▼Amazonリンク"><a href="#%E2%96%BCAmazon%E3%83%AA%E3%83%B3%E3%82%AF">▼Amazonリンク</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://www.amazon.co.jp/dp/4297108755/ref=cm_sw_r_tw_dp_U_x_Jab-DbGJPCAZ1">パーフェクトExcel VBA (PERFECT SERIES)   高橋 宣成著</a></p> Hata tag:crieit.net,2005:PublicArticle/15644 2019-12-28T09:45:03+09:00 2019-12-28T09:51:35+09:00 https://crieit.net/posts/VBA-4-Excel-VBA VBAをパーフェクトにマスターするシリーズ♪ 4章「フロー制御ステートメント」「パーフェクトExcel VBA」 <h2 id="■前回までの記事"><a href="#%E2%96%A0%E5%89%8D%E5%9B%9E%E3%81%BE%E3%81%A7%E3%81%AE%E8%A8%98%E4%BA%8B">■前回までの記事</a></h2> <p><a href="https://crieit.net/posts/VBA-Excel-VBA">VBAにもっと詳しくなろう♪ 「パーフェクトExcel VBA」</a></p> <p><a href="https://crieit.net/posts/VBA-2-Excel-VBA">VBAをパーフェクトにマスターするシリーズ♪ 2章「式と値」「パーフェクトExcel VBA」</a></p> <p><a href="https://crieit.net/posts/VBA-3-Excel-VBA">VBAをパーフェクトにマスターするシリーズ♪ 3章「ステートメント」「パーフェクトExcel VBA」</a></p> <p>続きを書きました。<br /> VBAをパーフェクトにマスターするシリーズ♪<br /> 今回は「4章」で新しく知ったことと、思ったことを簡単にまとめました。</p> <p>これは学習記録です。<br /> 書籍の内容は、あえて多くは載せていません。<br /> 大事なことも省いていますので、詳細につきましては、ぜひ書籍をご覧ください。</p> <h2 id="■4章「フロー制御ステートメント」"><a href="#%E2%96%A04%E7%AB%A0%E3%80%8C%E3%83%95%E3%83%AD%E3%83%BC%E5%88%B6%E5%BE%A1%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88%E3%83%A1%E3%83%B3%E3%83%88%E3%80%8D">■4章「フロー制御ステートメント」</a></h2> <h3 id="4-2  Select Caseステートメント"><a href="#4-2+%E3%80%80Select+Case%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88%E3%83%A1%E3%83%B3%E3%83%88">4-2  Select Caseステートメント</a></h3> <p><strong>4-2-3 文字列を判定する</strong></p> <blockquote> <p>式リストにToキーワードやIsキーワードを用いることで、文字列が指定の範囲に含まれるかという判定が可能です。</p> </blockquote> <pre><code>Sub MySub() Dim c As String Select Case c Case "0" To "9" '半角数字 Case "A" To "Z", "a" To "z" '半角アルファベット Case Else End Select End Sub </code></pre> <p>正規表現で指定するのではなく、こんな書き方もできるそうです!<br /> 知りませんでした。</p> <h3 id="4-4 For Each ~ Next ステートメント"><a href="#4-4%E3%80%80For+Each+%EF%BD%9E+Next+%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88%E3%83%A1%E3%83%B3%E3%83%88">4-4 For Each ~ Next ステートメント</a></h3> <p><strong>4-4-2 コレクションに対する反復処理</strong></p> <blockquote> <p>Excel VBAでは、多くのオブジェクトについてその集合を表すコレクションが用意されています。<br /> たとえば、Wrokbooks、Worksheets、Range、ListRowsなどです。</p> <p>多くのコレクションは、その要素数を返すCountプロパティを持ちますので、For ~ Next ステートメントで代替することも可能です。</p> </blockquote> <p><strong>4-4-3 配列に対する反復処理</strong></p> <blockquote> <p>配列に対する反復処理の場合は、ループ内で使用する変数をVariantg型にする必要があり、その点でわかりづらくなってしまうというデメリットがあります。</p> <p>For ~ Next文の初期値にLBound関数、終了値にUBound関数を用いる記述を用いることのほうが多いようです。</p> </blockquote> <pre><code> Dim numbers(1 To 3) As Long Dim i As Long For i = LBound(numbers) To UBound(numbers) Debug.Print numbers(i) Next i </code></pre> <p>私はFor~Nextのほうが好みなので、どちらかといえばEachを使わないことが多いです。</p> <p>でもこういうときには、こっちのほうが便利でしょう?・・・と言われたらそうなのかな。</p> <pre><code> Dim numbers(1, 1) As Long numbers(0, 0) = 0: numbers(1, 0) = 1 numbers(0, 1) = 2: numbers(1, 1) = 3 Dim number As Variant For Each number In numbers Debug.Print number Next number </code></pre> <p>「全部」の処理をしてる、というのがわかりやすいから、ということのようです。<br /> 入れ子になっても良いと思うのだけど、どうなんでしょう。<br /> 順番を指定して処理したいかどうか?というのも大きそうです。<br /> おおよそ指定したいことが多いです、私の場合。</p> <h3 id="4-6 処理の終了とスキップ"><a href="#4-6%E3%80%80%E5%87%A6%E7%90%86%E3%81%AE%E7%B5%82%E4%BA%86%E3%81%A8%E3%82%B9%E3%82%AD%E3%83%83%E3%83%97">4-6 処理の終了とスキップ</a></h3> <p><strong>4-6-1 Exitステートメント</strong></p> <blockquote> <p>Exit Property ・・・ Propertyプロシージャを終了する</p> </blockquote> <p>「Exit Property」は知りませんでした。そんなのあるんだ。<br /> っていうか「Propertyプロシージャ」って何だろう?(※5章に載ってました)</p> <p><strong>4-6-3 Exitステートメントによるループの終了</strong></p> <p>For文が入れ子になっているとき、内側のFor文から一気に外側のFor文も抜けたい場合、<br /> 外側をDo~Loop文、内側をFor文にして、Exit Doで一気に抜けられるテクニックが載っていました。</p> <p>私の場合、入れ子になっていて両方抜けたい場合は、フラグ(Boolean)を使っているような気がします。</p> <p><strong>4-6-4 GoToステートメントによるループのスキップ</strong></p> <p>他のプログラミング言語にはあるContinueがないので、ループのスキップにGoToが使えます、という話です。</p> <blockquote> <p>本節で紹介したループのスキップ、4-7で紹介するエラー処理など、特定の目的以外での使用は避けたほうがよいでしょう。</p> </blockquote> <p>乱用は避けましょう。</p> <h3 id="4-7 処理の中断"><a href="#4-7%E3%80%80%E5%87%A6%E7%90%86%E3%81%AE%E4%B8%AD%E6%96%AD">4-7 処理の中断</a></h3> <p><strong>4-7-1 Stopステートメント</strong></p> <p>Stopの使い方。Stopでは必ず止まります。次のAssertは、</p> <p><strong>4-7-2 Debug.Assertステートメント</strong></p> <p><strong>Debug.Assert</strong> <em>booleanexpression</em></p> <blockquote> <p>booleanexpressionはブール式で、<strong>Falseに評価された場合にのみ、処理を中断します。</strong></p> <p>異常値の検出にも有効です。</p> </blockquote> <pre><code>Debug.Assert cell.Value >= 0 </code></pre> <p>→cell.Valueが負の数だと止まるので、</p> <blockquote> <p>本来0以上の数のみしか存在しえないのであれば、負の数が検出された時点で処理が中断し、異常値への対応を行うことができます。</p> </blockquote> <p>Debug.Assert、使っていなかったのですが、今後は活用したいと思います。</p> <h3 id="4-8 エラー処理"><a href="#4-8%E3%80%80%E3%82%A8%E3%83%A9%E3%83%BC%E5%87%A6%E7%90%86">4-8 エラー処理</a></h3> <p>大事なエラー処理ですが、少し身構えてしまいます。</p> <p><strong>4-8-1 On Errorステートメント</strong></p> <p><strong>On Error</strong> { <strong>GoTo</strong> <em>line</em> | <strong>Resume Next</strong> | <strong>GoTo 0</strong> }</p> <blockquote> <p>On Error Resume Next ・・・ エラー処理を有効にし、以降で発生したすべての実行時エラーを無視する<br /> On Error GoTo 0  ・・・ 有効になっているエラー処理をすべて無効にする</p> </blockquote> <p><strong>4-8-2 エラー発生時に処理を分岐する</strong><br /> <strong>On Error GoTo</strong> <em>line</em></p> <pre><code> On Error GoTo ErrorHandler '~処理~ ErrorHandler: Debug.Print Err.Description </code></pre> <p>Err.Description が気になりました。<br /> (Errオブジェクトについては9章で紹介されているそうです)</p> <p><strong>4-8-3 エラーを無視する</strong><br /> On Error Resume Next</p> <blockquote> <p>エラーを無視してもその後の処理に影響がないという確信がある場合にのみ使用すべきでしょう。</p> </blockquote> <p>最近、なんでここでエラー出るねん、と思って、そのあとの処理に影響なかったので、使ったことがあります。<br /> あまり使いたくないです。</p> <p><strong>4-8-4 エラー処理を無効にする</strong><br /> <strong>On Error GoTo 0</strong></p> <pre><code> On Error Resume Next Debug.Print x / y Debug.Print "エラーが無視されました" On Error GoTo 0 </code></pre> <blockquote> <p>On Error Resume Nextステートメントを使用する際には、その影響範囲を少なくすることができますので、積極的に使用するとよいでしょう。</p> </blockquote> <p>この辺、すこし苦手意識があります。もっと慣れたいところです。平常心で挑みたい。<br /> 人が書いたコードにOn Error ~ と書いてあると、一瞬、ウッ、となるんですよね。何してるんだろうと思って、身構えてしまいます。<br /> 今回、本書を読んで、前より少し馴染めた気がします。実戦(戦い?)に活かしたいです。</p> <p><strong>4-8-5 Resumeステートメント</strong></p> <blockquote> <p>エラー処理ルーチンから、元の処理に戻ることもできます。</p> </blockquote> <p>えっ、戻れるの?!</p> <blockquote> <p>▼Resume ステートメントの種類<br /> Resume  ・・・ エラーが発生したステートメントに処理を移す<br /> Resume Next  ・・・ エラーが発生したステートメントの次のステートメントに処理を移す<br /> Resume <em>line</em> ・・・ <em>line</em> で指定した行ラベルまたは行番号に処理を移す</p> </blockquote> <pre><code> On Error GoTo ErrorHandler Dim x As Long, y As Long x = 1 Debug.Print x / y ErrorHandler: y = 5 Resume </code></pre> <p>こんなことまでできてしまう!</p> <p>・・・なのですが、</p> <blockquote> <p>エラー処理を充実させるとコードが増え、可読性やメンテナンスの負荷が上がります。</p> </blockquote> <p>ということなので、あまり書きすぎるのも良くないようです。<br /> その辺、バランス良く考えてから、作りたいところです。</p> <h3 id="4-9 Withステートメント"><a href="#4-9%E3%80%80With%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88%E3%83%A1%E3%83%B3%E3%83%88">4-9 Withステートメント</a></h3> <p>4-9-2 Withステートメントのオブジェクト参照のしくみ</p> <blockquote> <p>Withステートメントを使用するメリットはもう一つあります。<strong>オブジェクト参照の回数を減らせる</strong>ということです。</p> </blockquote> <p>実は、Withもあまり好きではないのですが(好みの問題)、使いますよね。<br /> 見やすい以外にも、処理が速い(体感できるかはさておき)ようです。</p> <p>.</p> <blockquote> <p>本章では、一般的にある程度使用されていると思われるものについては、隠さずに紹介をするようにしました。実際に、どれをどのように使用するかについてのヒントにも触れながら解説を進めましたが、都度「作法」と照らし合わせて、判断をするようにしてください。</p> </blockquote> <p>とても大事でとても難しいポイントかなと思います。</p> <p>次回はプロシージャです。<br /> プロシージャ、、まだすぐに言葉の意味が理解できません。Subプロシージャ、Functionプロシージャ、等ですね。。。</p> <p>私は「暗記」が非常に苦手です。プログラミングでは、カタカナや英語の略称が山ほど出てくるので、慣れるしかないですね。今までは雰囲気で理解していましたが(それを理解しているというのか?)、今回はゆっくり読んで、アウトプットもしながら、なので、反復でなじませていければと思っています。</p> <h2 id="▼著者サイト"><a href="#%E2%96%BC%E8%91%97%E8%80%85%E3%82%B5%E3%82%A4%E3%83%88">▼著者サイト</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://tonari-it.com/perfect-excel-vba/">書籍「パーフェクトExcel VBA」発売についてのお知らせ </a></p> <h2 id="▼Amazonリンク"><a href="#%E2%96%BCAmazon%E3%83%AA%E3%83%B3%E3%82%AF">▼Amazonリンク</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://www.amazon.co.jp/dp/4297108755/ref=cm_sw_r_tw_dp_U_x_Jab-DbGJPCAZ1">パーフェクトExcel VBA (PERFECT SERIES)   高橋 宣成著</a></p> Hata