tag:crieit.net,2005:https://crieit.net/tags/ExcelVBA/feed 「ExcelVBA」の記事 - Crieit Crieitでタグ「ExcelVBA」に投稿された最近の記事 2021-12-04T01:29:51+09:00 https://crieit.net/tags/ExcelVBA/feed tag:crieit.net,2005:PublicArticle/17812 2021-12-03T11:21:47+09:00 2021-12-04T01:29:51+09:00 https://crieit.net/posts/0c44d8507f3ff0c2cd41e2f8c6187d46 会社がなくなって、転職を余儀なくされた件。 <p><a href="https://crieit.net/posts/SE">社内SEに向いているのはこんな人(かもしれない)2020年振り返り記事</a><br /> ↑2020年のアドベントカレンダーに書いた件。↑お文具満載♪↑</p> <h1 id="2021年の秋に会社がなくなりました。"><a href="#2021%E5%B9%B4%E3%81%AE%E7%A7%8B%E3%81%AB%E4%BC%9A%E7%A4%BE%E3%81%8C%E3%81%AA%E3%81%8F%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82">2021年の秋に会社がなくなりました。</a></h1> <p><a href="https://crieit.now.sh/upload_images/58f50350e2e1f72a48cd9863968e797161a9781d192d5.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/58f50350e2e1f72a48cd9863968e797161a9781d192d5.png?mw=700" alt="image" /></a></p> <p>転職活動して、<br /> 今は、IT企業で<br /> 派遣で働いてます。</p> <p>でもなんか<br /> 思ってたんと違う。。。(´;ω;`)</p> <p>時給が安い上に、<br /> 全然役に立てない。(´;ω;`)</p> <p>周りができる人ばかりで<br /> 自分は・・・という無力感。(´;ω;`)</p> <p>コードを書く仕事も<br /> させてはもらえない。(VBAじゃないからね...)</p> <p>無力・・・orz</p> <hr /> <p>これなら在宅勤務の</p> <h1 id="VBAの仕事の方が、時給高いし良いよ!!"><a href="#VBA%E3%81%AE%E4%BB%95%E4%BA%8B%E3%81%AE%E6%96%B9%E3%81%8C%E3%80%81%E6%99%82%E7%B5%A6%E9%AB%98%E3%81%84%E3%81%97%E8%89%AF%E3%81%84%E3%82%88%EF%BC%81%EF%BC%81">VBAの仕事の方が、時給高いし良いよ!!</a></h1> <p>と思ったので、<br /> <strong>Access</strong>と<strong>SQL</strong>をバリバリにマスターして(?)</p> <h3 id="転職する予定です(・◇・)/~~~"><a href="#%E8%BB%A2%E8%81%B7%E3%81%99%E3%82%8B%E4%BA%88%E5%AE%9A%E3%81%A7%E3%81%99%EF%BC%88%E3%83%BB%E2%97%87%E3%83%BB%EF%BC%89%2F%7E%7E%7E">転職する予定です(・◇・)/~~~</a></h3> <p>難しいことは、できる気がしないので<br /> AccessとSQLならがんばればなんとかなるだろう、という安易な考えです。</p> <p>難しく使おうと思ったらいくらでもできるとは思うのですけども、<br /> 基本的なことはなんとかなるだろうと。(バリバリはどこへ?)</p> <h1 id="VBA資格取ったよ!"><a href="#VBA%E8%B3%87%E6%A0%BC%E5%8F%96%E3%81%A3%E3%81%9F%E3%82%88%EF%BC%81">VBA資格取ったよ!</a></h1> <h4 id="とりあえず、"><a href="#%E3%81%A8%E3%82%8A%E3%81%82%E3%81%88%E3%81%9A%E3%80%81">とりあえず、</a></h4> <h4 id="Excel VBA使えるよ!という証明書的なやつ"><a href="#Excel+VBA%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%88%EF%BC%81%E3%81%A8%E3%81%84%E3%81%86%E8%A8%BC%E6%98%8E%E6%9B%B8%E7%9A%84%E3%81%AA%E3%82%84%E3%81%A4">Excel VBA使えるよ!という証明書的なやつ</a></h4> <p><a href="https://crieit.now.sh/upload_images/ea529d135d82b695ca7894f8c29f081461a9798cd56e7.JPG" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ea529d135d82b695ca7894f8c29f081461a9798cd56e7.JPG?mw=700" alt="image" /></a></p> <h4 id="取りました!!"><a href="#%E5%8F%96%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F%EF%BC%81%EF%BC%81">取りました!!</a></h4> <p>あまり関係ないというか知らないこといっぱいあって<br /> 前日まで体調崩してて、焦ったけど・・・。</p> <p>何年も前から、取っといた方がいいよなーと思ってた資格だったのですが<br /> やっと受験して、1回目で受かりました。</p> <p>受験料もそんなに安くないから、受かって良かったです。</p> <h2 id="VBA試験対策は"><a href="#VBA%E8%A9%A6%E9%A8%93%E5%AF%BE%E7%AD%96%E3%81%AF">VBA試験対策は</a></h2> <h4 id="↓これ買って、WEBで練習問題たくさんやって。"><a href="#%E2%86%93%E3%81%93%E3%82%8C%E8%B2%B7%E3%81%A3%E3%81%A6%E3%80%81WEB%E3%81%A7%E7%B7%B4%E7%BF%92%E5%95%8F%E9%A1%8C%E3%81%9F%E3%81%8F%E3%81%95%E3%82%93%E3%82%84%E3%81%A3%E3%81%A6%E3%80%82">↓これ買って、WEBで練習問題たくさんやって。</a></h4> <p><a target="_blank" rel="nofollow noopener" href="https://www.exam-vba.com/">VBAエキスパート試験対策</a></p> <p>あんまり繰り返してやると答えを覚えてしまうので<br /> 意味なく丸暗記してしまわないように気をつけつつ。。。</p> <p>しかしこれよくできてて、解答履歴とかもあるし、パーセントも出るし、<br /> 過去○回間違えた問題だけを出すとかも選べるし、回答の選択肢の番号もランダムにできるし<br /> こんなの作れたら、、、いいよなーと憧れます。</p> <p>めっちゃ手間かかりそうだけど、コツコツ稼げそう。。。</p> <h4 id="あと、"><a href="#%E3%81%82%E3%81%A8%E3%80%81">あと、</a></h4> <h4 id="↓VBAサイトで有名な田中さんの本も買って試験範囲を把握しておきました。"><a href="#%E2%86%93VBA%E3%82%B5%E3%82%A4%E3%83%88%E3%81%A7%E6%9C%89%E5%90%8D%E3%81%AA%E7%94%B0%E4%B8%AD%E3%81%95%E3%82%93%E3%81%AE%E6%9C%AC%E3%82%82%E8%B2%B7%E3%81%A3%E3%81%A6%E8%A9%A6%E9%A8%93%E7%AF%84%E5%9B%B2%E3%82%92%E6%8A%8A%E6%8F%A1%E3%81%97%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82">↓VBAサイトで有名な田中さんの本も買って試験範囲を把握しておきました。</a></h4> <p><a target="_blank" rel="nofollow noopener" href="https://www.amazon.co.jp/dp/4908327122/ref=cm_sw_r_tw_dp_RHJACXM534PD5BQTJDTR?_encoding=UTF8&psc=1">VBAエキスパート公式テキスト Excel VBAスタンダード 田中 亨 </a></p> <p>テーブル操作とか仕事で使わなかったし、関数もそんなに使ってないので、<br /> どんなのが出るのかわかって良かったです。<br /> 知らないところはルーズリーフに手書きでまとめながら覚えようとしました。</p> <p>試験を受けたことでやっと「VLookUP」と「Index」と「Match」の使い方を覚えました。<br /> まとめて覚えないとどれがどれか分からなくなるのです。</p> <p>最終的には、<br /> 練習問題をやって、分からなかったところを覚える、というのが<br /> 私には向いていました。(テキストだけ見てても覚えられません。)</p> <h1 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h1> <p>今の環境をバネに<br /> こんな会社やめてやるー!!というモチベーションで</p> <h4 id="勉強がんばります!!"><a href="#%E5%8B%89%E5%BC%B7%E3%81%8C%E3%82%93%E3%81%B0%E3%82%8A%E3%81%BE%E3%81%99%EF%BC%81%EF%BC%81">勉強がんばります!!</a></h4> <p>ガンバル୧(⑉•̀ㅁ•́⑉)૭✧</p> Hata tag:crieit.net,2005:PublicArticle/16766 2021-03-24T17:10:08+09:00 2021-03-24T17:11:42+09:00 https://crieit.net/posts/Excel-VBA-Web 【初心者向け】ExcelとVBAでWebスクレイピング実戦! <p><a href="https://crieit.now.sh/upload_images/e3cadfdba4688563a1e8d30580eacf54605af1c329c00.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e3cadfdba4688563a1e8d30580eacf54605af1c329c00.png?mw=700" alt="image" /></a><br /> 元記事:<a target="_blank" rel="nofollow noopener" href="https://www.octoparse.jp/blog/intro-to-web-scraping-with-excel-vba/">https://www.octoparse.jp/blog/intro-to-web-scraping-with-excel-vba/</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://www.octoparse.jp/blog/web-scraping/">スクレイピング</a>とは、WebページのHTMLコードから、<strong>必要な情報やデータを抽出する</strong>ことです。言い換えれば、自動的にWebページ上のデータを収集する技術です。</p> <p>現在、<a target="_blank" rel="nofollow noopener" href="https://www.octoparse.jp/blog/web-scraping/">スクレイピング</a>の一般的なプログラミング言語は、<a target="_blank" rel="nofollow noopener" href="https://www.octoparse.jp/blog/web-scraping-using-python/">Python</a>、Ruby、JAVA、<a target="_blank" rel="nofollow noopener" href="https://www.octoparse.jp/blog/creating-a-simple-web-crawler-in-php/">PHP</a>などができますが、開発環境構築と環境設定は<strong>初心者に対しては非常に難しい</strong>です。</p> <p>したがって、この記事で紹介するVBAは以下のメリットがあります。</p> <p>・開発環境構築<strong>不要</strong><br /> ・取得したデータをExcelシートに<strong>直接保存</strong>できる<br /> ・直接にExcelシートで<strong>セルを設定</strong>できる</p> <p>それでは、ExcelとVBAを使って、Webサイトから情報やデータをExcelシートに取り込むというExcelマクロを実際に作成してみましょう。</p> <h1 id="一、Excelでスクレイピングライブラリを導入"><a href="#%E4%B8%80%E3%80%81Excel%E3%81%A7%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E5%B0%8E%E5%85%A5">一、Excelでスクレイピングライブラリを導入</a></h1> <p>ExcelでのWebスクレイピングを配置する前に、Excelのマクロに対してライブラリを導入しなければなりません。<br /> 手順は以下になります。</p> <p><strong>1.Excelを開いて、「空白のブック」を選択します。</strong><br /> <a href="https://crieit.now.sh/upload_images/74e597f5e3bc77b406df2d44e78c276b605af1ced7012.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/74e597f5e3bc77b406df2d44e78c276b605af1ced7012.png?mw=700" alt="image" /></a></p> <p><strong>2.リボン欄の「開発」をクリックします。</strong><br /> <a href="https://crieit.now.sh/upload_images/d7c1103e553fa8b1942527526ffa7e17605af1e04d38d.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d7c1103e553fa8b1942527526ffa7e17605af1e04d38d.png?mw=700" alt="image" /></a></p> <p><strong>3.左側の「Visual Basic」ボタンを選択します。</strong><br /> <a href="https://crieit.now.sh/upload_images/bae9fc57cb3d8cda2cf3f6aae73e0db5605af1e61a751.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/bae9fc57cb3d8cda2cf3f6aae73e0db5605af1e61a751.png?mw=700" alt="image" /></a></p> <p><strong>4.「挿入」をクリックして、「標準モジュール」を選択します。</strong><br /> <a href="https://crieit.now.sh/upload_images/f7f85b99e6fe69d14c12397937b33bc2605af1ec5fcfa.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/f7f85b99e6fe69d14c12397937b33bc2605af1ec5fcfa.png?mw=700" alt="image" /></a></p> <p><strong>5.下記のコードを入力してください。</strong></p> <pre><code>Sub test() End sub </code></pre> <p>結果は以下になっております。<br /> <a href="https://crieit.now.sh/upload_images/c8526129fbc5d4df81a7eb091002c7da605af1f41ca76.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/c8526129fbc5d4df81a7eb091002c7da605af1f41ca76.png?mw=700" alt="image" /></a></p> <p><strong>6.「ツール」をクリックして、「参照設定」をクリックします。</strong><br /> 「Microsoft HTML Object Library」と「Microsoft Internet Controls」のチェックを入れます。<br /> <a href="https://crieit.now.sh/upload_images/01529df864d0e6cc0221da3a6a050d9e605af1fadafd9.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/01529df864d0e6cc0221da3a6a050d9e605af1fadafd9.png?mw=700" alt="image" /></a><br /> <a href="https://crieit.now.sh/upload_images/be51a8b37f9cf5499b975479ba5937f0605af201c8f9e.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/be51a8b37f9cf5499b975479ba5937f0605af201c8f9e.png?mw=700" alt="image" /></a></p> <p>モジュールとは、プログラムにおいて特定の機能を持ったひとまとまりの構成要素です。選択されたのモジュールは、ブラウザ連動とHTMLコードを読み込むという機能が持っています。</p> <p>それで、Webクローラーの開発が必要なものは設定完了です。</p> <h1 id="二、Webサイトにアクセスする"><a href="#%E4%BA%8C%E3%80%81Web%E3%82%B5%E3%82%A4%E3%83%88%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B">二、Webサイトにアクセスする</a></h1> <p>早速ですが、ExcelのVBAを使って、IEブラウザ経由でWebサイトにアクセスします。<br /> これには、ナビゲート属性を使用します。この属性では、URLを二重引用符で囲んで渡す必要があります。詳しくは下記のコードに参照してください。</p> <pre><code>Sub test() Dim ie As New InternetExplorer Dim doc As New HTMLDocument Dim ecoll As Object ie.Visible = True ie.navigate"http://test-sites.octoparse.com/?page_id=192" Do DoEvents Loop Until ie.readyState = READYSTATE_COMPLETE End sub </code></pre> <p>F5を押して、マクロを実行します。そこで次のようなWebページが表示されます。<br /> <a href="https://crieit.now.sh/upload_images/8f4f8d449ff9d8e3f22749894a1191f2605af20b31d7a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/8f4f8d449ff9d8e3f22749894a1191f2605af20b31d7a.png?mw=700" alt="image" /></a></p> <h2 id="三、VBAでスクレイピングしましょう"><a href="#%E4%B8%89%E3%80%81VBA%E3%81%A7%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0%E3%81%97%E3%81%BE%E3%81%97%E3%82%87%E3%81%86">三、VBAでスクレイピングしましょう</a></h2> <p>今回はボタンを押すたびに、Webサイト上データが自動的にエクセルに取り込まれるように開発しましょう。<br /> まず、Webサイトから、要素(HTMLドキュメント)を検証し、データがどのように構成されているかを分析する必要があります。HTML基礎知識は<a target="_blank" rel="nofollow noopener" href="https://developer.mozilla.org/ja/docs/Learn/Getting_started_with_the_web/HTML_basics">こちらのリンク</a>で参照ください。今回はテーブルのデータを抽出するように試してみましょう。</p> <p><strong>1. Ctrl + Shift + I を押して、テーブルの要素を指定すると、HTMLのソースコードに表示されます。</strong><br /> したがって、テーブルの要素は「table」と分かっています。<br /> <a href="https://crieit.now.sh/upload_images/9eccd5f099411315c84c1898bcba8622605af215e3247.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/9eccd5f099411315c84c1898bcba8622605af215e3247.png?mw=700" alt="image" /></a></p> <p><strong>2. VBAで要素「table」を抽出します。ソースコードでは以下のようになります。</strong></p> <pre><code>Sub test() Dim ie As New InternetExplorer Dim doc As New HTMLDocument Dim ecoll As Object ie.Visible = True ie.navigate "http://test-sites.octoparse.com/?page_id=192" Do DoEvents Loop Until ie.readyState = READYSTATE_COMPLETE Set doc = ie.document Set ecoll = doc.getElementsByTagName("table") End Sub </code></pre> <p>Excelは、Excelシートの範囲属性を使って、またはExcelシートのセル属性を使って初期化することができます。VBAスクリプトの複雑さを軽減するために、収集データはワークブックに存在するシート1のExcelセル属性に初期化される。</p> <p><strong>3.実行ボタンを指定します。</strong><br /> マクロスクリプトの準備ができたら、サブルーチンをExcelボタンに渡して割り当て、VBAのモジュールを終了する。ボタンに適当な名前をつけておきます。この例では、ボタンは「データ抽出」として初期化されます。</p> <p>手順は以下になります。<br /> <a href="https://crieit.now.sh/upload_images/1f619d8c8e01785042d52fb1d7557b23605af393b1f16.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/1f619d8c8e01785042d52fb1d7557b23605af393b1f16.png?mw=700" alt="image" /></a><br /> <a href="https://crieit.now.sh/upload_images/b235535133d28cbc2d82958eaef19f9d605af39a3abc3.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b235535133d28cbc2d82958eaef19f9d605af39a3abc3.png?mw=700" alt="image" /></a></p> <p><strong>4.ボタンを押して、以下のような情報が出力します。</strong><br /> <a href="https://crieit.now.sh/upload_images/d1e123dd88e8d9267e07485e99c00a0f605af3a3b008b.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d1e123dd88e8d9267e07485e99c00a0f605af3a3b008b.png?mw=700" alt="image" /></a></p> <h1 id="四、Octoparseでスクレイピングする方法"><a href="#%E5%9B%9B%E3%80%81Octoparse%E3%81%A7%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95">四、Octoparseでスクレイピングする方法</a></h1> <p>プログラミングが苦手、或いは英語のコードばかりなので苦手意識を持っている方は、スクレイピングツールの<a target="_blank" rel="nofollow noopener" href="https://www.octoparse.jp/">Octoparse</a>はおすすめします。</p> <p>Octoparseは「<a target="_blank" rel="nofollow noopener" href="https://helpcenter.octoparse.jp/hc/ja/articles/360013561999-Octoparse%E3%82%92%E3%82%82%E3%81%A3%E3%81%A8%E7%9F%A5%E3%82%8B-">自動識別</a>」機能があるので、ページのURLを入力するだけで、Webページ上各項目のデータ(テキストとリンクを含む)、「次のページ」ボタン、「もっと見る」ボタン、およびページのスクロールダウンを自動的に検出し、タスク(Webクローラー)を自動的に生成することができます。</p> <p>早速ですが、Octoparseで自動化の魅力を体験してみましょう。</p> <p><strong>1.Octoparseを起動して、スクレイピングしたいWebページのURLを入力します。</strong><br /> 「抽出開始」 ボタンをクリックして進みます。<br /> <a href="https://crieit.now.sh/upload_images/761e0a72882545802c97a7319feeeef1605af3ac39190.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/761e0a72882545802c97a7319feeeef1605af3ac39190.png?mw=700" alt="image" /></a></p> <p><strong>2.Octoparseでページが読み込みされたら、自動的にページ上の内容を識別します。</strong><br /> 自動識別とは、自動的にページ上の必要なデータを検出して識別するという役立つ機能です。ポイント&クリックをする必要はなく、Octoparseは自動的に処理します。<br /> <a href="https://crieit.now.sh/upload_images/2359f12975aa9a679363209c1c928c6b605af3b32ce77.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/2359f12975aa9a679363209c1c928c6b605af3b32ce77.png?mw=700" alt="image" /></a></p> <p><strong>3.識別が完了すると、データプレビューで識別したデータを表示され、確認してから「ワークフローの生成」ボタンを押します。</strong><br /> <a href="https://crieit.now.sh/upload_images/95661bba8fe25a46fc835456536461a8605af3bb20a09.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/95661bba8fe25a46fc835456536461a8605af3bb20a09.png?mw=700" alt="image" /></a></p> <p><strong>4.これで簡単にWebクローラーが作成しました!</strong><br /> 上の「実行」ボタンをクリックして、すぐデータを抽出できます。簡単ではないでしょうか。<br /> <a href="https://crieit.now.sh/upload_images/b0b0d3e60908ec44ecfc6aa732366d03605af3c190b44.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b0b0d3e60908ec44ecfc6aa732366d03605af3c190b44.png?mw=700" alt="image" /></a></p> <h1 id="五、まとめ"><a href="#%E4%BA%94%E3%80%81%E3%81%BE%E3%81%A8%E3%82%81">五、まとめ</a></h1> <p>VBAでスクレイピングは簡単にはできますが、<a target="_blank" rel="nofollow noopener" href="https://www.octoparse.jp/blog/5-anti-scraping-techniques-you-may-encounter/">複雑な構造</a>を持つWebサイト(JavaScript、AJAX技術を使っている動的サイトなど)では、VBAの機能はちょっと足りないかもしれません。<br /> それだけでなく、スクレイピングしようと思ったら、プログラミング言語とIT知識を勉強する必要があります。完璧に学ぶ時間がなく、効率的にスクレイピングがしたい、プログラミングが苦手、或いは英語のコードばかりなので苦手意識を持っている方は<a target="_blank" rel="nofollow noopener" href="https://www.octoparse.jp/blog/the-10-best-web-scraping-tools/">スクレイピングツール</a>はおすすめです。</p> <p><a href="https://crieit.now.sh/upload_images/9211be13dbf84c6b98b0da0ecbffb784605af3d24b4f0.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/9211be13dbf84c6b98b0da0ecbffb784605af3d24b4f0.png?mw=700" alt="image" /></a><br /> <a target="_blank" rel="nofollow noopener" href="https://www.octoparse.jp/subscribe/trial?plan=std&utm_source=crieit&utm_medium=pic&utm_campaign=8872">今から無料トライアル!</a></p> <h2 id="関連記事"><a href="#%E9%96%A2%E9%80%A3%E8%A8%98%E4%BA%8B">関連記事</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://www.octoparse.jp/blog/creating-a-simple-web-crawler-in-php/">PHPで簡単なWebクローラーを作ってみた</a><br /> <a target="_blank" rel="nofollow noopener" href="https://www.octoparse.jp/blog/web-scraping-using-python/">PythonによるWebスクレイピングを解説</a><br /> <a target="_blank" rel="nofollow noopener" href="https://www.octoparse.jp/blog/web-scraping-using-python-vs-web-scraping-tool/">Python vs Octoparse!初心者向きのスクレイピング方法はどっち?</a><br /> <a target="_blank" rel="nofollow noopener" href="https://www.octoparse.jp/blog/a-complete-guide-to-web-scraping-job-postings/">【完全初心者向け】求人情報を一括で自動的に取得する方法公開!</a></p> Octoparse Japan 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/15680 2020-01-14T08:33:35+09:00 2020-01-14T16:34:31+09:00 https://crieit.net/posts/ExcelVBA 「ExcelVBAを実務で使い倒す技術」ノウハウ!紹介 <p><a target="_blank" rel="nofollow noopener" href="https://www.amazon.co.jp/dp/4798049999">ExcelVBAを実務で使い倒す技術 高橋宣成著</a>!</p> <p><a href="https://crieit.now.sh/upload_images/f76b2612063083f328d8566e47af8e555e1cec12a23d3.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/f76b2612063083f328d8566e47af8e555e1cec12a23d3.png?mw=700" alt="book.png" /></a></p> <p>Amazonの「なか見!検索」で書籍中身の一部が見られます。</p> <h3 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h3> <p>先日「ExcelVBAを実務で使い倒す技術」という本を買いました。<br /> 会社でVBAを使っている方向けのタイトルですが、そうでなくても役立ちます。<br /> どういうところに気を付ければ、より使いやすくなるか、ポイントが具体的に書かれています。</p> <p>今回は、特にとても大事だと思った点を、いくつかピックアップして紹介したいと思います。<br /> 合わせて著者サイトにリンクを貼りました。サイトでも詳しく掲載されています。</p> <h3 id="1-2 今すぐに見直すべきVBEの設定とは"><a href="#1-2%E3%80%80%E4%BB%8A%E3%81%99%E3%81%90%E3%81%AB%E8%A6%8B%E7%9B%B4%E3%81%99%E3%81%B9%E3%81%8DVBE%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%A8%E3%81%AF">1-2 今すぐに見直すべきVBEの設定とは</a></h3> <p>・VBAのメニューの「ツール」→「オプション」で開く「オプション」ウィンドウの<br /> 「エディターの設定」タブで、分類コードごとの色を、見やすくなるように設定しましょう。</p> <p>▼参考▼<br /> <a target="_blank" rel="nofollow noopener" href="https://tonari-it.com/excel-vba-vbe-syntax-highlight/">【エクセルVBA】VBEの背景色や文字色を変更して画面を見やすくしよう</a></p> <h3 id="1-3 コメントブロックのアクセスキーを設定する"><a href="#1-3%E3%80%80%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%82%AD%E3%83%BC%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B">1-3 コメントブロックのアクセスキーを設定する</a></h3> <p>コメントにするときにシングルクォーテーションを付けたり外したりしますが、<br /> キーボードで簡単にオンオフできるように設定しておきましょう。</p> <p>「コメントブロック」「非コメントブロック」のアイコンに、アクセスキーを設定します。</p> <p>▼参考▼<br /> <a target="_blank" rel="nofollow noopener" href="https://tonari-it.com/excel-vba-vbe-comment-shortcut-key/">【エクセルVBA】VBEにコメントブロックのショートカットキーを設定する方法 </a></p> <h3 id="1-4 自動メンバー表示で「打たずに打つ」"><a href="#1-4%E3%80%80%E8%87%AA%E5%8B%95%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E8%A1%A8%E7%A4%BA%E3%81%A7%E3%80%8C%E6%89%93%E3%81%9F%E3%81%9A%E3%81%AB%E6%89%93%E3%81%A4%E3%80%8D">1-4 自動メンバー表示で「打たずに打つ」</a></h3> <p>(1) オブジェクトに続けて、「.(ピリオド)」でメンバー候補を表示<br /> (2) ショートカットキー「Ctrl」+「Space」で、メンバー候補をいつでも表示</p> <p><strong>・自動メンバー表示が使えるようにコードを書く</strong></p> <p>Worksheet(Index)<br /> Sheets(Index)<br /> Cells([RowIndex],[ColumnIndex])<br /> 上記の場合は、メンバー候補が表示されないので、<br /> 一行で書くことよりも、メンバー表示が使えるようにコードを書くことをこころがけましょう。</p> <p>▼参考▼<br /> <a target="_blank" rel="nofollow noopener" href="https://tonari-it.com/excel-vba-vbe-auto-member-list/">【エクセルVBA】初心者にとっても便利なVBEの自動メンバー表示とその使い方 </a></p> <h3 id="1-5 マスターしておくべきVBEのショートカットキー"><a href="#1-5%E3%80%80%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E3%81%97%E3%81%A6%E3%81%8A%E3%81%8F%E3%81%B9%E3%81%8DVBE%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC">1-5 マスターしておくべきVBEのショートカットキー</a></h3> <p>以下のようなショートカットキーの設定があります。</p> <p>前のプロシージャに移動<br /> 次のプロシージャに移動<br /> モジュールの先頭に移動</p> <p>前の単語に移動<br /> 次の単語に移動<br /> 単語のカーソル以前を選択<br /> 単語のカーソル以後を選択</p> <p>・変数またはプロシージャの定義の表示</p> <p>定義の表示 Shift + F2<br /> 元の位置へ移動 Ctrl + Shift + F2</p> <p>▼参考▼<br /> <a target="_blank" rel="nofollow noopener" href="https://tonari-it.com/excel-vba-vbe-shortcut-key-list/">【エクセルVBA】最初っから知っておきたいVBEのショートカットキーまとめ </a></p> <h3 id="6-5 変数はどこでどのように宣言すべきか"><a href="#6-5%E3%80%80%E5%A4%89%E6%95%B0%E3%81%AF%E3%81%A9%E3%81%93%E3%81%A7%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E5%AE%A3%E8%A8%80%E3%81%99%E3%81%B9%E3%81%8D%E3%81%8B">6-5 変数はどこでどのように宣言すべきか</a></h3> <blockquote> <p> プロシージャで使用する変数の宣言を、プロシージャ冒頭で全て行う人がいますが、必ずしもそれが正しい訳ではありません。<br />  最初にすべてを宣言すると、そのプロシージャの読み始めから全ての変数を意識する必要がでてきます。<br />  しかし、使用する直前で変数宣言すれば、必要な時に意識すれば良いことになりますし、素早く型宣言も確認ができ、稼働区政に良い影響を及ぼすことが多いと言えます。</p> </blockquote> <p>宣言は使用する直前に書いてある方が、コードがとても読みやすいです。</p> <h3 id="7-3 定数・列挙型でマジックナンバーを避ける"><a href="#7-3%E3%80%80%E5%AE%9A%E6%95%B0%E3%83%BB%E5%88%97%E6%8C%99%E5%9E%8B%E3%81%A7%E3%83%9E%E3%82%B8%E3%83%83%E3%82%AF%E3%83%8A%E3%83%B3%E3%83%90%E3%83%BC%E3%82%92%E9%81%BF%E3%81%91%E3%82%8B">7-3 定数・列挙型でマジックナンバーを避ける</a></h3> <p>コード内にベタ打ちで書かれた数値を「マジックナンバー」といいます。<br /> コード内に直接数値が書かれていると、都度「これは何を表している数字?」と考えないといけないので、可読性が低下します。<br /> なのでなるべく避けましょうという話です。</p> <h2 id="第8章 VBAは個人作業のみならず「チーム」にも革命をもたらす"><a href="#%E7%AC%AC8%E7%AB%A0%E3%80%80VBA%E3%81%AF%E5%80%8B%E4%BA%BA%E4%BD%9C%E6%A5%AD%E3%81%AE%E3%81%BF%E3%81%AA%E3%82%89%E3%81%9A%E3%80%8C%E3%83%81%E3%83%BC%E3%83%A0%E3%80%8D%E3%81%AB%E3%82%82%E9%9D%A9%E5%91%BD%E3%82%92%E3%82%82%E3%81%9F%E3%82%89%E3%81%99">第8章 VBAは個人作業のみならず「チーム」にも革命をもたらす</a></h2> <h3 id="8-1 VBAはチームの資産にするべき"><a href="#8-1%E3%80%80VBA%E3%81%AF%E3%83%81%E3%83%BC%E3%83%A0%E3%81%AE%E8%B3%87%E7%94%A3%E3%81%AB%E3%81%99%E3%82%8B%E3%81%B9%E3%81%8D">8-1 VBAはチームの資産にするべき</a></h3> <p><strong>・あなたのチームを最大に苦しめ得るリスク</strong></p> <blockquote> <p>あなたがVBAを使いこなし周りに貢献をし続けるほど、あなたのチームを最大限に苦しめる、「とあるリスク」が高まっていくことになります。</p> </blockquote> <p>さて、、、それは何かわかりますか?</p> <p>ふふふ。</p> <p><strong>・VBAをチームで維持管理するための2つの方針</strong></p> <blockquote> <p>まず、最も望ましいのは<br /> <strong>(1)VBAを複数人で担当する</strong></p> <p>複数人体制がどうしても難しい場合は、次点の策として<br /> <strong>(2)外部のサポートを前提に、ドキュメント等を整備・共有しておく</strong></p> <p>・<strong>リーダブルコードでコードを記述しておくこと</strong><br /> ・<strong>ドキュメントが整備され、その存在と内容がチームメンバーに共有されていること</strong></p> <p>VBAをチームの資産とすることを怠ることで、せっかく作ったVBAがブラックボックスと化し、さらにはお蔵入りになってしまうということが、ビジネスの現場では実際に頻発してしまっています。<br /> あなた自身が脱初級を達成したとしても、生み出したVBAがお荷物になってしまうのであれば、そんな悲しいことはありません。</p> </blockquote> <p>自分がコードを書いて機能を追加すればするほど、負の資産になるなんて、そんなのイヤです(涙<br /> ドキュメントが足りないので、がんばって作ります、すすすすす、、、</p> <h3 id="8-3 Gitでソースコードとそのバージョン楽に管理する"><a href="#8-3%E3%80%80Git%E3%81%A7%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A8%E3%81%9D%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E6%A5%BD%E3%81%AB%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B">8-3 Gitでソースコードとそのバージョン楽に管理する</a></h3> <p>あ。。。<br /> ううう。。。(壊れてきた私)</p> <p>バージョン管理をGitでしましょう、う、ぅぅぅ</p> <p>ファイルの置き場所は社内のサーバーでもいいですよね、やってみよう。</p> <h3 id="8-4 リファクタリングでチームのコードに一貫性を持たせる"><a href="#8-4%E3%80%80%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%A7%E3%83%81%E3%83%BC%E3%83%A0%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AB%E4%B8%80%E8%B2%AB%E6%80%A7%E3%82%92%E6%8C%81%E3%81%9F%E3%81%9B%E3%82%8B">8-4 リファクタリングでチームのコードに一貫性を持たせる</a></h3> <p><strong>・チームでコーディングルールを統一する</strong></p> <blockquote> <p>チーム内の複数人でVBAの開発をしている場合、コードの書き方を揃えるように努力しなければなりません。</p> <p>・コーディングルールを作成、更新する<br /> ・コーディングルールに沿ってリファクタリングをする</p> </blockquote> <p>会社内ではコーディング規約を作った方が良さそうです。<br /> 何も決まっていないと、一人で書く時も表記がゆれたり、書き方が変わってしまったりすることも起こりえます。</p> <p>リファクタリング大変だけど、がんばろう・・・</p> <p>▼参考▼<br /> 著者の会社で作ったコーディングガイドラインが公開されています。<br /> <a target="_blank" rel="nofollow noopener" href="https://tonari-it.com/excel-vba-coding-guide-line/">エクセルVBAコーディングガイドライン【随時更新】</a></p> <h3 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h3> <p>勉強していると、痛い(対応できてない)こともあって、それを知って、知った直後は、うわあああと頭を抱えたくなるのですが、今のまま負の資産を増やしていきたくはないので、、、</p> <p>これからこの本を参考に社内で勉強会をする等して、<br /> 少しずつでも、社内でのコードのクオリティを上げていきたいと思います。(なんだこの社内で抱負を発表するようなまじめな記述は・・・でも本当にそう思います・・・)</p> <p>メンテナンスしやすいコードが書けるように、複数メンバーでも対応しやすいように、<br /> さらに学習を進めていきたいと思っています。</p> <p>うわあああ(叫び)と言いながら(涙)<br /> どうせやるなら、楽しく進めていきたいと思います。</p> <p>これはVBAについての話ですが、言語がVBAでなくても大切なことなので、身につけて損はないですよ。<br /> ふぁいとー!</p> <p><strong>▼書籍(楽天ブックス)はこちら</strong><br /> <a target="_blank" rel="nofollow noopener" href="https://hb.afl.rakuten.co.jp/hgc/1a255196.487c813e.1a255197.966371a9/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F14714310%2F&m=http%3A%2F%2Fm.rakuten.co.jp%2Fbook%2Fi%2F18413544%2F&link_type=text&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJ0ZXh0Iiwic2l6ZSI6IjI0MHgyNDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MSwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjEsInByb2QiOjB9" target="_blank" rel="nofollow noopener noreferrer" style="word-wrap:break-word;" >ExcelVBAを実務で使い倒す技術 [ 高橋宣成 ]</a></p> <p><strong>▼書籍(Amazon)はこちら</strong><br /> <a target="_blank" rel="nofollow noopener" href="https://www.amazon.co.jp/dp/4798049999">ExcelVBAを実務で使い倒す技術 高橋宣成著</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