そもそもVBA(Visual Basic for Application)とは
これまでPHP、Laravel、Python(と少しだけJava)を少し勉強してきた中であまり聞いたことのないような謎方言や謎文化が時々出てくるので集めてみた~その壱~
※以下の文にあるコードは、基本Subプロシージャ(指定した操作を実行する基本的なマクロ)に用いるものであり、冒頭のSub マクロ名()と末尾のEnd Subは省略してあります。
①「解放」=「削除」(+「エクスポート」)
details
上記Qiitaの通り、VBE(VBAのエディター)を開いて、挿入 ⇒「~モジュール」を開くと
以下のような画面が出てきますが、例えば無駄なモジュール追加しちゃった場合、
最初削除どこにあるん??(´。`)??ってなりました。
結論:Moduleの解放 ⇒ 「エクスポートに関するアラートウィンドウ」⇒「いいえ」を選択
なお、エクスポートというのは、そのVBAのファイルを「.bas」という拡張子でダウンロードしたり書き出したりするようなもので、ここで「はい」を選ぶと、大元の Excel とは別にファイルができることを指します。よく考えたら、Googleドキュメントとかも印刷しようとすると、出てきますがたぶんあれと同等です。
②「入力支援機能」=「VBA 独特のショートカットキー」
details
例(1)VBEと一般的なエクセルの画面の切り替え
(VBEを開いた後)Alt + F11
例(2)入力候補一覧表示(その頭文字から始まるメソッドとかオブジェクトとかの一覧表示)
(何らかの頭文字を入力した後)Ctrl + Space
※選択時にTab ⇒ 選択した物がコードウィンドウ(コード書くところ)に入力されてカーソルがその右横の続きにくる
※選択時にEnter ⇒ 選択した物がコードウィンドウ(コード書くところ)に入力されてカーソルが改行された位置に来る
なお、数文字入力した途中で候補にあたるものが1つに絞られる場合、残りの文字を自動で補完してくれる
👆現役の人からすると当たり前かも知れないですが個人的にこれはかなり便利だと思いました
____
例(3)メソッドや関数などに関する引数の情報の表示
(関数やメソッド入力後、そこの行にカーソルを合わせて)Ctrl + 「l(アイ)」
例(4)関数やメソッドの「引数」の候補の表示
(関数やメソッド入力後、そこの行にカーソルを合わせて)Ctrl + Shift + 「J(ジェイ)」
なお、例えば以下のような引数の「デフォルト値」「フォーマット」のようなものをVBAでは「設定値」と呼ぶこともあるようです。
③論理エラー
コンパイルエラーとなるような文法上の間違いがなく、エラーメッセージなども表示されないにも関わらず思うような処理結果にならないようなエラー
④リセット(ボタン)
details
VBEを開いた状態でマクロを実行する「再生」マーク「▷」ボタンの2つ右にある停止マーク「□」ボタン
実行時エラー(Javaの実行時エラーに近い、オブジェクトに対するプロパティやメソッドの指定が間違っている場合や、マクロの中で指定されているシートが存在しない場合などに発生)になって実行時エラーウィンドウが出てきた場合に、デバッグ(ボタン)をクリックすると、エラーの原因部分に黄色マーカーがつくが、その「黄色マーカーをリセット(=コンパイルをリセットしているものと思われます。)」する
※押してもエラーが修正されるわけではない
⑤変数名として平仮名や漢字などをつけることもできる(※以下のルールに従えば全角もいける)
details
ルール1:英数字・漢字・平仮名・カタカナ・アンダーバー(※VBAではアンダースコアと呼ぶ)「_」で構成(※ハイフン「-」は使えない)
ルール2:先頭に数字は使えない
ルール3:変数名の長さは、半角255文字以内
※一応、多言語同様に予約語もいける
※ここの「Dim」は Javascript でいうところの let や var、PHPでいうと変数名前につける「$」に相当する
' String型の変数として「文字」という名前の変数を利用することを宣言
Dim 文字 As String
' 変数「文字」にアクティブシートのシート名を代入
文字 = ActiveSheet.Name
' A1セルに、変数「文字」の内容を入力
Range("A1").Value = 文字
' メッセージウィンドウに変数「文字」の内容を表示
MsgBox "A1セルのデータは、" & 文字 & "です"
⑥オブジェクト型変数:ブックやセルなどのオブジェクトの参照情報(位置情報)を代入する変数
details
「Dim 変数名 As オブジェクトの種類」という書式で宣言
なお、代入するときも「変数名 = 代入するオブジェクト」ではなく、
「Set 変数名 = 代入するオブジェクト」という書式で代入する
' Worksheetオブジェクト型の変数として「シート」を利用することを宣言
' なお代入されるのは、値ではなくオブジェクトの参照情報(位置情報)
Dim シート As Worksheet
' 変数「シート」にアクティブシートの参照情報を代入
Set シート = ActiveSheet
' 新しいシートを変数「シート」の後に追加
Worksheets.Add After:=シート
' メッセージウィンドウに『変数「シート」の名前シートのあとに追加しました。』というメッセージが出るようにする
MsgBox シート.Name & "シートのあとに追加しました"
' 変数「シート」を選択
シート.Select
' 変数の参照情報を解放(※意味的にはJavaのメモリリーク防止のための解放と同じように思われる)
Set シート = Nothing
⑦メソッド(※オブジェクトに紐付いたもの)の引数は()で囲まないのに、VBA特有の関数(以後、VBA関数と呼ぶ、オブジェクトに紐付いていない)の引数は()で囲むときがある
※MsgBoxはVBAの関数の1つであり、メッセージ(ウィンドウ)を表示するだけの場合は、引数を()で囲む必要はない(他のVBA関数と組み合わせる場合は()を用いる)
⑧ Excelの表計算で数式タブから使用する関数(SUM や VLOOLUP等)をワークシート関数というが、の中には、ワークシート関数と名前が同じでも機能が若干異なるものがある
details
例1、DATE関数(ワークシート関数)とDate関数(VBA関数)
details
ワークシート関数のDATE関数:どの日時でも指定できる。なお、引数で指定した物を表示する
※出力結果はD1やC2にあたる通り
VBA関数のDate関数:今日の日付の「情報を取得する」
※あくまで表示するのは以下のコードではMsgBox関数
' Date関数で今日の日付を取得
MsgBox "今日は" & Date & "です。"
' Date関数で今日の日付を取得し、それをMonth関数の引数として渡す。
MsgBox "今日は、" & Month(Date) & "月です"
なお、Dateは〇〇〇〇/✕✕/△△で出力され、Monthは数値で出力されるので表示形式を変える場合は、Format関数を用いる。
例2、ROUND関数(ワークシート関数)とRound関数(VBA関数)
details
ワークシート関数のROUND関数:指定した桁数(第二引数)に対して、小数などの数値(第一引数)を世間一般的四捨五入で四捨五入した値を返す(例えば、0は小数第1位で四捨五入、-1は1の位で四捨五入)
VBA関数のRound関数:指定した桁数(第二引数)に対して、小数などの数値(第一引数)を「銀行型方式の四捨五入」で「四捨五入」した値を返す
「銀行型の四捨五入」:処理した結果が偶数にならない場合は、その四捨五入の処理を切り捨てに切り替える
例 銀行型方式で、2.5と3.5を「四捨五入」した場合
2.5 → 3ではなく2、3.5 → 4 (※もともと四捨五入した結果偶数のため)
' 2が出力されたウィンドウが出てくる
MsgBox(Round(2.5))
⑨ 文字列の連結は「+」ではなく「&」など、あまり他の言語では使わない演算子記号を用いるときがある
details
①割り算の結果の整数部を返すのは「バックスラッシュ\(半角¥)」
' 割り算の結果の整数部をメッセージ(ウィンドウ)で出力
MsgBox (7 \ 3)
②割り算の結果の余りを返すのは「%」ではなく「Mod」
※Modは「合同式」とググると出てきます
' 割り算の結果の余りをメッセージ(ウィンドウ)で出力
MsgBox (7 Mod 3)
③べき乗「^」はスペースを挟まないとコンパイルエラーになる
' べき乗の結果をメッセージ(ウィンドウ)で出力
' 7^3だとコンパイルエラーになる。(スペースを空けないといけない)
MsgBox (7 ^ 3)
※注意:数式だけだと、以下のようなPythonのコードと異なりコンパイルエラーとなる
#Pythonだとこれはインタラクティブシェルなどで「2」が出力される
7//3
⑩PHP、Python等と同様ヒアドキュメントのようなもの(「行継続文字」)はあるが、書式が何かで囲む方式ではない
details
例えば、PHP、Pythonのヒアドキュメント(改行やスペースなどを含めた文字列をそのままの状態でソースコードの中に埋め込むために使われる手法、PHPだとSQLを埋め込むのに使ったりする)はそれぞれ以下のように書く。
〇Pythonの場合
@ykhirao(yk)さんのQiitaを引用 https://qiita.com/ykhirao/items/c7cba73a3a563be5eac6
〇PHPの場合
公式ドキュメントより https://www.php.net/manual/ja/language.types.string.php
一方 VBAの場合、行末で半角スペースと「_」を入力したあと、Enterを押して改行する。
※以下の2行目と3行目で1つのコードのまとまり(ステートメントと呼ぶ)
' A1セルのデータの左から7文字目までをアクティブシートの名前にする
ActiveSheet.Name = _
Left(Range("A1").Value, 7)
主な参考資料
①今すぐ使えるかんたん Excel マクロ&VBA 技術評論社 門脇香奈子 著
②スピードマスター エクセル自動化 VBAサンプル100 コピってイジってすぐ使える 技術評論社 今村ゆうこ
③HITACHI Inspire the Next RPA業務自動化ソリューション【コラム】VBAとマクロの違いとは?VBA・マクロができること、マクロの作り方を徹底解説!
https://www.hitachi-solutions.co.jp/rpa/sp/column/rpa_vol26/
④エクセルの神髄( ExcelとVBA の入門解説)
Excel および マクロ VBA 全般について入門解説から上級者に役立つ技術情報まで幅広く発信しているサイト。GAS、Python、SQLといった関連情報も載っている
https://excel-ubara.com/
⑤最初からそう教えてくればいいのに! PythonでExcelやメール操作を自動化する ツボとコツがゼッタイにわかる本 立山秀利 著 秀和システム社
⑥確かな力が身につくPython「超」入門 第2版 (確かな力が身につく「超」入門) 鎌田正浩 著 SB creative社