tag:crieit.net,2005:https://crieit.net/tags/VBA/feed 「VBA」の記事 - Crieit Crieitでタグ「VBA」に投稿された最近の記事 2023-01-27T01:48:51+09:00 https://crieit.net/tags/VBA/feed tag:crieit.net,2005:PublicArticle/18377 2023-01-25T20:40:52+09:00 2023-01-27T01:48:51+09:00 https://crieit.net/posts/Excel-VBA-63d11544ba099 【実況ブログ】 Excel VBAで初めてのプログラミングを覚えようぜ(^~^)? <h1 id="📅2023-01-25 mon 19:15 start"><a href="#%F0%9F%93%852023-01-25+mon+19%3A15+start">📅2023-01-25 mon 19:15 start</a></h1> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 Excel を購入しろだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 してるぜ」</p> <p><a href="https://crieit.now.sh/upload_images/7d2e6ce5359b68c2fbfc93128857ccd863d102e696019.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/7d2e6ce5359b68c2fbfc93128857ccd863d102e696019.png?mw=700" alt="202301_excel_25-1920--sheet.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 これを使って、プログラミングを覚えてもらう」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 現代の Excel は チューリング完全らしいですしね」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 じゃあ Excel で チューリング・マシンを作るのか?<br /> 無限のテープをどう表現する?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 テープが足りなくなったら 強制終了すればいいだろ」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://en.wikipedia.org/wiki/Turing_machine">Turing machine</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 例題は Wikipedia を参考にしようぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/a7bee6a2939b3d27802fa74666966e4e63d10ccb8eaa1.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/a7bee6a2939b3d27802fa74666966e4e63d10ccb8eaa1.png?mw=700" alt="202301_excel_25-2002--StateTable.png" /></a></p> <p><code>[TuringMachineByExcelVBA.xlsm] file - [StateTable] sheet</code>:</p> <pre><code class="csv">State,Read,Write,Move,Transition A,White,Orange,>,B A,Orange,Orange,<,C B,White,Orange,<,A B,Orange,Orange,>,B C,White,Orange,<,B C,Orange,Orange,>,HALT </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 とりあえず <code>StateMachine</code> シートを作れだぜ。<br /> セルに色も塗れだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 このシートが何かの説明はしないの?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 手を動かせば あとで分かる」</p> <p><a href="https://crieit.now.sh/upload_images/2bd8e45ab2cf441bd6fbd64b9fb1440863d10dc15985e.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/2bd8e45ab2cf441bd6fbd64b9fb1440863d10dc15985e.png?mw=700" alt="202301_excel_25-2008--Tape.png" /></a></p> <p><code>[TuringMachineByExcelVBA.xlsm] file - [Tape] sheet</code>:</p> <pre><code class="csv">A </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 もう1つ、 <code>Tape</code> シートを作れだぜ。<br /> <code>A</code> の1文字だけ入っている」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 これは何なんだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 あとで分かる」</p> <p><a href="https://crieit.now.sh/upload_images/5be4add46fc7c8f5a3ff33285bc455d163d10f482920b.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5be4add46fc7c8f5a3ff33285bc455d163d10f482920b.png?mw=700" alt="202301_excel_25-2014--OpenCode-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 空っぽの <code>GUI</code> というシートを作って、<br /> メインメニューから <code>[開発] - [コードの表示]</code> を選べだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/8e5c6787ff6884ae25742bf5316c659b63d10fc7a71bd.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/8e5c6787ff6884ae25742bf5316c659b63d10fc7a71bd.png?mw=700" alt="202301_excel_25-2017--VBAEditor.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 VBA のエディターが出てくるな」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 あの 不便なやつね」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ほんと 不便だな。 シートに戻るぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e8e85792d662411ad13e424c8571f5b763d11114d4f20.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e8e85792d662411ad13e424c8571f5b763d11114d4f20.png?mw=700" alt="202301_excel_25-2021--Button-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 先に ボタンを置こうぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/43e7f5d13408af482856786fd1e9570b63d111bad4d9e.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/43e7f5d13408af482856786fd1e9570b63d111bad4d9e.png?mw=700" alt="202301_excel_25-2024--PutButton-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 何だか よくわからないが <code>ボタン1_Click</code> という名前はそのまんまで<br /> マクロの保存先を 今作業中のファイルに変えて、 <code>[新規作成(N)]</code> ボタンを押そうぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 Excel の使い方を記憶してないの わらう」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 プログラマーは 記憶 ではなく、 <strong>読み</strong> で進むのよ。<br /> その方が 応用が利くから」</p> <p><a href="https://crieit.now.sh/upload_images/7fc9f87fe1c8e6ad26d268f24fc9812f63d112c4a2e30.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/7fc9f87fe1c8e6ad26d268f24fc9812f63d112c4a2e30.png?mw=700" alt="202301_excel_25-2029--CreateButton-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 ボタンがでけてる。<br /> 当たった」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 当たった とか 講師から出てきたらおかしい言葉 わらう」</p> <p><a href="https://crieit.now.sh/upload_images/a9682e7b76b5ec11dd96a83993301a8b63d11393ae7ea.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/a9682e7b76b5ec11dd96a83993301a8b63d11393ae7ea.png?mw=700" alt="202301_excel_25-2032--RegisterMacro-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 ボタンを右クリックして コンテキスト・メニューの <code>[マクロの登録(N)]</code> を<br /> クリックしてみようぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/ff5836d7acb5395226ed608bce8df05a63d114270be35.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ff5836d7acb5395226ed608bce8df05a63d114270be35.png?mw=700" alt="202301_excel_25-2035--Ok-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 何をすればいいのか分からん。 <code>[OK]</code> ボタンを押してみようぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/995318528394eec0b95b7eac406e1ace63d1149283db7.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/995318528394eec0b95b7eac406e1ace63d1149283db7.png?mw=700" alt="202301_excel_25-2037--Code.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 ?<br /> 何が起こった?」</p> <p><a href="https://crieit.now.sh/upload_images/4127845072bc324880940de1cf50593763d114ef2b8ba.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4127845072bc324880940de1cf50593763d114ef2b8ba.png?mw=700" alt="202301_excel_25-2038--Skeleton-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 👆 なんか コードが増えてるのでは?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 よっしゃ!<br /> じゃあ そこに VBA Script (ぶい・びー・えー・すくりぷと)を書けばいいんだぜ」</p> <p>📅 2023-01-25 wed 20:41</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 🔍 <code>VBA セルに値を入れる</code> で検索」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/prog/prog_atai.html">セルに値を入れる:Excel VBA プログラミング入門</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 よし 分かったぜ」</p> <p><a href="https://crieit.now.sh/upload_images/8bedf851dc72c6806bd384e10b70508e63d116df021a7.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/8bedf851dc72c6806bd384e10b70508e63d116df021a7.png?mw=700" alt="202301_excel_25-2046--HelloWorld-1.png" /></a></p> <pre><code class="vba">Worksheets("GUI").Range("A1").Value = "Hello, world!!" </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 こんな感じに書けば <code>GUI</code> シートの <code>A1</code> セルに <code>Hello, world!!</code> という文字を<br /> 入れてくれそうだな」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ボタンを押そうぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/ea960374c712c2d05121e25ea27ea9cc63d11794cb716.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ea960374c712c2d05121e25ea27ea9cc63d11794cb716.png?mw=700" alt="202301_excel_25-2049--ShowHelloWorld-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 ほら 出た」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 <code>Excelでハローワールドを出力する</code> の実績を解除したな」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 じゃあ次。<br /> 🔍 <code>VBA セルに色を付ける</code> で検索」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://www.tipsfound.com/vba/07006">セルに色を設定する</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 よし 分かったぜ」</p> <p><a href="https://crieit.now.sh/upload_images/ab3f6398046ba32df211de0534339eb163d1190f3e6d6.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ab3f6398046ba32df211de0534339eb163d1190f3e6d6.png?mw=700" alt="202301_excel_25-2056--BackgroundColor-1.png" /></a></p> <pre><code class="vba">Worksheets("GUI").Range("A1").Interior.ColorIndex = 45 ' オレンジ </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 こんな感じに書けば <code>GUI</code> シートの <code>A1</code> セルの背景色をオレンジ色に<br /> してくれそうだな」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ボタンを押そうぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/ed751568c624bbe3c65a037eb56fccf663d11972c76a3.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ed751568c624bbe3c65a037eb56fccf663d11972c76a3.png?mw=700" alt="202301_excel_25-2057--ShowBackgroundColor-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 A1 セルに色が付いたな」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 着色の自動化に使えそうねえ」</p> <p><a href="https://crieit.now.sh/upload_images/d3954444815536359e16f3966743a8c963d11c0290ab2.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d3954444815536359e16f3966743a8c963d11c0290ab2.png?mw=700" alt="202301_excel_25-2108--GetColor-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 じゃあ、 <code>StateTable</code> シートの C2 セルの背景色が何色かとか、取得することはできるのかだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 ググりゃいいんじゃないの?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 🔍 <code>VBA セルの色を取得</code> で検索」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://www.tipsfound.com/vba/07005">VBA セルの色を取得する (Interior.Color, ColorIndex)</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 よし 分かったぜ」</p> <p><a href="https://crieit.now.sh/upload_images/54dd3efed1a31e73d04c267e53e17dac63d11e1182115.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/54dd3efed1a31e73d04c267e53e17dac63d11e1182115.png?mw=700" alt="202301_excel_25-2117--CopyColor-1.png" /></a></p> <pre><code class="vba"> Dim backgroundColor As Long backgroundColor = Worksheets("StateTable").Range("C2").Interior.color ' 背景色 Debug.Print (backgroundColor) Worksheets("GUI").Range("A1").Interior.color = backgroundColor </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 こう書けば <code>StateTable</code> シートの <code>C2</code> セルの背景色を、 <code>GUI</code> シートの <code>A1</code> セルへ コピーできるはずだぜ!」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ボタンを押そうぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/1568e0c8ce0e64297f4f75d776947c2963d11eb23fb6a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/1568e0c8ce0e64297f4f75d776947c2963d11eb23fb6a.png?mw=700" alt="202301_excel_25-2120--ExecuteCopyColor-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 背景色は コピーでけたが……。<br /> <code>Debug.Print( ... )</code> って何だぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 ググりゃいいんじゃないの?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 🔍 <code>VBA デバッグプリント</code> で検索」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://tonari-it.com/excel-vba-debug-print/">【エクセルVBA】初心者のうちから知っておくべきDebug.Printの使い方</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 <strong>イミディエイト・ウィンドウ</strong> に値を表示するらしいぜ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 イミディエイト・ウィンドウ って何だぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 ググりゃいいんじゃないの?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 🔍 <code>VBA イミディエイトウィンドウ</code> で検索」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://www.kenschool.jp/blog/?p=3430">イミディエイトウィンドウの使い方</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 よし 分かったぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e6b3acf6e5aca1fc55867d968f4f342d63d120141a3d7.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e6b3acf6e5aca1fc55867d968f4f342d63d120141a3d7.png?mw=700" alt="202301_excel_25-2125--Immediate-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 <code>[Ctrl] + [G]</code> キーを打鍵すると 出てくるウィンドウだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 そんなウィンドウの出し方、 画面のどこを探しても 無くね?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 コンピューター開発者は <code>私には分かる。だからお前も分かるだろ</code> という脳をしてる人 多いのよ。<br /> 伝え、継承する精神を持っている人は リタイア組ぐらいよ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 天才が 技術を継承するの 損だしな。<br /> ネット上で 記事書いてるの リタイア組か、 業界が滅ぶ一歩手前で しかたなく 天才のケツ掃除してる人たちの どっちかだよな」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 しかし <code>49407</code> なんて数字出てきても 嬉しくないな」</p> <p>📅 2023-01-25 wed 21:36</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 じゃあ 次は長めの コンボ(Combo;連続技) やるから よく聴けだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/10533ade231776b7c34ab00bb9c960e063d12359726bf.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/10533ade231776b7c34ab00bb9c960e063d12359726bf.png?mw=700" alt="202301_excel_25-2140--a1-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>Tape</code> シートの <code>A1</code> セルに入っている値 <code>A</code> と、その背景色 白色 を取得して……」</p> <p><a href="https://crieit.now.sh/upload_images/21fadc22632f5e65a9da1a98a748e35563d123daa45b8.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/21fadc22632f5e65a9da1a98a748e35563d123daa45b8.png?mw=700" alt="202301_excel_25-2142--seek-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>StateTable</code> シートの <code>State</code> 列に <code>A</code> が、<br /> <code>Read</code> 列に 背景色が白色のセルが<br /> 無いかなと探し……」</p> <p><a href="https://crieit.now.sh/upload_images/4f19e8287c402995d82464e71220ebe463d12458a2c1d.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4f19e8287c402995d82464e71220ebe463d12458a2c1d.png?mw=700" alt="202301_excel_25-2142--seek-2.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 見つけたら……」</p> <p><a href="https://crieit.now.sh/upload_images/55977720b323939598c8a932fa58ba7763d124a97cfd2.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/55977720b323939598c8a932fa58ba7763d124a97cfd2.png?mw=700" alt="202301_excel_25-2142--seek-3.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 そのまま 横へスライドし、<br /> Write列 の背景色は オレンジ色、<br /> Move列 は <code>></code> 、<br /> Transition列 は <code>B</code><br /> と いったん覚え……」</p> <p><a href="https://crieit.now.sh/upload_images/9e508dc25de95f97970c4606d32134a463d1260a86ee0.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/9e508dc25de95f97970c4606d32134a463d1260a86ee0.png?mw=700" alt="202301_excel_25-2149--output-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>Tape</code> シートを開き、<br /> A1 セルから 1行下にいったところを、 Write 列にあるように オレンジ色 に塗り、<br /> Move列が <code>></code> とあるように その右側に対して、<br /> Transition列があるように <code>B</code> を書き込もうぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 長い」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 いったん <code>TuringMachineByExcelVBA.xlsm</code> ファイルを保存して閉じるぜ。<br /> 休憩だぜ」</p> <p>📅 2023-01-25 wed 22:10 stop</p> <p>📅 2023-01-25 wed 22:21 restart</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 よっしゃ 再開だぜ!<br /> <code>TuringMachineByExcelVBA.xlsm</code> ファイルを開けて、っと」</p> <p><a href="https://crieit.now.sh/upload_images/a5986e9999f216f44cf41643061082f963d12d3d41e93.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/a5986e9999f216f44cf41643061082f963d12d3d41e93.png?mw=700" alt="202301_excel_25-2222--clear.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 消えてる!」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 よく探せだぜ!」</p> <p><a href="https://crieit.now.sh/upload_images/911081e91fc626fedc3222f61a52f6b063d12db90ab2f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/911081e91fc626fedc3222f61a52f6b063d12db90ab2f.png?mw=700" alt="202301_excel_25-2224--project-window-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 無い、無い、無い、<br /> どこにも 無~い!」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 ファイルを開けるには、ダブル・クリック するんじゃないの?」</p> <p><a href="https://crieit.now.sh/upload_images/51fb39e17099b3f9fea0320e7586266d63d12e1966994.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/51fb39e17099b3f9fea0320e7586266d63d12e1966994.png?mw=700" alt="202301_excel_25-2226--double-click.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 あ、 有った」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 じゃあ <code>Tape</code> シートの <code>A1</code> セルの値 <code>A</code> と背景色 白色 を取得して、<br /> そのタプル(Tuple;組み)が <code>StateTable</code> シートの何行目にあるか探し出して<br /> イミディエイト・ウィンドウに デバッグプリント するところまで やりましょう!」</p> <p><a href="https://crieit.now.sh/upload_images/aa9fb664e006bfd66d5afdddfecf45c063d12f44ec29c.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/aa9fb664e006bfd66d5afdddfecf45c063d12f44ec29c.png?mw=700" alt="202301_excel_25-2230--getValue-1.png" /></a></p> <pre><code class="vba">Sub ボタン1_Click() Dim text As String Dim backgroundColor As Long text = Worksheets("Tape").Range("A1").Value ' セルの値 backgroundColor = Worksheets("Tape").Range("A1").Interior.color ' 背景色 Debug.Print (text) Debug.Print (backgroundColor) Worksheets("GUI").Range("A1").Value = text Worksheets("GUI").Range("A1").Interior.color = backgroundColor End Sub </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 値と 背景色のコピーは できるようになったが、<br /> 次は 探すというやつだな」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 🔍 <code>VBA For文</code> で検索」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/vba2013/04-for01.html">[Excel で VBA] For 文による繰り返し</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 よし 分かったぜ」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 <code>For文</code> が何かの説明は しないのね」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 手を動かせば 分かるぜ」</p> <p><a href="https://crieit.now.sh/upload_images/5608b24b4b67d86711a4619d515748f563d1317277ca9.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5608b24b4b67d86711a4619d515748f563d1317277ca9.png?mw=700" alt="202301_excel_25-2240--loop-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 多分 <code>StateTable</code> シートを 1行目から 7行目まで読むのは こんな雰囲気だろ。<br /> VBA の if 文ってどうやって書くんだったかな?」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 記憶してないの わらう」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 🔍 <code>VBA if文</code> で検索」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://office-hack.com/excel/if-vba/">ExcelのVBA(マクロ)でIf~Then~Elseを使って条件分岐する方法</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 よし 分かったぜ」</p> <p><a href="https://crieit.now.sh/upload_images/55c377d1e72e453ee5954f4471aa3a9a63d133aea4cb7.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/55c377d1e72e453ee5954f4471aa3a9a63d133aea4cb7.png?mw=700" alt="202301_excel_25-2249--if-then-else-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 多分 if文は こんな雰囲気だろ。<br /> Forループを途中で抜けるの VBAで どうやって書くんだったかな?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 ググりゃいいんじゃないの?」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 なんにも覚えてないんだな」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 🔍 <code>VBA break文</code> で検索」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://uxmilk.jp/48591">Excel VBAでFor文を途中で抜ける:Exit</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 よし 分かったぜ」</p> <pre><code class="vba">Sub ボタン1_Click() Dim text As String Dim backgroundColor As Long text = Worksheets("Tape").Range("A1").Value ' セルの値 backgroundColor = Worksheets("Tape").Range("A1").Interior.color ' 背景色 Debug.Print (text) Debug.Print (backgroundColor) Worksheets("GUI").Range("A1").Value = text Worksheets("GUI").Range("A1").Interior.color = backgroundColor Dim i As Long Dim stateText As String Dim readBackgroundColor As Long Dim writeBackgroundColor As Long Dim moveText As String Dim transitionText As String For i = 2 To 7 stateText = Worksheets("StateTable").Range("A" & i).Value ' セルの値 readBackgroundColor = Worksheets("StateTable").Range("B" & i).Interior.color ' 背景色 ' 一致するか? If text = stateText And backgroundColor = readBackgroundColor Then writeBackgroundColor = Worksheets("StateTable").Range("C" & i).Interior.color ' 背景色 moveText = Worksheets("StateTable").Range("D" & i).Value ' セルの値 transitionText = Worksheets("StateTable").Range("E" & i).Value ' セルの値 Debug.Print (writeBackgroundColor) Debug.Print (moveText) Debug.Print (transitionText) ' TODO 次の処理へ Exit For End If Next i End Sub </code></pre> <p><a href="https://crieit.now.sh/upload_images/055ad87739413e7ce40cde35dc7e9bc363d135e9993df.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/055ad87739413e7ce40cde35dc7e9bc363d135e9993df.png?mw=700" alt="202301_excel_25-2257--find-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 取れてるぜ」</p> <p>📅 2023-01-25 wed 23:00</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 次は、<br /> <code>Tape</code> シートの A1 セルを スタート地点として、<br /> 1行 下りたセルの背景色を Write列のいう色に塗って、そこから<br /> Move 列が <code>></code> だったら その右のセルへ、 Transition 列のいうテキストを入れましょう」</p> <p><a href="https://crieit.now.sh/upload_images/6d424c48b1e3b97a5bdd13889698200363d1391f18557.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6d424c48b1e3b97a5bdd13889698200363d1391f18557.png?mw=700" alt="202301_excel_25-2310--write-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 こんな感じだろ」</p> <p><a href="https://crieit.now.sh/upload_images/c1ded23ca69e31848ab042beebc7d81a63d1395c1c5c8.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/c1ded23ca69e31848ab042beebc7d81a63d1395c1c5c8.png?mw=700" alt="202301_excel_25-2314--tape.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>Tape</code> シートの2行目を クリアーしておくぜ。<br /> そして <code>GUI</code> シートのボタンを押すぜ」</p> <p><a href="https://crieit.now.sh/upload_images/e1df2e8107ce252e9c3a3120d8fa8df663d139f139a7d.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e1df2e8107ce252e9c3a3120d8fa8df663d139f139a7d.png?mw=700" alt="202301_excel_25-2316--result-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 色も文字もコピーされたぜ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 おつ。<br /> 長いコンボが決まったな」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 これで 1クロック よね」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 何だぜ それ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 次は 2クロック目に 行ってみようぜ?」</p> <p>📅 2023-01-25 wed 23:21</p> <p><a href="https://crieit.now.sh/upload_images/4a20812bd5c1a3fc61525e8d4e1e598463d13b29bab9f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4a20812bd5c1a3fc61525e8d4e1e598463d13b29bab9f.png?mw=700" alt="202301_excel_25-2321--2th-clock-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 B2 セルをスタート地点として、 同様に さっきと同じことを やればいいんだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 嫌だぜ なんでそんなことをするんだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 ラジオ体操 みたいなもんよ。 頭を ほぐしてんのよ」</p> <p><a href="https://crieit.now.sh/upload_images/f21bba2889296010e5e957b6cd6612a863d13c296c3bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/f21bba2889296010e5e957b6cd6612a863d13c296c3bc.png?mw=700" alt="202301_excel_25-2325--b-white-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 文字が <code>B</code> で、背景色が 白色 なのは 4行目だな。<br /> 下にオレンジ塗って 左へ A を書けばよさそうだな」</p> <p><a href="https://crieit.now.sh/upload_images/78e64f2f57b3fec52bb5592a96eff7c963d13eff66930.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/78e64f2f57b3fec52bb5592a96eff7c963d13eff66930.png?mw=700" alt="202301_excel_25-2337--time-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 説明するのを忘れていたが、上の行の背景色を、下の行へ 引き継ぐぜ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 忘れないでくれだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/75687cd8dc9973fb5a9d1c9436f4002263d13f9b620f9.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/75687cd8dc9973fb5a9d1c9436f4002263d13f9b620f9.png?mw=700" alt="202301_excel_25-2340--time-b-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 下にオレンジ塗るぜ」</p> <p><a href="https://crieit.now.sh/upload_images/0190cff67c269feba781ed9ff9d4c4b563d140e08a2db.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/0190cff67c269feba781ed9ff9d4c4b563d140e08a2db.png?mw=700" alt="202301_excel_25-2346--time-c-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 左に A を書いたら こんな感じだな」</p> <p><a href="https://crieit.now.sh/upload_images/e2e349677ccb4abecf4a080e9c770deb63d14154d23b7.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e2e349677ccb4abecf4a080e9c770deb63d14154d23b7.png?mw=700" alt="202301_excel_25-2348--Code.png" /></a></p> <pre><code class="vba">Sub ボタン1_Click() Dim text As String Dim backgroundColor As Long Dim i As Long Dim stateText As String Dim readBackgroundColor As Long Dim writeBackgroundColor As Long Dim moveText As String Dim transitionText As String ' 1回目の処理 text = Worksheets("Tape").Range("A1").Value ' セルの値 backgroundColor = Worksheets("Tape").Range("A1").Interior.color ' 背景色 For i = 2 To 7 stateText = Worksheets("StateTable").Range("A" & i).Value ' セルの値 readBackgroundColor = Worksheets("StateTable").Range("B" & i).Interior.color ' 背景色 ' 一致するか? If text = stateText And backgroundColor = readBackgroundColor Then writeBackgroundColor = Worksheets("StateTable").Range("C" & i).Interior.color ' 背景色 moveText = Worksheets("StateTable").Range("D" & i).Value ' セルの値 transitionText = Worksheets("StateTable").Range("E" & i).Value ' セルの値 ' `Tape` シートの A1 セルの下のセルの背景色を Write列のいう色に塗る Worksheets("Tape").Range("A2").Interior.color = writeBackgroundColor ' Move 列が `>` だったら その右のセルへ、 Transition 列のいうテキストを入れる If moveText = ">" Then Worksheets("Tape").Range("B2").Value = transitionText End If Exit For End If Next i ' TODO ★ 同様の2回目の処理 text = Worksheets("Tape").Range("B2").Value ' セルの値 backgroundColor = Worksheets("Tape").Range("B2").Interior.color ' 背景色 ' ★ 上の行の背景色は引き継ぐ Worksheets("Tape").Range("A3").Interior.color = Worksheets("Tape").Range("A2").Interior.color Worksheets("Tape").Range("B3").Interior.color = Worksheets("Tape").Range("B3").Interior.color For i = 2 To 7 stateText = Worksheets("StateTable").Range("A" & i).Value ' セルの値 readBackgroundColor = Worksheets("StateTable").Range("B" & i).Interior.color ' 背景色 ' 一致するか? If text = stateText And backgroundColor = readBackgroundColor Then writeBackgroundColor = Worksheets("StateTable").Range("C" & i).Interior.color ' 背景色 moveText = Worksheets("StateTable").Range("D" & i).Value ' セルの値 transitionText = Worksheets("StateTable").Range("E" & i).Value ' セルの値 ' `Tape` シートの A1 セルの下のセルの背景色を Write列のいう色に塗る Worksheets("Tape").Range("B3").Interior.color = writeBackgroundColor ' ★ Move 列が `<` だったら その左のセルへ、 Transition 列のいうテキストを入れる If moveText = "<" Then Worksheets("Tape").Range("A3").Value = transitionText End If Exit For End If Next i End Sub </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 それを コードにしたら こんな感じだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 長い」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 これで 2クロック よね」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 何だぜ それ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 次は 3クロック目に 行ってみようぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 嫌だぜ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 今日は ここまでとするが、 3クロック目 行くからな」</p> <p>📅 2023-01-25 wed 23:51 end</p> <h1 id="📅2023-01-26 thu 18:53 start"><a href="#%F0%9F%93%852023-01-26+thu+18%3A53+start">📅2023-01-26 thu 18:53 start</a></h1> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 VBA でサブルーチンは どうやって書いたらいいんだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 ググりゃいいんじゃないの?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 🔍 <code>VBA サブルーチン</code> で検索」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://kosapi.com/post-5008/">Excel VBA 処理の一部をサブルーチン化するCallステートメント</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 よし 分かったぜ」</p> <p><a href="https://crieit.now.sh/upload_images/bd596f09e3b962c6b9f6b5e2603dca2263d24fb97805b.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/bd596f09e3b962c6b9f6b5e2603dca2263d24fb97805b.png?mw=700" alt="202301_excel_26-1901--Subroutine-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 スケルトン(Skeleton;穴埋めの穴じゃない方)を書こうぜ」</p> <p><a href="https://crieit.now.sh/upload_images/aeed27da28a1e2e6fb9834509983fad163d2514d6e3aa.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/aeed27da28a1e2e6fb9834509983fad163d2514d6e3aa.png?mw=700" alt="202301_excel_26-1906--MoveCode-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 スケルトンの中へ コードを こうやって 入れたらいいんじゃないかだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/9b465017915b949d3a4152c38134c39863d251d1a8f17.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/9b465017915b949d3a4152c38134c39863d251d1a8f17.png?mw=700" alt="202301_excel_26-1911--MovedCode.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 つまり こう」</p> <p><a href="https://crieit.now.sh/upload_images/7f3a7089c2ea734bbb3f14dbe451e7d163d2523bbff86.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/7f3a7089c2ea734bbb3f14dbe451e7d163d2523bbff86.png?mw=700" alt="202301_excel_26-1912--Call-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 移動した跡の所には コール文(Call Statement)を置いておこうぜ?」</p> <pre><code class="vba">Sub ボタン1_Click() ' 1回目の処理 Call On1stClock ' 同様の2回目の処理 Call On2ndClock End Sub Private Sub On1stClock() ' 1回目のクロック Dim text As String Dim backgroundColor As Long Dim i As Long Dim stateText As String Dim readBackgroundColor As Long Dim writeBackgroundColor As Long Dim moveText As String Dim transitionText As String text = Worksheets("Tape").Range("A1").Value ' セルの値 backgroundColor = Worksheets("Tape").Range("A1").Interior.color ' 背景色 For i = 2 To 7 stateText = Worksheets("StateTable").Range("A" & i).Value ' セルの値 readBackgroundColor = Worksheets("StateTable").Range("B" & i).Interior.color ' 背景色 ' 一致するか? If text = stateText And backgroundColor = readBackgroundColor Then writeBackgroundColor = Worksheets("StateTable").Range("C" & i).Interior.color ' 背景色 moveText = Worksheets("StateTable").Range("D" & i).Value ' セルの値 transitionText = Worksheets("StateTable").Range("E" & i).Value ' セルの値 ' `Tape` シートの A1 セルの下のセルの背景色を Write列のいう色に塗る Worksheets("Tape").Range("A2").Interior.color = writeBackgroundColor ' Move 列が `>` だったら その右のセルへ、 Transition 列のいうテキストを入れる If moveText = ">" Then Worksheets("Tape").Range("B2").Value = transitionText End If Exit For End If Next i End Sub Private Sub On2ndClock() ' 2回目のクロック Dim text As String Dim backgroundColor As Long Dim i As Long Dim stateText As String Dim readBackgroundColor As Long Dim writeBackgroundColor As Long Dim moveText As String Dim transitionText As String text = Worksheets("Tape").Range("B2").Value ' セルの値 backgroundColor = Worksheets("Tape").Range("B2").Interior.color ' 背景色 ' ★ 上の行の背景色は引き継ぐ Worksheets("Tape").Range("A3").Interior.color = Worksheets("Tape").Range("A2").Interior.color Worksheets("Tape").Range("B3").Interior.color = Worksheets("Tape").Range("B3").Interior.color For i = 2 To 7 stateText = Worksheets("StateTable").Range("A" & i).Value ' セルの値 readBackgroundColor = Worksheets("StateTable").Range("B" & i).Interior.color ' 背景色 ' 一致するか? If text = stateText And backgroundColor = readBackgroundColor Then writeBackgroundColor = Worksheets("StateTable").Range("C" & i).Interior.color ' 背景色 moveText = Worksheets("StateTable").Range("D" & i).Value ' セルの値 transitionText = Worksheets("StateTable").Range("E" & i).Value ' セルの値 ' `Tape` シートの A1 セルの下のセルの背景色を Write列のいう色に塗る Worksheets("Tape").Range("B3").Interior.color = writeBackgroundColor ' ★ Move 列が `<` だったら その左のセルへ、 Transition 列のいうテキストを入れる If moveText = "<" Then Worksheets("Tape").Range("A3").Value = transitionText End If Exit For End If Next i End Sub </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 じゃあ <code>GUI</code> シートのボタンを押そうぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/60d46eddc740de260994cbc83f82edc463d252c114f71.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/60d46eddc740de260994cbc83f82edc463d252c114f71.png?mw=700" alt="202301_excel_26-1915--Check.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 ちゃんと動いてるな」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 場所を移しただけだしな」</p> <p>📅2023-01-26 thu 19:16</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 3クロック目も コピー貼り付けして作んの?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 嫌になるだろ」</p> <p><a href="https://crieit.now.sh/upload_images/3ef93b3d925a27efdeb7ebe3aa75cd5d63d253cfe6a02.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/3ef93b3d925a27efdeb7ebe3aa75cd5d63d253cfe6a02.png?mw=700" alt="202301_excel_26-1919--OnClock-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 何回目のクロックでも使えるジェネラル(General)なサブルーチンを作ろうぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/5b0a749e37816dd597d3d8c6ca75b62763d255a98666e.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5b0a749e37816dd597d3d8c6ca75b62763d255a98666e.png?mw=700" alt="202301_excel_26-1911--MovedCode-diff.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 違うところは5か所ぐらいなんだから、ここを違わないようにすればいいわけだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 A列の右隣は B列 だが、<br /> <code>A</code> の右は何か尋ねたら <code>B</code> が返ってくるような方法って VBA にあるのかだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 ググりゃいいんじゃないの?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 🔍 <code>VBA 列アルファベット変換</code> で検索」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://qiita.com/11295/items/c26017eb21cb319fd29d">【ExcelVBA】列名のアルファベットと列番号の数字を相互変換する</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 よし 分かったぜ」</p> <p><a href="https://crieit.now.sh/upload_images/692b189f8ba2c55c3ffb94fda73ba9b963d26dd08ec89.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/692b189f8ba2c55c3ffb94fda73ba9b963d26dd08ec89.png?mw=700" alt="202301_excel_26-2110--General.png" /></a></p> <pre><code class="vba">Sub ボタン1_Click() ' 1回目の処理 Call OnClock("A", 1) ' 同様の2回目の処理 Call OnClock("B", 2) End Sub Private Sub OnClock(previousFileAlphabet As String, previousRank As Long) ' TODO 毎クロック(n回目のクロック) Dim previousText As String Dim previousBackgroundColor As Long Dim previousCell As String Dim currentRank As Long Dim currentCell As String Dim stateText As String Dim readBackgroundColor As Long Dim writeBackgroundColor As Long Dim moveText As String Dim transitionText As String Dim i As Long previousCell = previousFileAlphabet & previousRank currentRank = previousRank + 1 currentCell = previousFileAlphabet & currentRank Debug.Print ("--------") Debug.Print ("previousFileAlphabet:" & previousFileAlphabet) Debug.Print ("previousRank :" & previousRank) Debug.Print ("previousCell :" & previousCell) Debug.Print ("currentRank :" & currentRank) Debug.Print ("currentCell :" & currentCell) ' 開始行の背景色は、次行に引き継ぐ If 2 <= previousRank Then Dim aBackgroundColor As Long Dim bBackgroundColor As Long aBackgroundColor = Worksheets("Tape").Range("A" & previousRank).Interior.color bBackgroundColor = Worksheets("Tape").Range("B" & previousRank).Interior.color Worksheets("Tape").Range("A" & currentRank).Interior.color = aBackgroundColor Worksheets("Tape").Range("B" & currentRank).Interior.color = bBackgroundColor Debug.Print ("aBackgroundColor:" & aBackgroundColor) Debug.Print ("bBackgroundColor:" & bBackgroundColor) End If previousText = Worksheets("Tape").Range(previousCell).Value ' 開始セルの値 previousBackgroundColor = Worksheets("Tape").Range(previousCell).Interior.color ' 開始セルの背景色 Debug.Print ("previousText :" & previousText) Debug.Print ("previousBackgroundColor:" & previousBackgroundColor) For i = 2 To 7 stateText = Worksheets("StateTable").Range("A" & i).Value ' 状態テーブルのState値 readBackgroundColor = Worksheets("StateTable").Range("B" & i).Interior.color ' 状態テーブルのRead列の背景色 Debug.Print ("stateText :" & stateText) Debug.Print ("readBackgroundColor :" & readBackgroundColor) ' 一致するか? If previousText = stateText And previousBackgroundColor = readBackgroundColor Then writeBackgroundColor = Worksheets("StateTable").Range("C" & i).Interior.color ' 状態テーブルのWrite列の背景色 moveText = Worksheets("StateTable").Range("D" & i).Value ' 状態テーブルのMove列の値 transitionText = Worksheets("StateTable").Range("E" & i).Value ' 状態テーブルのTransition列の値 Debug.Print ("writeBackgroundColor:" & writeBackgroundColor) Debug.Print ("moveText :" & moveText) Debug.Print ("transitionText :" & transitionText) ' `Tape` シートの A1 セルの下のセルの背景色を Write列のいう色に塗る Worksheets("Tape").Range(currentCell).Interior.color = writeBackgroundColor Dim horizontal As Long ' 水平方向 If moveText = ">" Then ' Move 列が `>` だったら その右のセルへ horizontal = 1 ElseIf moveText = "<" Then ' Move 列が `<` だったら その左のセルへ horizontal = -1 End If Debug.Print ("horizontal:" & horizontal) ' Transition 列のいうテキストを入れる Dim startFileNumber As Integer Dim nextFileAlphabet As String startFileNumber = Columns(previousFileAlphabet).Column nextFileAlphabet = Split(Cells(1, startFileNumber + horizontal).Address, "$")(1) Debug.Print ("startFileNumber :" & startFileNumber) Debug.Print ("nextFileAlphabet:" & nextFileAlphabet) Worksheets("Tape").Range(nextFileAlphabet & currentRank).Value = transitionText Exit For End If Next i End Sub </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 けっこう 大がかりに 変えることになってしまったぜ」</p> <p>📅2023-01-26 thu 21:12</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 こんなん 何がどう変わったのか 読者 分からんだろ」</p> <p><a href="https://crieit.now.sh/upload_images/fdfc0cf2fdc2fb0f0adac6ef4e59d0a863d26ebbbdd65.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/fdfc0cf2fdc2fb0f0adac6ef4e59d0a863d26ebbbdd65.png?mw=700" alt="202301_excel_26-2114--3rdClock-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 1クロック目と 2クロック目で違うところは、 スタート地点の列番号と、行番号だけだったということだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 このように 2つのサブルーチンの差異が サブルーチンの外に押し出されたものを <strong>アーギュメント</strong>(Argument;実引数)と呼ぶ」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 ふーん」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 3クロック目は どう書くの?」</p> <p><a href="https://crieit.now.sh/upload_images/0a6c4a73d2935ca90b25ac2e8473e95563d2709e4c167.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/0a6c4a73d2935ca90b25ac2e8473e95563d2709e4c167.png?mw=700" alt="202301_excel_26-2121--argument-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>A1</code> とか <code>B2</code> というのは、1クロック前に居たセルだぜ。<br /> だから 前の計算結果を もらうといい。<br /> 書き直そう」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 VBA でファンクションは どうやって書いたらいいんだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 ググりゃいいんじゃないの?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 🔍 <code>VBA ファンクション</code> で検索」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://www.bold.ne.jp/engineer-club/vba-function">VBA Functionプロシージャについて ~関数の解説と使用例~</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 よし 分かったぜ」</p> <p><a href="https://crieit.now.sh/upload_images/b537b697560f1fb0aeeaadc57a17f15b63d2751076122.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b537b697560f1fb0aeeaadc57a17f15b63d2751076122.png?mw=700" alt="202301_excel_26-2141--function.png" /></a></p> <pre><code class="vba">Sub ボタン1_Click() Dim resultCell As String ' 1回目の処理 resultCell = OnClock("A1") ' 同様の2回目の処理 resultCell = OnClock(resultCell) End Sub Private Function OnClock(previousCell As String) As String ' 毎クロック(n回目のクロック) Dim previousText As String Dim previousBackgroundColor As Long Dim currentRank As Long Dim currentCell As String Dim stateText As String Dim readBackgroundColor As Long Dim writeBackgroundColor As Long Dim moveText As String Dim transitionText As String Dim i As Long previousFileAlphabet = Split(Cells(1, Range(previousCell).Column).Address, "$")(1) previousRank = Range(previousCell).Row currentRank = previousRank + 1 currentCell = previousFileAlphabet & currentRank Debug.Print ("--------") Debug.Print ("previousCell :" & previousCell) Debug.Print ("previousFileAlphabet:" & previousFileAlphabet) Debug.Print ("previousRank :" & previousRank) Debug.Print ("currentRank :" & currentRank) Debug.Print ("currentCell :" & currentCell) ' 開始行の背景色は、次行に引き継ぐ If 2 <= previousRank Then Dim aBackgroundColor As Long Dim bBackgroundColor As Long aBackgroundColor = Worksheets("Tape").Range("A" & previousRank).Interior.color bBackgroundColor = Worksheets("Tape").Range("B" & previousRank).Interior.color Worksheets("Tape").Range("A" & currentRank).Interior.color = aBackgroundColor Worksheets("Tape").Range("B" & currentRank).Interior.color = bBackgroundColor Debug.Print ("aBackgroundColor:" & aBackgroundColor) Debug.Print ("bBackgroundColor:" & bBackgroundColor) End If previousText = Worksheets("Tape").Range(previousCell).Value ' 開始セルの値 previousBackgroundColor = Worksheets("Tape").Range(previousCell).Interior.color ' 開始セルの背景色 Debug.Print ("previousText :" & previousText) Debug.Print ("previousBackgroundColor:" & previousBackgroundColor) For i = 2 To 7 stateText = Worksheets("StateTable").Range("A" & i).Value ' 状態テーブルのState値 readBackgroundColor = Worksheets("StateTable").Range("B" & i).Interior.color ' 状態テーブルのRead列の背景色 Debug.Print ("stateText :" & stateText) Debug.Print ("readBackgroundColor :" & readBackgroundColor) ' 一致するか? If previousText = stateText And previousBackgroundColor = readBackgroundColor Then writeBackgroundColor = Worksheets("StateTable").Range("C" & i).Interior.color ' 状態テーブルのWrite列の背景色 moveText = Worksheets("StateTable").Range("D" & i).Value ' 状態テーブルのMove列の値 transitionText = Worksheets("StateTable").Range("E" & i).Value ' 状態テーブルのTransition列の値 Debug.Print ("writeBackgroundColor:" & writeBackgroundColor) Debug.Print ("moveText :" & moveText) Debug.Print ("transitionText :" & transitionText) ' `Tape` シートの A1 セルの下のセルの背景色を Write列のいう色に塗る Worksheets("Tape").Range(currentCell).Interior.color = writeBackgroundColor Dim horizontal As Long ' 水平方向 If moveText = ">" Then ' Move 列が `>` だったら その右のセルへ horizontal = 1 ElseIf moveText = "<" Then ' Move 列が `<` だったら その左のセルへ horizontal = -1 End If Debug.Print ("horizontal:" & horizontal) ' Transition 列のいうテキストを入れる Dim previousFileNumber As Integer Dim nextFileAlphabet As String Dim nextCell As String previousFileNumber = Columns(previousFileAlphabet).Column nextFileAlphabet = Split(Cells(1, previousFileNumber + horizontal).Address, "$")(1) nextCell = nextFileAlphabet & currentRank Debug.Print ("previousFileNumber :" & previousFileNumber) Debug.Print ("nextFileAlphabet :" & nextFileAlphabet) Debug.Print ("nextCell :" & nextCell) Worksheets("Tape").Range(nextCell).Value = transitionText ' 関数から抜ける OnClock = nextCell Exit Function End If Next i End Function </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 さらに 改造してしまったぜ」</p> <p>📅2023-01-26 thu 21:43</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 こんなん 何がどう変わったのか 読者 分からんだろ」</p> <p><a href="https://crieit.now.sh/upload_images/96464638d29440e381b1a1a8848dbbec63d27668d882a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96464638d29440e381b1a1a8848dbbec63d27668d882a.png?mw=700" alt="202301_excel_26-2146--main-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 このように 前の計算結果を使って また同様に計算するように作るのは よくあるテクニックだぜ。<br /> <strong>漸化式</strong>(ぜんかしき) とか これだな」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 さっさと 3クロック目を書きなさいよ」</p> <p><a href="https://crieit.now.sh/upload_images/fb4fbbb839b9dbe36e947cc566b9f0bd63d2773c25cbc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/fb4fbbb839b9dbe36e947cc566b9f0bd63d2773c25cbc.png?mw=700" alt="202301_excel_26-2150--3rdClock-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 3クロック目は、2クロック目と同じコードで いいはずなんだぜ。<br /> 動かしてみよう」</p> <p><a href="https://crieit.now.sh/upload_images/66f641f330add453cbf13187a107f99a63d277b62b870.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/66f641f330add453cbf13187a107f99a63d277b62b870.png?mw=700" alt="202301_excel_26-2152--error-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 エラーが出たぜ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 直せ!」</p> <p><a href="https://crieit.now.sh/upload_images/0f024dcbc6526f5a4dcbcdef822d799d63d27800a2056.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/0f024dcbc6526f5a4dcbcdef822d799d63d27800a2056.png?mw=700" alt="202301_excel_26-2153--debug-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>[デバッグ(D)]</code> ボタンを押してみようぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/e034203acef8d1e6ea39d674be15a19663d278556be61.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e034203acef8d1e6ea39d674be15a19663d278556be61.png?mw=700" alt="202301_excel_26-2155--highlight.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 エラーがあった行をハイライト(Highlight)してくれてるのかもしれないけど 説明がないから分かんないわねぇ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 また ショートカットを打鍵すれば ウィンドウが出てくるのかだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 ググりゃいいんじゃないの?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 🔍 <code>VBA スタックトレース</code> で検索」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://speakerdeck.com/narazaka/vbanameteta?slide=116">VBAナメてた</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 行番号とエラーコードしか 分かんないらしいぜ」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 1994年の環境ねえ」</p> <p>📅2023-01-26 thu 22:01</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 🔍 <code>VBA 1004 Error</code> で検索」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://www.wallstreetmojo.com/vba-1004-error/#:~:text=This%20error%20occurs%20when%20you,name%20with%20the%20excel%20extension">VBA Error 1004 in Excel</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 無いシート名や、無いアドレスを指定したら 出てくるエラーかも知らん」</p> <p><a href="https://crieit.now.sh/upload_images/3265aec10a1e7becdb64caf901d1eb1763d27b13390ff.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/3265aec10a1e7becdb64caf901d1eb1763d27b13390ff.png?mw=700" alt="202301_excel_26-2207--error.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 A列より 左に進もうとして 0列目は無いので エラーになったんだな」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 A列の左に 列を挿入しろだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 🔍 <code>VBA 列の挿入</code> で検索」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://www.tipsfound.com/vba/09005">VBA 列を挿入する</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 よし 分かったぜ」</p> <p><a href="https://crieit.now.sh/upload_images/9c1455ad9824e532e31e7a03b5cf779363d27d2c21916.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/9c1455ad9824e532e31e7a03b5cf779363d27d2c21916.png?mw=700" alt="202301_excel_26-2215--bugfix-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 0列にアクセスしようとしたら、<br /> A列の左に 列挿入して、 列番地も左に 1つずらして 1列にアクセスするように変更しよう」</p> <p><a href="https://crieit.now.sh/upload_images/6e7a3a2dcf4463fa7169bed325e8f84163d27da7bd035.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e7a3a2dcf4463fa7169bed325e8f84163d27da7bd035.png?mw=700" alt="202301_excel_26-2218--3rdClockDone.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 3クロック目も 動いたようだな」</p> <p>📅2023-01-26 thu 22:18</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 じゃあ あと 100クロックぐらい 動かしましょう」</p> <p><a href="https://crieit.now.sh/upload_images/fb04bbd9f19fbc722de48dff01546cd663d27fa2132bb.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/fb04bbd9f19fbc722de48dff01546cd663d27fa2132bb.png?mw=700" alt="202301_excel_26-2226--For-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>For</code> 文を使えば 100行書かずに済むから楽だよな。<br /> 漸化式の形に作っておけば 繰り返しの回数を指定するだけでいいから 手間要らずだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/a1471049d3f876f18e31d667018db7ba63d2805d6d23d.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/a1471049d3f876f18e31d667018db7ba63d2805d6d23d.png?mw=700" alt="202301_excel_26-2229--Error-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 エラーが出た」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 🔍 <code>VBA 1004 Error</code> で検索しろだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 さっきと同じ 1004 番よ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 今度は何が無かったんだろな?」</p> <p><a href="https://crieit.now.sh/upload_images/e12e7323f7bb4b8c004c359ac49f51f463d282597704d.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e12e7323f7bb4b8c004c359ac49f51f463d282597704d.png?mw=700" alt="202301_excel_26-2237--empty-previous-cell-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>previousCell</code> 変数の中身が空文字列だぜ。」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 <code>A1</code> とか、何か番地が入っているはずじゃない」</p> <p><a href="https://crieit.now.sh/upload_images/8e8dc3028f75bf93b711ed6b1dc4afeb63d2817a7f5e3.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/8e8dc3028f75bf93b711ed6b1dc4afeb63d2817a7f5e3.png?mw=700" alt="202301_excel_26-2234--reset-button-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>リセット</code> ボタンを押すと デバッグは止まるぜ」</p> <p><a href="https://crieit.now.sh/upload_images/1d653278fa64d4c114346024b8a8d96563d282f95697e.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/1d653278fa64d4c114346024b8a8d96563d282f95697e.png?mw=700" alt="202301_excel_26-2240--Halt-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 多分、 <code>HALT</code> (ハルト)が出たら 終了しないといけないんだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/841a4e08b5050abfa210923ba8fae31463d28497a867f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/841a4e08b5050abfa210923ba8fae31463d28497a867f.png?mw=700" alt="202301_excel_26-2246--success-1.png" /></a></p> <pre><code class="vba"> If transitionText = "HALT" Then ' 関数から抜ける OnClock = "SUCCESS" Exit Function End If </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 じゃあ <code>HALT</code> (ハルト)が出たときは セル番地ではなく <code>SUCCESS</code> を返すという取り決めにしておこうぜ」</p> <p><a href="https://crieit.now.sh/upload_images/c564d0d7d0a67a74807f51a08fe8c7e063d285d9d674a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/c564d0d7d0a67a74807f51a08fe8c7e063d285d9d674a.png?mw=700" alt="202301_excel_26-2252--exitFor-1.png" /></a></p> <pre><code class="vba"> ' 正常終了時はループから抜ける If resultCell = "SUCCESS" Then Exit For End If </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 関数の呼び出し元でも 前判定で <code>resultCell</code> 変数の内容が <code>SUCCESS</code> だったら、ループから抜けるようにすれば コードも短いぜ」</p> <p><a href="https://crieit.now.sh/upload_images/fb5cfeec04b8547813467f8277e03b0363d2866e64c44.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/fb5cfeec04b8547813467f8277e03b0363d2866e64c44.png?mw=700" alt="202301_excel_26-2255--play.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 なんか 動いた跡があるな」</p> <p><a href="https://crieit.now.sh/upload_images/fcddc59f9b69d6982a3cfa1957cb583463d286dede709.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/fcddc59f9b69d6982a3cfa1957cb583463d286dede709.png?mw=700" alt="202301_excel_26-2257--QUOTE-Wikipedia.png" /></a></p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://en.wikipedia.org/wiki/Turing_machine">Turing machine</a></p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 👆 Wikipedia のサンプルと違くない?」</p> <p><a href="https://crieit.now.sh/upload_images/28e374907e108dedeadc637e6038f08c63d2896c1f1a6.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/28e374907e108dedeadc637e6038f08c63d2896c1f1a6.png?mw=700" alt="202301_excel_26-2308--copy-paint-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 A列と B列しか 背景色をコピーしてないからな」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 テープの長さと同じ幅だけ コピーしてくれだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 じゃあ テープの長さも 数えておかないといけないな」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 VBA で、自由変数の使い方、または 引数の参照渡しのやり方は どう書くんだろうな?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 ググりゃいいんじゃないの?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 🔍 <code>VBA 引数の参照渡し</code> で検索」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://excel-ubara.com/excelvba4/EXCEL218.html">値渡し(ByVal)、参照渡し(ByRef)について</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 よし 分かったぜ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 ぜったい そんな記事を ちらっと読んでも 何も分からないけどな」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 プログラムの組み方は分かってるが VBA での書き方が分からないだけなんで、ちら見で 充分だぜ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 あれっ? <code>ByRef tapeWidth As Long</code> と書いても 参照渡しになって無(ね)。<br /> 調べても分からないことはある。<br /> 自由変数にするか」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 🔍 <code>VBA グローバル変数</code> で検索」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="http://officetanaka.net/excel/vba/variable/05.htm">変数の適用範囲</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 よし 分かったぜ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 でも 書いているうちに <code>tapeWith</code> というスペルミスを見つけて <code>tapeWidth</code> 直したら動くようになった」</p> <p><a href="https://crieit.now.sh/upload_images/af1d389778a107a54445f1e0442c878963d294a4512f6.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/af1d389778a107a54445f1e0442c878963d294a4512f6.png?mw=700" alt="202301_excel_26-2354--codeA-1.png" /></a><br /> <a href="https://crieit.now.sh/upload_images/b55aa54001335ce25c06ca45f7c876a263d294fddbcb3.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b55aa54001335ce25c06ca45f7c876a263d294fddbcb3.png?mw=700" alt="202301_excel_26-2357--codeB-1.png" /></a></p> <pre><code class="vba">Sub ボタン1_Click() Dim resultCell As String Dim tapeWidth As Long tapeWidth = 1 ' "A1" セル1つ分 ' 1回目の処理 resultCell = OnClock("A1", tapeWidth) ' 同様の i 回目の処理 Dim i As Long For i = 2 To 100 ' 正常終了時はループから抜ける If resultCell = "SUCCESS" Then Exit For End If resultCell = OnClock(resultCell, tapeWidth) Next i End Sub Private Function OnClock(previousCell As String, ByRef tapeWidth) As String ' 毎クロック(n回目のクロック) Dim previousFileAlphabet As String Dim previousRank As Long Dim previousText As String Dim previousBackgroundColor As Long Dim currentRank As Long Dim currentCell As String Dim stateText As String Dim readBackgroundColor As Long Dim writeBackgroundColor As Long Dim moveText As String Dim transitionText As String Dim i As Long previousFileAlphabet = Split(Cells(1, Range(previousCell).Column).Address, "$")(1) previousRank = Range(previousCell).Row currentRank = previousRank + 1 currentCell = previousFileAlphabet & currentRank Debug.Print ("--------") Debug.Print ("previousCell :" & previousCell) Debug.Print ("previousFileAlphabet:" & previousFileAlphabet) Debug.Print ("previousRank :" & previousRank) Debug.Print ("currentRank :" & currentRank) Debug.Print ("currentCell :" & currentCell) Debug.Print ("tapeWidth :" & tapeWidth) ' 開始行の背景色は、次行に引き継ぐ If 2 <= previousRank Then For i = 1 To (tapeWidth + 1) Dim tempFileAlphabet As String Dim tempBackgroundColor As Long tempFileAlphabet = Split(Cells(1, i).Address, "$")(1) tempBackgroundColor = Worksheets("Tape").Range(tempFileAlphabet & previousRank).Interior.color Debug.Print ("i :" & i) Debug.Print ("tempFileAlphabet :" & tempFileAlphabet) Debug.Print ("tempBackgroundColor:" & tempBackgroundColor) Worksheets("Tape").Range(tempFileAlphabet & currentRank).Interior.color = tempBackgroundColor Next i End If previousText = Worksheets("Tape").Range(previousCell).Value ' 開始セルの値 previousBackgroundColor = Worksheets("Tape").Range(previousCell).Interior.color ' 開始セルの背景色 Debug.Print ("previousText :" & previousText) Debug.Print ("previousBackgroundColor:" & previousBackgroundColor) For i = 2 To 7 stateText = Worksheets("StateTable").Range("A" & i).Value ' 状態テーブルのState値 readBackgroundColor = Worksheets("StateTable").Range("B" & i).Interior.color ' 状態テーブルのRead列の背景色 Debug.Print ("stateText :" & stateText) Debug.Print ("readBackgroundColor :" & readBackgroundColor) ' 一致するか? If previousText = stateText And previousBackgroundColor = readBackgroundColor Then writeBackgroundColor = Worksheets("StateTable").Range("C" & i).Interior.color ' 状態テーブルのWrite列の背景色 moveText = Worksheets("StateTable").Range("D" & i).Value ' 状態テーブルのMove列の値 transitionText = Worksheets("StateTable").Range("E" & i).Value ' 状態テーブルのTransition列の値 Debug.Print ("writeBackgroundColor:" & writeBackgroundColor) Debug.Print ("moveText :" & moveText) Debug.Print ("transitionText :" & transitionText) ' `Tape` シートの A1 セルの下のセルの背景色を Write列のいう色に塗る Worksheets("Tape").Range(currentCell).Interior.color = writeBackgroundColor Dim horizontal As Long ' 水平方向 If moveText = ">" Then ' Move 列が `>` だったら その右のセルへ horizontal = 1 ElseIf moveText = "<" Then ' Move 列が `<` だったら その左のセルへ horizontal = -1 End If Debug.Print ("horizontal:" & horizontal) ' Transition 列のいうテキストを入れる Dim previousFileNumber As Integer Dim nextFileAlphabet As String Dim nextFileNumber As Integer Dim nextCell As String previousFileNumber = Columns(previousFileAlphabet).Column nextFileNumber = previousFileNumber + horizontal Debug.Print ("previousFileNumber :" & previousFileNumber) Debug.Print ("nextFileNumber :" & nextFileNumber) If nextFileNumber = 0 Then Worksheets("Tape").Columns("A").Insert ' A 列の左に列挿入 nextFileNumber = nextFileNumber + 1 ' 列番号を 1 つ左へずらす tapeWidth = tapeWidth + 1 ' Update ElseIf tapeWidth < nextFileNumber Then tapeWidth = nextFileNumber ' Update End If nextFileAlphabet = Split(Cells(1, nextFileNumber).Address, "$")(1) nextCell = nextFileAlphabet & currentRank Debug.Print ("nextFileAlphabet :" & nextFileAlphabet) Debug.Print ("nextCell :" & nextCell) Worksheets("Tape").Range(nextCell).Value = transitionText If transitionText = "HALT" Then ' 関数から抜ける OnClock = "SUCCESS" Exit Function End If ' 関数から抜ける OnClock = nextCell Exit Function End If Next i End Function </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 よし <code>tapeWidth</code> も付けたぜ」</p> <p><a href="https://crieit.now.sh/upload_images/91ed806503af3b04a8d5394f6273ba2863d29593358bd.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/91ed806503af3b04a8d5394f6273ba2863d29593358bd.png?mw=700" alt="202301_excel_27-0000--play.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 チューリング・マシンが でけたぜ」</p> <p>📅2023-01-27 thu 00:01</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 <code>HALT</code> は出力しないのが チューリング・マシンみたいよ?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 じゃあ <code>StateTable</code> の <code>Transition</code> 列で <code>HALT</code> を見つけたところで 止めた方がいいのか」</p> <p><a href="https://crieit.now.sh/upload_images/abf090d159ec50ccbce29faabf09177763d297118951f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/abf090d159ec50ccbce29faabf09177763d297118951f.png?mw=700" alt="202301_excel_27-0005--moveCode-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 判定部を 上に持っていけば いいんじゃないかだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/399be2584be9b9b2bba3b35100bb8eea63d29777bbde4.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/399be2584be9b9b2bba3b35100bb8eea63d29777bbde4.png?mw=700" alt="202301_excel_27-0008--copy-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 👆 1行 余分に背景色をコピーしてるわよ?」</p> <p><a href="https://crieit.now.sh/upload_images/a8099b2405cf0ef7b4787895939535d763d29816eaaea.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/a8099b2405cf0ef7b4787895939535d763d29816eaaea.png?mw=700" alt="202301_excel_27-0010--copyB-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 背景色のコピーを、判定部の後ろに持っていけば いいんじゃないかだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/12497135a2ffdac5dce45202516e999e63d2987639a62.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/12497135a2ffdac5dce45202516e999e63d2987639a62.png?mw=700" alt="202301_excel_27-0012--error.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 おっと」</p> <p><a href="https://crieit.now.sh/upload_images/4eaad7541e0323d5f67ce285389749c163d298cfdb63f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4eaad7541e0323d5f67ce285389749c163d298cfdb63f.png?mw=700" alt="202301_excel_27-0013--define-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 変数 <code>i</code> は、外側のループの ループ・カウンターとして使ってたか」</p> <p><a href="https://crieit.now.sh/upload_images/6c2e941fdc56048c2fc58049fa4bec4963d2997f8510f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6c2e941fdc56048c2fc58049fa4bec4963d2997f8510f.png?mw=700" alt="202301_excel_27-0016--J-1.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 じゃあ 変数 <code>j</code> を作ればいいや」</p> <p><a href="https://crieit.now.sh/upload_images/82af7bdc12bd9c36c10effeab11fb3f463d299c572cee.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/82af7bdc12bd9c36c10effeab11fb3f463d299c572cee.png?mw=700" alt="202301_excel_27-0018--ok.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 これで チューリング・マシン は完成だぜ。<br /> 一般化してないのと、不具合が残っているのが 残っているかも知れないが……」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 これは何に使うんだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 この例だと 長さ6のオレンジ色のテープを作るために使ったんだぜ。<br /> 説明しよう」</p> <p><a href="https://crieit.now.sh/upload_images/93785cda8bce3af90e6039ecb8d2546763d29c38ecc54.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/93785cda8bce3af90e6039ecb8d2546763d29c38ecc54.png?mw=700" alt="202301_excel_27-0028--stateTable.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 この <code>StateTable</code> というのが プログラムの命令セットのようなものだぜ。<br /> この6行があると……」</p> <p><a href="https://crieit.now.sh/upload_images/5c1ac565c7d438d3dd496293174b018163d2abc2d36ba.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5c1ac565c7d438d3dd496293174b018163d2abc2d36ba.png?mw=700" alt="202301_excel_27-0134--A.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 最初は <code>A</code> と書かれているが、<br /> <code>A</code> にあんまり意味は無くて 長さ1つの白いテープがそこにあると思えだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/c3bb725a731a2ac9e1f66ccf4f5d211863d29ca67afc6.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/c3bb725a731a2ac9e1f66ccf4f5d211863d29ca67afc6.png?mw=700" alt="202301_excel_27-0030--tape.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 上の図は テープを伸ばしている過程が描かれたもので、<br /> 最後の 13行目が 作られたテープだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 長さ6つのオレンジ色のテープ が作られて 動作が止まったわけだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 長さ6つのオレンジ色のテープ なんか 作っても 嬉しくないしなあ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 今回はサンプルで オレンジ色1色しかなかったが、<br /> それが 26色あって アルファベットの26文字に対応するとか、<br /> 最初から色の塗られたテープがあって チューリング・マシンが動いた後には 別の色のテープが残っているとか、<br /> それが 暗号を解読した答え だったりしたら 嬉しいだろ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 じゃあ <strong>今回の例題</strong> がシンプルすぎて チューリング・マシン が何たるか 嬉しさが 分からないんだ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 <strong>プログラミング言語</strong> が誕生する前の プログラミング 方法だぜ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 私たちが使うのは プログラミング言語 なのだから、懐古好きでもなければ チューリング・マシン を覚えなくてもいいのでは?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 一生のうちに 何回か <strong>チューリング・マシン</strong> とか <strong>チューリング完全</strong> の名前を聞くことはあるだろ。<br /> 記事を読んで知識として知ってるより 作って知ってる方が 話しに実感がこもるだろ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 実感 要らないから 実用的で 効率的な練習 無いのかなあ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 そんな実用的な Webサイト なら、他人が作るしな 」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 プログラムも コンピューターも無い時代に ヒトが考えたプログラムを <strong>体験</strong> するぐらいね」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 もっと面白い例題でやってほしい」</p> <p>参考: 📖 <a target="_blank" rel="nofollow noopener" href="https://github.com/muzudho/TuringMachineByExcelVBA">Git Hub / TuringMachineByExcelVBA</a></p> <p><おわり></p> むずでょ tag:crieit.net,2005:PublicArticle/17403 2021-06-14T17:11:19+09:00 2021-06-14T17:11:19+09:00 https://crieit.net/posts/ExcelVBA-60c70f274bd28 ExcelVBAの基本操作 <p>VBAの準備と計算するものを作りたいと思います</p> <h3 id="準備"><a href="#%E6%BA%96%E5%82%99">準備</a></h3> <p>まず、コードが打てる画面に行く説明をします</p> <p>Excelのリボンに開発がない場合は、<br /> <a href="https://crieit.now.sh/upload_images/4a0ff2247f17fb89da250317dabc930b60c6fc038b6b9.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4a0ff2247f17fb89da250317dabc930b60c6fc038b6b9.png?mw=700" alt="image.png" /></a></p> <p>ファイルをクリックし、オプションを開きます</p> <p>そしてリボンユーザー設定にある開発にチェックを付けOKをクリックすると<br /> <a href="https://crieit.now.sh/upload_images/4a0ff2247f17fb89da250317dabc930b60c6fc3f54989.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4a0ff2247f17fb89da250317dabc930b60c6fc3f54989.png?mw=700" alt="image.png" /></a></p> <p>開発が出てきます<br /> <a href="https://crieit.now.sh/upload_images/4a0ff2247f17fb89da250317dabc930b60c6fcdcba6d0.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4a0ff2247f17fb89da250317dabc930b60c6fcdcba6d0.png?mw=700" alt="image.png" /></a></p> <p>開発のタブにあるVisual Basicでコードを打つことができます<br /> <a href="https://crieit.now.sh/upload_images/4a0ff2247f17fb89da250317dabc930b60c6fd302d2bd.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4a0ff2247f17fb89da250317dabc930b60c6fd302d2bd.png?mw=700" alt="image.png" /></a></p> <p>挿入にある標準モジュールをクリックして準備完了です<br /> <a href="https://crieit.now.sh/upload_images/4a0ff2247f17fb89da250317dabc930b60c6fe3baa7ca.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4a0ff2247f17fb89da250317dabc930b60c6fe3baa7ca.png?mw=700" alt="image.png" /></a></p> <h3 id="今回使うコードの説明"><a href="#%E4%BB%8A%E5%9B%9E%E4%BD%BF%E3%81%86%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E8%AA%AC%E6%98%8E">今回使うコードの説明</a></h3> <pre><code>Sub Calculation() 'ワークシートの追加 Worksheets.Add '今使っているシートの名前を変更 ActiveSheet.Name = "商品" 'セルの変更 Range("A1").Value = "リンゴ" Range("A2").Value = "バナナ" Range("A3").Value = "ミカン" Range("A4").Value = "メロン" Range("B1").Value = "200" Range("B2").Value = "100" Range("B3").Value = "150" Range("B4").Value = "500" Dim a As Integer Dim b As Integer '数字を入力 a = InputBox("リンゴはいくつ買いました?", "リンゴ", "") b = a * Worksheets("商品").Range("B1").Value a = InputBox("バナナはいくつ買いました?", "バナナ", "") b = b + a * Worksheets("商品").Range("B2").Value a = InputBox("ミカンはいくつ買いました?", "ミカン", "") b = b + a * Worksheets("商品").Range("B3").Value a = InputBox("メロンはいくつ買いました?", "メロン", "") b = b + a * Worksheets("商品").Range("B4").Value 'ワークシートの追加 Worksheets.Add '今使っているシートの名前を変更 ActiveSheet.Name = "計算" Range("B2").Value = "合計" Range("C2").Value = b '合計で処理を変更 If b > 1500 Then MsgBox ("たくさん買いました") ElseIf b > 0 Then MsgBox ("買いました") Else MsgBox ("買いませんでした") End If End Sub </code></pre> <p>これを動かすと<br /> <a href="https://crieit.now.sh/upload_images/4a0ff2247f17fb89da250317dabc930b60c70c8b941b6.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4a0ff2247f17fb89da250317dabc930b60c70c8b941b6.png?mw=700" alt="image.png" /></a><br /> 「商品」と名前の付いたワークシートを生成<br /> <a href="https://crieit.now.sh/upload_images/4a0ff2247f17fb89da250317dabc930b60c70baf2b4da.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4a0ff2247f17fb89da250317dabc930b60c70baf2b4da.png?mw=700" alt="image.png" /></a><br /> A1からA4までは商品名<br /> B1からB4までがその値段をセルに記入<br /> <a href="https://crieit.now.sh/upload_images/4a0ff2247f17fb89da250317dabc930b60c70c0f0fa9d.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4a0ff2247f17fb89da250317dabc930b60c70c0f0fa9d.png?mw=700" alt="image.png" /></a><br /> 「(果物名)はいくつ買いました?」<br /> と書かれたウインドウが出現し、数字を入力できる<br /> <a href="https://crieit.now.sh/upload_images/4a0ff2247f17fb89da250317dabc930b60c70c56a54a5.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4a0ff2247f17fb89da250317dabc930b60c70c56a54a5.png?mw=700" alt="image.png" /></a><br /> 「計算」と名前の付いたワークシートを生成<br /> <a href="https://crieit.now.sh/upload_images/4a0ff2247f17fb89da250317dabc930b60c70c6876aa2.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4a0ff2247f17fb89da250317dabc930b60c70c6876aa2.png?mw=700" alt="image.png" /></a><br /> C2に値段の合計を記入<br /> <a href="https://crieit.now.sh/upload_images/4a0ff2247f17fb89da250317dabc930b60c70c34e62bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4a0ff2247f17fb89da250317dabc930b60c70c34e62bc.png?mw=700" alt="image.png" /></a><br /> その後、値段によって文字が違うウインドウが出現する</p> fizz198 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/16425 2020-12-26T12:11:54+09:00 2020-12-26T12:11:54+09:00 https://crieit.net/posts/EXCEL-VBA-SendGrid-WebAPI EXCEL VBAからSendGrid WebAPI経由でメール送信 <h1 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h1> <p>(Qrunch からの移管記事です)</p> <p>タイトルの通り、EXCEL VBAからSendGridのWebAPI経由でメール送信をする方法を記載。<br /> 「WebAPIとか全然わからない」の状態から頑張って送信までできるようにしました。</p> <p>普通はCDO.MessageでSendGridへSMTP通信すればいいだけですが、<br /> ネットワーク構成の都合上「外部へのSMTP通信は不許可、HTTP/HTTPSはOK(ただし認証プロキシあり)」という環境化だったので、WebAPIを利用せざるをえませんでした。<br /> ⇒むしろSendGridにWebAPIがあってよかった。</p> <p>同じような境遇の人がいたら参考にしてください。(いるか?)</p> <h1 id="参考URL"><a href="#%E5%8F%82%E8%80%83URL">参考URL</a></h1> <p>1.VBAでのWEB API<br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/haseshin/items/4acf31db9a672ed691df">https://qiita.com/haseshin/items/4acf31db9a672ed691df</a><br /> 2.VBAでのWEB API & JSON<br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/MakotoIshikawa/items/be902e6bd3fa2e5c5fe5">https://qiita.com/MakotoIshikawa/items/be902e6bd3fa2e5c5fe5</a><br /> 3.SendGridのリファレンス<br /> <a target="_blank" rel="nofollow noopener" href="https://sendgrid.kke.co.jp/docs/API_Reference/index.html">https://sendgrid.kke.co.jp/docs/API_Reference/index.html</a></p> <h1 id="事前作業(SendGridの認証について)"><a href="#%E4%BA%8B%E5%89%8D%E4%BD%9C%E6%A5%AD%EF%BC%88SendGrid%E3%81%AE%E8%AA%8D%E8%A8%BC%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%EF%BC%89">事前作業(SendGridの認証について)</a></h1> <p>「SendGirdのユーザ名とパスワードをどこかで指定するんだろうなぁ」<br /> と思ってたのですが、不要でした。</p> <p>SendGridのポータルサイトからAPIキーを発行してください。<br /> 発行したAPIキーが認証情報になります。</p> <h1 id="実装コード"><a href="#%E5%AE%9F%E8%A3%85%E3%82%B3%E3%83%BC%E3%83%89">実装コード</a></h1> <ul> <li>Sample</li> </ul> <pre><code>Private Sub SendMail() Dim objHTTP As Object Dim json As Variant json = "{""personalizations"":" _ "[{""to"": [{""email"": ""[email protected]""}],""subject"": ""Mail Title""}]," _ """from"": {""email"": ""[email protected]""}," _ """content"": [{""type"": ""text/plain"",""value"": ""Mail Body""}]}" Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP.6.0") With objHTTP .Open "POST", "https://api.sendgrid.com/v3/mail/send", False .setRequestHeader "Content-Type", "application/json; charset=UTF-8" .setRequestHeader "Authorization", "Bearer xxxxYourApiKeyxxxxxxxxxxxxxx" .setProxy 2, "proxyhost.com:9293" .setProxyCredentials "proxyUser", "ProxyPassword" .setOption 2, 13056 .send json If .ResponseText <> "" Then MsgBox .ResponseText Else MsgBox "OK" End If End With End Sub </code></pre> <ul> <li><p>流れ<br /> ・JSON形式でメール設定を定義(細かい内容はリファレンスの「V3 Mail Send API概要」参照)<br /> ・MSXML2.ServerXMLHTTP.6.0オブジェクトの生成<br /> ・POSTメソッドでSendGridのMail Send APIをオープン<br /> ・ヘッダ設定。Content-TypeにJsonの指定。<br />  AuthorizationヘッダにAPIキーをセット。Bearerの指定をお忘れなく。<br /> ・プロキシ設定。setOptionの記述はSSL認証に関するエラー回避。<br /> ・送信。エラーの際にはResponseTextにエラー内容が入っているはず。</p></li> <li><p>補足<br /> ・「xxxxYourApiKeyxxxxxxxxxxxxxx」がAPIキーです。<br /> ・プロキシを経由しない環境であれば「setProxy」、「setProxyCredentials」、「setOption」は省略してください。</p></li> </ul> <h1 id="VBAでのJSONファイルの取り扱い"><a href="#VBA%E3%81%A7%E3%81%AEJSON%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%8F%96%E3%82%8A%E6%89%B1%E3%81%84">VBAでのJSONファイルの取り扱い</a></h1> <p>JSONファイルをVBAでまじめに取り扱うのであれば「VBA-JSON」の利用なども検討してください。<br /> ⇒参考URL3の記事に詳しく記載されています。</p> <h1 id="所感"><a href="#%E6%89%80%E6%84%9F">所感</a></h1> <p>・VBAでのWebAPI利用なんてサッパリだ、の状態からなんとか実現できました。<br /> ・以外にVBA&REST APIの情報がネットに転がっていて助かった…</p> ANA 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