tag:crieit.net,2005:https://crieit.net/tags/%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/tags/%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 tag:crieit.net,2005:PublicArticle/15642 2019-12-27T10:39:39+09:00 2019-12-27T13:03:13+09:00 https://crieit.net/posts/VBA-3-Excel-VBA VBAをパーフェクトにマスターするシリーズ♪ 3章「ステートメント」「パーフェクト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>続きを書きました。<br /> VBAをパーフェクトにマスターするシリーズ♪<br /> 今回は「3章」で新しく知ったことと、思ったことを簡単にまとめました。<br /> 詳細につきましては、書籍をご覧ください。</p> <h2 id="■3章「ステートメント」"><a href="#%E2%96%A03%E7%AB%A0%E3%80%8C%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88%E3%83%A1%E3%83%B3%E3%83%88%E3%80%8D">■3章「ステートメント」</a></h2> <h3 id="3-1  ステートメントとは"><a href="#3-1+%E3%80%80%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88%E3%83%A1%E3%83%B3%E3%83%88%E3%81%A8%E3%81%AF">3-1  ステートメントとは</a></h3> <p>3-1-2 ステートメントの記述</p> <p>前回気になった、コロン記号についての記述はここにありました。</p> <h3 id="3-2 スコープ"><a href="#3-2%E3%80%80%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97">3-2 スコープ</a></h3> <p>3-2-6 スコープを絞る重要性</p> <p>宣言を先頭にまとめて書くことは、最初は習慣として行っていましたが<br /> 使う直前に宣言したほうがいいよね?と。確かにその通りです。<br /> そこで「コロン記号」もさらに活躍の場が増えます。</p> <pre><code>Dim x as Long: x = 10 Dim y as String: y = "abc" </code></pre> <p>なるほど!</p> <h3 id="3-3 識別子とネーミング"><a href="#3-3%E3%80%80%E8%AD%98%E5%88%A5%E5%AD%90%E3%81%A8%E3%83%8D%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0">3-3 識別子とネーミング</a></h3> <p>3-3-2 ネーミングの方針</p> <p>一部抜粋します。</p> <blockquote> <p>・変数にはキャメル記法、<br /> モジュールやプロシージャ、メソッド及びプロパティにはパスカル記法、<br /> 定数にはアッパースネーク記法</p> </blockquote> <p>キャメル記法の例: lastRow , userName<br /> パスカル記法の例: SetValue , EndOfMonth , IsClear<br /> アッパースネーク記法の例: TAX_RATE , TARGET_URL</p> <blockquote> <p>・変数やプロパティには名詞、<br /> Subプロシージャやfunctionプロシージャおよびメソッドは動詞のワードから始める</p> <p>・配列やコレクションの変数名は複数形にする</p> </blockquote> <p>私は今でもカタカナが並ぶと即座に理解はできません。<br /> モジュール、ああ、標準モジュールとかの、あれのことか。<br /> プロシージャ、、、SubプロシージャとかFunctionプロシージャってそういえばさっき書いたな。</p> <p>メソッド、、、メソッド?  巻末の索引を見る。<br /> 「Addメソッド」「Copyメソッド」ふむ。。<br /> プロパティ。これはすぐわかる。</p> <p>ああそういえば、プロシージャもキャメル記法で書いてるな、と気付きました。<br /> コーディング規約というかルール決めていないので、ちょっとこの辺は弱いところです。<br /> ルールを固めておきたいです。(すでに書いたものを直すのはなかなか大変だけど)</p> <h3 id="3-4 変数"><a href="#3-4%E3%80%80%E5%A4%89%E6%95%B0">3-4 変数</a></h3> <p>3-4-1 変数の宣言</p> <pre><code>Sub Mysub() Dim msg As String Dim x As Long, y As Long Stop End Sub </code></pre> <p>実は今までstopって何に使うんだろう?と思ってました。<br /> 実行するとStopのところで止まるので、そのときにローカルウィンドウを見る、という使い方ができる!<br /> やってみました。おー便利!</p> <p>3-4-3 変数の有効期間</p> <blockquote> <p>プロシージャレベル変数についてプロシージャ終了後にも値を保持しておきたいときには、<br /> Staticステートメントを使うという方法があります。</p> </blockquote> <p>Staticステートメントが使えるそうです。いつのタイミングで使うと良いのか、今はわかりませんが、知識として持っておくと、何かの時に使うという選択肢が増えますね。</p> <h3 id="3-5 代入"><a href="#3-5%E3%80%80%E4%BB%A3%E5%85%A5">3-5 代入</a></h3> <blockquote> <p>VBAの「やさしさ」が影響をして、勘違いを生じさせる可能性のある要因が含まれています。</p> </blockquote> <p>3-5-2 値の代入</p> <blockquote> <p>変数やプロパティに値を代入するには、Letステートメントを使用します。<br /> 以下のように、</p> </blockquote> <pre><code>Dim num As Long: Let num = 10 Dim message As String: Let message = "hoge" </code></pre> <p>今まで何気なくやっていた値の代入ですが、<br /> Letを省略していたということのようです。ほう!</p> <pre><code>Dim num As Long: num = 10 Dim message As String: message = "hoge" </code></pre> <p>3-5-4 オブジェクト参照の代入</p> <p>Letに対して、オブジェクト参照の時は、Setになっていて、<br /> これを省略するとLetだと認識されて実行時エラーになる、ということと理解しました。</p> <h3 id="3-6 定数/列挙型"><a href="#3-6%E3%80%80%E5%AE%9A%E6%95%B0%EF%BC%8F%E5%88%97%E6%8C%99%E5%9E%8B">3-6 定数/列挙型</a></h3> <p>3-6-1 定数の宣言</p> <p>マジックナンバーはできる限り使わないで書きたいし、<br /> 書いてほしいので、定数や、列挙型を活用したいところです。<br /> ここはいちばん最初から気を付けておきたいポイントです!</p> <p>3-6-2 列挙型の宣言</p> <p>列挙型が使えます。とても便利!</p> <blockquote> <p>列挙型はプロシージャレベルで宣言することはできません。<br /> したがってEnumステートメントは宣言セクションに記述します。</p> <p>パブリックモジュールレベルにするのであればPubicキーワード、<br /> プライベートモジュールレベルにするのであればPrivateキーワードを構文の先頭に付与します。<br /> いずれのキーワードも省略した場合は、パブリックモジュールレベルとなります。</p> </blockquote> <p>Public、Privateを省略したときに、どっちになるか、というのが、<br /> 常に同じではないような気がして、私はこの辺があいまいになっています。<br /> (SubプロシージャやFunctionプロシージャで省略したときもPublicになりますね。)<br /> できるだけ省略しないで書くに越したことはないと思います!</p> <h3 id="3-7 配列"><a href="#3-7%E3%80%80%E9%85%8D%E5%88%97">3-7 配列</a></h3> <p>3-7-2 固定配列の宣言</p> <blockquote> <p>宣言セクションにOption Baseステートメントを記述すると、そのモジュールでの配列の下限値を設定することができます。デフォルトでは0となります。</p> </blockquote> <p>Option Base { 0 | 1 }</p> <p>3-7-5 Variant型の変数と配列</p> <pre><code>Dim values As Variant values = Array("Bob", 25, #1/1/1993#) Debug.Print values(0), values(1), values(2) </code></pre> <blockquote> <p>Variant型の変数は配列として宣言をしなくても、配列を格納できます。<br /> その際に、配列のサイズの指定をする必要はありません。</p> <p>Array関数は配列を含むVariant型を返す関数です。10章で改めて紹介します。</p> </blockquote> <p>セル範囲をまとめて配列に取得するときに使っています。とても便利です。<br /> 11章で紹介されているようです。</p> <p>3-7-6 配列の初期化と解放</p> <p><strong>Erase</strong> <em>arraylist</em></p> <p>配列の消去を行うステートメント。使ったことないです。</p> <p>固定配列の場合は、要素がデータ型に応じて初期化される。<br /> 動的配列の場合は、確保しているメモリが解放される。</p> <p><a href="https://crieit.now.sh/upload_images/140e97c4bc10b4382c284603a487c1e55e055a4dc44fb.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/140e97c4bc10b4382c284603a487c1e55e055a4dc44fb.png?mw=700" alt="1.png" /></a></p> <p>Erase staticArray, dinamicArray の後</p> <p><a href="https://crieit.now.sh/upload_images/09cf65110445fe6560b3a142e8d833315e055a5917545.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/09cf65110445fe6560b3a142e8d833315e055a5917545.png?mw=700" alt="2.png" /></a></p> <h3 id="3-8 ユーザー定義型"><a href="#3-8%E3%80%80%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%AE%9A%E7%BE%A9%E5%9E%8B">3-8 ユーザー定義型</a></h3> <blockquote> <p>ユーザー定義型を宣言するには、以下のTypeステートメントを使用します。<br /> ユーザー定義型は、プロシージャレベルでは宣言することができませんので、Typeステートメントは宣言セクションに記述します。</p> </blockquote> <p>これも使っていないです。使えることを知りませんでした。</p> <blockquote> <p>ユーザー定義型の要素は配列とすることもできます</p> </blockquote> <pre><code>Private Type Person Name As String Age As Long Birthday As Date End Type Sub MySub() Dim p As Person p.Name = "Bob" p.Age = 25 p.Birthday = #1/1/1993# End Sub </code></pre> <blockquote> <p>ユーザー定義型で実現できることは、クラス定義することで実現可能です。</p> <p>各要素に対して処理を行いたいときや、コレクションに追加したいときなどは、ユーザー定義型では実現できませんので、クラスを使うことになります。</p> </blockquote> <p>まだVBAでクラスを使ったことがないのです。<br /> クラスをどんなふうに使うのかはもう少し後に載ってそうです。</p> <h3 id="3-9 コメント"><a href="#3-9%E3%80%80%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88">3-9 コメント</a></h3> <p><strong>Rem</strong> <em>comment</em></p> <p><strong>'</strong> <em>comment</em></p> <p>コメントは、アポストロフィ記号(')を使います。</p> <blockquote> <p><strong>実はこの記述方法はRemステートメントの省略形です。</strong></p> <p>Remステートメントは「VBAのすべての命令はステートメントである」ということを表す好例です。</p> </blockquote> <p>アポストロフィ記号は実は「Rem」の略なのだそうです。知りませんでした!</p> <p>他にも、知らずに省略したりしていることが多そうです。(Letもそうでした)</p> <p>ひとつひとつ知っていくことで、少しずつ知識が深まっているというか、<br /> 表面的には変わらなくても、知っておくことは割と大事なことのような気がしています。</p> <p>.</p> <p>これで3章は終わりです!</p> <p>ここに書きながらなので、こんなに丁寧に書籍を読み進めたことはないかも、というほど丁寧に読んでいます。<br /> どこまで書けるかな? すくなくとも「Part2 Excel VBAの言語仕様」のところは、こうして追っていけたらと思っています。</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/15641 2019-12-26T15:14:19+09:00 2019-12-27T10:47:41+09:00 https://crieit.net/posts/VBA-2-Excel-VBA VBAをパーフェクトにマスターするシリーズ♪ 2章「式と値」「パーフェクトExcel VBA」 <h2 id="■前回の記事"><a href="#%E2%96%A0%E5%89%8D%E5%9B%9E%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>これの続きを書きました。<br /> VBAをパーフェクトにマスターするシリーズ♪<br /> 今回は「2章」で新しく知ったことと、思ったことを簡単にまとめました。<br /> 詳細につきましては、書籍をご覧ください。</p> <h2 id="■前置き"><a href="#%E2%96%A0%E5%89%8D%E7%BD%AE%E3%81%8D">■前置き</a></h2> <p>分厚さがすごい書籍です。なかなか開くのに気合というか勇気がいりますネ!</p> <p>私は今社内で、VBAで、ほぼ一人開発をやって約半年になります。<br /> そして来年は、すこし他の人に伝授する機会が与えられそうなので、、</p> <p>人に教えるには、自分が理解していないといけません。<br /> 半年間の実務で「VBAやってみたらできた」という感じなのです。</p> <p>もっと体系的に理解したい、より良いコードを書きたい、と思っていたところで、<br /> ベストな書籍に出会えたと思っています。</p> <p>そんな状況なので、もう本がどんなに分厚くても、<br /> 開かざるを得ないですよね。</p> <p>というわけで、<br /> 前回は1章にしか触れていませんでしたので、<br /> 今回は2章以降に入りたいと思います。</p> <p>リアルタイム学習記録です。</p> <h2 id="■1章の後半では、"><a href="#%E2%96%A01%E7%AB%A0%E3%81%AE%E5%BE%8C%E5%8D%8A%E3%81%A7%E3%81%AF%E3%80%81">■1章の後半では、</a></h2> <blockquote> <p>1-4 本書を使ったVBA学習の進め方<br /> 「2章から7章にかけて、VBAの体系を構成する以下の要素について、小さな要素から順に積み上げるように解説をしていきます。<br /> <strong>これらの章は飛ばさずに順番に進めるようにしてください。</strong>」</p> </blockquote> <p>と書かれていたので、<br /> 順番に進めていきたいと思います。</p> <blockquote> <p>1-5 Visual Basic Editorについて</p> </blockquote> <p>Visual Basic Editorについて、<br /> 知らなかったことがいろいろ書かれてました。</p> <p>そのボタンは押したことがない、というものがいくつかありました。<br /> 基本の操作方法の知識は大事です。知る機会が得られてよかったです。</p> <p>F2キーを押して、<br /> オブジェクトブラウザを表示したこともありませんでした。<br /> これから使っていこうと思います!</p> <h2 id="■2章「式と値」"><a href="#%E2%96%A02%E7%AB%A0%E3%80%8C%E5%BC%8F%E3%81%A8%E5%80%A4%E3%80%8D">■2章「式と値」</a></h2> <h3 id="2-1 式とその構成要素"><a href="#2-1+%E5%BC%8F%E3%81%A8%E3%81%9D%E3%81%AE%E6%A7%8B%E6%88%90%E8%A6%81%E7%B4%A0">2-1 式とその構成要素</a></h3> <p>「式とは何か」の説明から始まります。<br /> 主に、言葉の定義の説明です。国語の勉強をしているようです。理解が難しいです。<br /> 私は本は雰囲気で読むので、あまり丁寧に文字を追うということをしないのですが、<br /> 丁寧に読もうと思って、ところどころ音読しながらゆっくり読みました。</p> <p>私はC言語を職業訓練で習い、自分でもJava等を学習しています。<br /> そのため、ある程度のプログラミング言語の前提知識はあります。</p> <p>なので、私にとっては「VBAではどうなのか?」というところが、<br /> 特に学習のポイントになると思っています。</p> <p>始めて読む人が、この言葉の定義の部分で、ん?わからない???となった場合、<br /> とりあえずさっと流して、先に進むといいと思います。<br /> わからなくても進みましょう。(私も←告白)</p> <h3 id="2-2 データ型"><a href="#2-2%E3%80%80%E3%83%87%E3%83%BC%E3%82%BF%E5%9E%8B">2-2 データ型</a></h3> <p>VBAで扱えるデータ型について、<br /> 大事なポイントは「未初期化状態の値」の把握です。<br /> もともとは何の値が設定されているかに意識を向けて、初期化したいものです。</p> <p>ここに、String型の「未初期化状態の値」は、「vbNullString」と書かれていたので、<br /> さっそく先ほどのF2キーを押して、オブジェクトブラウザで検索してみました。</p> <p>なるほど!と思いました。</p> <h3 id="ブール型"><a href="#%E3%83%96%E3%83%BC%E3%83%AB%E5%9E%8B">ブール型</a></h3> <p>VBAでは、「True」 は 「-1」、「False」 は 「0」と等しいと判定されるそうです!!</p> <p>「True」は「-1」だけだそうです。<br /> (他の言語だと0以外は全部True扱いになったりもしたような)</p> <h3 id="日付型"><a href="#%E6%97%A5%E4%BB%98%E5%9E%8B">日付型</a></h3> <p>日付型については、詳しく知りませんでした。<br /> びっくりしました。<br /> コードウィンドウに宣言を書くと、自動的に値が変わる!<br /> うわ!すごい!(やってみた)</p> <p>ところで、この↓<br /> <em>Dim d1 as Date: d1 = #2018-12-31#</em></p> <p>Dateのあとの「:」(コロン)も使ったことがありません。<br /> 知りませんでした。コロンで区切ると、1行で書けるのでした!</p> <h3 id="比較演算子"><a href="#%E6%AF%94%E8%BC%83%E6%BC%94%E7%AE%97%E5%AD%90">比較演算子</a></h3> <h3 id="Is演算子"><a href="#Is%E6%BC%94%E7%AE%97%E5%AD%90">Is演算子</a></h3> <pre><code>Dim rng As Range Set rng = Sheet1.Range("A1") Debug.Print rng Is Sheet1.Range("A1") </code></pre> <p>このDebug.Printは、Falseが出力されます。<br /> Rangeオブジェクトの場合、取得するごとに別のメモリアドレスに格納されるから<br /> Falseになるとのこと。知りませんでした!</p> <h3 id="Like演算子"><a href="#Like%E6%BC%94%E7%AE%97%E5%AD%90">Like演算子</a></h3> <p><em>string</em> <strong>Like</strong> <em>pattern</em></p> <p>今までほぼ文字列の比較のつもりで使ってました。認識が少し変わりました!<br /> 文字列と「特定のパターン」の比較をしていたのですね。</p> <h3 id="論理演算子"><a href="#%E8%AB%96%E7%90%86%E6%BC%94%E7%AE%97%E5%AD%90">論理演算子</a></h3> <p>ここでは、Notのみならず、Xorも、それ以外まで載っています。<br /> この部分は、初めて見て、もしわからなかったとしても、<br /> 例えばExcelでVBAをはじめてすぐに、Xorが必要になるかというと、<br /> おそらく多分そんなことはないので、さらっとで大丈夫だと思います!</p> <p>次回は3章に取り組みたいと思います!</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/15626 2019-12-20T10:36:57+09:00 2019-12-26T08:07:21+09:00 https://crieit.net/posts/VBA-Excel-VBA VBAにもっと詳しくなろう♪ 「パーフェクトExcel VBA」 <p><strong>私は半年前からExcel VBAで仕事をしています。</strong> VBAを書くのが主な業務です。<br /> 良くいえば社内SEのような立ち位置です。他の方は別業務なのでほぼひとりでやっています。<br /> 頼れるのはほぼ、書籍(主に図書館利用)とネット検索のみ。</p> <p>ネットで検索して、その場その場で目の前の課題は解決できますが、<br /> その場しのぎになりがちです。<br /> 書籍でも勉強したいと思い、図書館で借りてみて、よさそうだなと思った数冊を買っています。</p> <p>そんなタイミングで出会った本が「パーフェクトExcel VBA」でした。<br /> 発売直直前で、ちょうど著者の方がサイトで書評を募集されていて、手を挙げて送っていただきました。</p> <p>辞書的に使えるのかな?と思っていましたが、<br /> 「まえがき」を読んで…</p> <p><a target="_blank" rel="nofollow noopener" href="https://tonari-it.com/perfect-excel-vba-preface/">「パーフェクト Excel VBA」の「まえがき」の全文は著者サイトで紹介されています。</a><br /> <a target="_blank" rel="nofollow noopener" href="https://tonari-it.com/perfect-excel-vba-preface/">https://tonari-it.com/perfect-excel-vba-preface/</a></p> <blockquote> <p>学習を進めていくにしたがって、VBAには他のプログラミング言語では、それほど目立たない、いくつかの「弱点」があるように見えてきました。<br /> * 理解があやふやなのに動いてしまっているため、エラーや仕様変更が発生したときの対応に大変な労力がかかる</p> <ul> <li><p>同じ目的に対して、それを実現するための書き方がいくつも存在していて混乱する</p></li> <li><p>たくさんの「自己流」が存在していて、他のVBAユーザーとの協力体制を築きづらい</p></li> <li><p>クラスやオブジェクトモジュールなどの概念について学ぶ機会がないため、他の方法で実現してしまっている</p></li> </ul> </blockquote> <p>ウンウン頷いてしまいました。</p> <p>確かに「理解があやふやなのに動いてしまっている」部分も…(わりとあります)<br /> ネットで検索して、こんな風に書けば動くんだじゃあこれを使おう、みたいな感じで<br /> 流用することもあります…</p> <p>何もないところからコードを書くこともありますが、<br /> ノンプログラマーの上司の書いたコードを修正することもあります。<br /> そういう時は特に、部分的にしかコードも読まないので<br /> ココ何やってるかわからないけど、動いてるからいいかーとなりがちです。</p> <p>実務なので、スピード重視、なるべく早くやってね!<br /> できたら次はこれね!と次々に課題がやってくるので、<br /> ゆっくり見直している時間はありません。</p> <p>ちゃんと動かないと困るので、できるだけ入念に動作確認はしてますが、<br /> 「動作確認」と「コードの理解」は、似て異なりますよね…</p> <p>そして、まだ使ったことのない「クラスモジュール」も、<br /> 使えたら便利そうだけど、具体的にどういうときに使えばいいのか?わからずにいます。</p> <p>そんな状態なので、</p> <blockquote> <p>VBAはプログラマーではない多くの方も活用されているので、「初心者向けの簡単に身につけられる言語」と捉えられがちですが、決してそうではありません。まずは、その事実を確認しつつ、学習をする上での心構えを整えます。その役割は1章が担っています。</p> </blockquote> <p>この「1章」の前半で、もう既に、かなりの衝撃を受けました。<br /> 他のどんな技術書とも違う。とても大事なことが書いてあります。</p> <p><strong>他のプログラミングをするときと、VBAとで何が違うのか?<br /> VBAを業務で使う人がどんな状況にいて、何に困っているのか?<br /> じゃあどうしたらいいのか?・・・が書いてあります。</strong></p> <p>1章の1-3までの見出しを載せておきます。</p> <blockquote> <p><strong>1-1 VBA を学び続けるために必要なこと</strong><br /> 1-1-1 VBA はやさしい言語か?<br /> 1-1-2 歴史と言語の特徴<br /> 1-1-3 学習環境<br /> 1-1-4 VBAならではの課題への対策<br /> <br /> <strong>1-2 VBA の体系を理解し、知識の整理整頓をする</strong><br /> 1-2-1 正しい学習とは<br /> 1-2-2 体系の理解と関連付け<br /> <br /> <strong>1-3 VBAの作法を身につけ、コードに一貫性を持たせる</strong><br /> 1-3-1 選択肢が多いことによる弊害<br /> 1-3-2 VBAの作法と4つの指針<br /> 1-3-3 可読性<br /> 1-3-4 柔軟性<br /> 1-3-5 信頼性<br /> 1-3-6 再利用性</p> </blockquote> <p>この部分だけでも、読む価値はとてもありました!!</p> <p><strong>VBAを始めたばかりの人、VBAを業務で使っていて、なんとなくは出来ているけど…という方、<br /> ここに力強い味方が現れましたよー!</strong></p> <p>Excelを使う会社には、少なくとも1冊は常備してもらいたい本です!</p> <p>これから始める人にも、大切なことが書いてありますし、<br /> 始めてからちょっと経ったの私のような人には、より身に染みます。<br /> これまで書いたコード、書き直したい...</p> <p><strong>本書を手に取ったら、まずは1章を読んでみてください。</strong></p> <p>分厚い本の勉強中に、モチベーションを見失いそうになったら、<br /> もう一度、1章を読み直してみてください。私もそうしようと思います。</p> <p>この本を手に取るVBA使いは、<br /> 今よりもっと、VBAを楽しく、自信を持って使えるようになると思います!!</p> <p>みなさんが、VBA 楽しめますように。私も楽しみたいと思います♪</p> <p>追記:<br /> 同じ内容なのに書き方が8パターンもある、という紹介です。<br /> そりゃー、わかりにくくもなりますよね。<br /> <a href="https://crieit.now.sh/upload_images/197d7657e4860acb928ec92407baff705e03eb1884abc.JPG" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/197d7657e4860acb928ec92407baff705e03eb1884abc.JPG?mw=700" alt="IMG-1964.JPG" /></a></p> <p>▼著者サイト<br /> <a target="_blank" rel="nofollow noopener" href="https://tonari-it.com/perfect-excel-vba/">書籍「パーフェクトExcel VBA」発売についてのお知らせ </a></p> <p>▼Amazonリンク<br /> <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