※このQiitaは、『今すぐ使えるかんたん Excel マクロ&VBA 技術評論社 門脇香奈子 著』を主参考書として、VBAの学習を進めたときの備忘録です。※今後、仕事で利用するにあたり、社外秘でないもので尚且つ有用性高そうなものは更新します
そもそもVBA(Visual Basic for Application)とは
とりあえず、ベテラン勢からすると基本的な物かもしれないが使用頻度が自分が勝手に高そうと思ったオブジェクト、プロパティ、メソッド、イベントを挙げていってみる
※注意1:VBAでは、引数のところに()をつけないことに注意。
※注意2:名前の通りVBAはVBから派生した物らしいです
※注意3:アクティブ「~」は開いている Excel において何らかの部分が選択されている状態を指す。
※注意4:VBA&マクロにおけるオブジェクト:Python等におけるオブジェクトと同義、ここでは大きい順に(~オブジェクトは省略)
Application \supset Workbook(ブック)\supset Worksheet(シート)\supset Range(「セル」)\\\
\supset \lbrace Font(フォント),Interior(塗りつぶし),Border(罫線),・・・ \rbrace
※少し勉強した感覚としては、Python のGUI化のための標準ライブラリー(pip や poetry でインストールしなくても import できるライブラリー)の tkinter にコードの書き方が似ているように感じました。
Subプロシージャで使うもの
※Subプロシージャ:指定した操作を実行する基本的なマクロ(Subから始まり、End Subで終わるもの)
①Range("取得したいセルの座標(A1等)") :どのオブジェクトを「アクティブ」とするかの指定
A1セルの情報を取得して、Valueプロパティにおはようの文字を入力
Range("A1").Value = "おはよう"
B4×C8の長方形部分のセル情報を取得
Range("B4:C8")
A1セルをC1セルにコピーする
Range("A1").Copy Range("C1")
' 後者のRangeは Copyの引数(ここではコピー先)
② .Select(メソッド):Rangeでアクティブにしたオブジェクトの「選択」
アクティブセル(※選択中のセル)が別である状態から、(同一)C2セルを選択されている状態にする。
Range("C2").Select
③ .Add(メソッド):引数に従いワークシートを追加する。※最大4つの引数があるが、必要ない物は省略可能(そこはおそらくデフォルト値になる)
Worksheets.Add 第1引数(Before),第2引数(After),第3引数(Count),第4引数(Type)
① Before シートの追加先を指定。指定した場所の前にシートを追加する
② After シートの追加先を指定。指定した場所のあとにシートを追加する
③ Count 追加するシートの数を指定。省略時は、1とみなされる
④ Type 追加するシートの種類を指定
※オブジェクトとしてWorksheets以外の指定も参考資料①によるとありうる。
※追加するシートの場所は、Before または After で指定。Before と After の両方を省略すると、アクティブシートの前にシートが追加される
アクティブなシートのブック内に $n$ 枚シートを追加する。( Worksheetsは全てのワークシートを示す。)Addメソッドを使用して「Sheet1」の前にワークシートを $n$ 枚追加
Worksheets.Add Worksheets("Sheet1"), , n
「テスト」シートの前にシートを $n$ 枚追加する
Worksheets.Add Before:=Worksheets("テスト"),Count:=n
または
Worksheets.Add ,Worksheets("テスト"),n
※下はAdd のすぐ後ろに 「,」があることに注意 ※これは第1引数を省略することを表す。
④ Msgboxメソッド(メソッドというよりは関数?)
※メッセージウィンドウモーダルを出現させる。Pythonでいうところのimport tkinter.messagebox as msg
response = msg.メッセージダイアログメソッド
#メッセージダイアログメソッド例 askokcancel('メッセージタイトル(枠端に表示)','メッセージ内容')
で出てくるメッセージボックスに近い(※↑はPythonです)
「こんにちは」と書かれたメッセージボックスを出す
MsgBox "こんにちは"
A1セルを示すオブジェクトのValueプロパティに設定した値をMsgBox関数を使ってメッセージを表示
MsgBox Range("A1").Value
⑤.Interior:Rangeでアクティブにしたセルの塗りつぶしに関する書式の変更に用いるオブジェクト
Rangeで情報を取得したセルの「(背景の)塗りつぶしの色」を「塗りつぶしなし」にする
With Range("~").Interior
.Pattern = xlNone
.TintAndShade = 0
.PatternTintAndShade = 0
End With
Rangeでアクティブにして情報を取得しセルの「(背景の)塗りつぶしの色」をつける
With Range("~").Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 1234567 '数字を変えると色が変わる
.TintAndShade = 0
.PatternTintAndShade = 0
End With
なお、上のように「同じオブジェクト」についての指示をまとめて書くときは、With ~ End With で挟む(With Statement)と楽かつ、可読性が高い
⑥ .Font:その名の通り Range でアクティブにしたセルのサイズや太文字、罫線などを含むフォントの変更に用いるオブジェクト
A1セルをRangeで選択したあと、A1セルのフォントを「MSPゴシック、サイズを18、太文字、下二重罫線」に変更
With Range("A1").Font
' フォントを変更する
.Name = "MSPゴシック"
' サイズを「18」にする
.Size = 18
' 太字をオンにする
.Bold = True
' 下二重罫線を引く
.Underline = _
xlUnderlineStyleDoubleAccounting
' ↑xの隣は「エルの小文字」
End With
⑦ .Clearcontents(メソッド):Rangeでアクティブにしたセルに入力してあるデータを消去する
Rangeで取得したA1セルのデータの消去
Range("A1")
.ClearContents
RangeでB4×C8の長方形範囲を複数選択して、一括データ消去
Range("B4:C8").Select
Selection.ClearContents
⑧ Offset(引数1,引数2):Range(セル)のプロパティ、指定したセルに対して相対的な位置で別のセルを指定するときに用いる
※注意:第1引数が「$y$ 軸方向の負の方向への「相対的な」移動」、第2引数が「$x$ 軸方向の正の方向への「相対的な」移動」
最初に選んだセルをA1とした場合に、右に1、下に2移動した位置に「実験」という文字列が入力されるようにする。
ActiveCell.Offset(2, 1).Range("A1").Select
ActiveCell.FormulaR1C1 = "実験"
ActiveCell.Characters(1, 2).PhoneticCharacters = "ジッケン"
ActiveCell.Offset(1, 0).Range("A1").Select
※PythonでExcel自動処理化するための外部ライブラリー「openpyxl」の使用感とかもまた追記します。
とりあえず、以下でインストール※Anaconda使わずとも、VScodeのpowershellとかでも可能
pip openpyxl
主な参考資料
①今すぐ使えるかんたん 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社