第37回 VBA会 和風スパゲティ
登壇者:和風スパゲティ
日時 :2022年4月2日
テーマ:脱初心者!メンテナンスしやすいマクロの作り方
Excel A列を縦結合すると、1ページずつスクロールできるってよ
(日本語変数・関数の第一人者!)
(健康診断もちゃんと受けましょう)
むしろ変数名に母国語を使っている人がマジョリティ?
本日のメニュー
1.まずは道具の使い方
まずは画面から。ツールーオプションーエディターの設定で色やフォントを変えられる。
識別子がメインのコードになるので、これを白にしましょう。
次にタブ! TABキーで右に、Shift+TABキーで左に!
これは行範囲でも使えます。
コードの入力補完!
Ctrl+スペースで、入力文字から始まる候補がリストアップされる。
候補が1つしかない場合はリストは出ず、その文字が表示される。
変数宣言の強制!
デフォルトはチェック無し。これは必ずチェックしましょう。
(余談ですが、自動構文チェックは外すの推奨)
チェックしないとね・・・スペルミスしてもエラーにならない。
Option Explicitを付けると、へんすう宣言が強制。宣言されていない変数使うとエラーになる。
変数宣言強制にすると面倒か?
いやいや、さっきのCtrl+スペースが効いてくる。
面倒な変数名付けても自動補完できちゃうから面倒じゃないの。
コメントアウト
編集ウィンドウのコメントブロックで複数行まとめてコメントアウト可能
今日のサンプルマクロの説明
E3セルにコードを入力して請求書出力ボタンを押す。
(和風スパ 印付きやw)
ステップ実行とブレークポイント
(茶色のぽっちはブレークポイント=一時停止場所)
実行するとここで一時停止する。そこでF8キーを押すとステップ(行毎)実行します。
一時停止中の左の黄色い矢印は、ドラッグで上下に動かせる。
ブレークポイントではなくStopでも一時停止する。
If Thenと組み合わせてこんなことも。
イミディエイト
これとdebug.printが強い!
イミディエイトウィンドはこれだけではない!
?コマンドで計算もできるし、変数値の表示もできる。
こんな感じにすると、今から記入しようとしているセルのアドレスが確認できる。
さらに!コードも書ける!
値の代入もできる。
2.ワークシートの指定方法
ボタンを押すマクロで初学者がやりがちなのが全部Activesheet。でもこれはやめましょう。
なにかおかしいときにデバッグモード。一時中断中に他のシートを確認。
あれ?上手くいく・・・それはActiveSheetを変更したから。
一括実行するとやっぱりエラー。こんなことがよくある。
ワークシートオブジェクト名も変更できるよ。当然日本語!
さらに接頭辞を合わせておくと
入力時もCtrl+スペースでリストがでるよ。日本語も入力不要。
さらに!! シートオブジェクト名に . の後の候補もでるんだぜぇぇ!
まとめると・・・コードがこんなに読みやすくなるぜ!
ワークシート変数宣言して代入
これも大事だから使える様にしましょうね。
代入するコード見ると、読込から出力! めっちゃわかりやすいだろ!
さらに変数にする大きなメリットは...ws.copyメソッドが使える!
.copyは新規ブックにこのシートがコピーされる。
残念ながら戻り値がないので、作成後のActivesheetを捕まえる。
ここから書き込みを行えば元の請求書
(そうそう、よっぱおじさんも同じ系紹介してましたよね。)
i,j と R,C
変数名はiとかjと思いこんでませんか?
行列ならR1,R2,C1,C2とかのほうがめっちゃわかりやすいんだぜ!
3.変数の使いどころと説明変数
こんなコードにすると、コメント行が不要になる。これが説明変数!
例えばこのほうが読みやすいでしょぉぉぉ。
今回のDateSerialもこのほうが読みやすい!
データ数の保存とResize
データ数が確定した時点で変数に保存。その後Resize(データ数)などで使うと便利。
4.定数の使い方と超便利定数Enum
例えば定数をConstで定義する。広く使う定数はPublic Constでスコープを広く。Publicは悪じゃない! そもそもConstはPublic Constで使うべきケースの方が多い。
セルアドレスを定数にすると効果大!
ツールで使う変数をConst宣言しておくと・・・
入力時のインテリセンス効くし、説明変数になってコメントも不要。
すごいだろぉぉぉ。
本来はFunction定義するのがよいが中級者はそこまでやらなくてもOK。
Enum・・本日のメインイベント
まずは箱作り。CNo.は列番号
シート上の見出しをそのままコピーして縦にならベル。
ここでイミディエイト。Enum名の後に . を入力するとメンバー名をくれる。
2しか代入していないのに全部連番で入ってるぅぅぅぅぅ!!
さらに、縦にしてから2列コピーするとVBE上でタブまで入るんだぜ。
みんなこんなコメント付けてるだろ?
連番じゃない請求書は一つずつ設定する。
どうだ、これでリーダブルゥゥゥゥ!
一度Enumにしてしまえば、わざわざシートの列番号確認する必要ナッシングゥゥゥ!
さらに! 「月日の隣に曜日を追加して」って言われたら・・
Enum追加するだけぇぇぇ
スパさんブログ
は、コチラ。