VBA学習備忘録②　個人的Excel マクロ　チートシート①

※このQiitaは、『今すぐ使えるかんたん　Excel マクロ＆VBA　技術評論社 門脇香奈子　著』を主参考書として、VBAの学習を進めたときの備忘録です。※今後、仕事で利用するにあたり、社外秘でないもので尚且つ有用性高そうなものは更新します
<details><summary>Amazonリンク</summary>

https://www.amazon.co.jp/%E4%BB%8A%E3%81%99%E3%81%90%E4%BD%BF%E3%81%88%E3%82%8B%E3%81%8B%E3%82%93%E3%81%9F%E3%82%93-Excel%E3%83%9E%E3%82%AF%E3%83%AD-Office-Microsoft-365%E5%AF%BE%E5%BF%9C%E7%89%88/dp/4297129701/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=87AM31OPUPGU&keywords=%E4%BB%8A%E3%81%99%E3%81%90%E4%BD%BF%E3%81%88%E3%82%8B%E3%81%8B%E3%82%93%E3%81%9F%E3%82%93+excel+%E3%83%9E%E3%82%AF%E3%83%AD%26vba+%E6%8A%80%E8%A1%93%E8%A9%95%E8%AB%96%E7%A4%BE+%E9%96%80%E8%84%87%E9%A6%99%E5%A5%88%E5%AD%90+%E8%91%97&qid=1705239199&sprefix=%E4%BB%8A%E3%81%99%E3%81%90%E4%BD%BF%E3%81%88%E3%82%8B%E3%81%8B%E3%82%93%E3%81%9F%E3%82%93+excel+%E3%83%9E%E3%82%AF%E3%83%AD+vba+%E6%8A%80%E8%A1%93%E8%A9%95%E8%AB%96%E7%A4%BE+%E9%96%80%E8%84%87%E9%A6%99%E5%A5%88%E5%AD%90+%E8%91%97%2Caps%2C281&sr=8-3
</details>

<h2>そもそもVBA（Visual Basic for Application）とは</h2>

https://qiita.com/thinking-weed/items/b322d1e34b888aa3ca22

<h2>とりあえず、ベテラン勢からすると基本的な物かもしれないが使用頻度が自分が勝手に高そうと思ったオブジェクト、プロパティ、メソッド、イベントを挙げていってみる</h2>

**※注意１：VBAでは、引数のところに（）をつけないことに注意。**

**※注意２：名前の通りVBAはVBから派生した物らしいです**

**※注意３：アクティブ「～」は開いている Excel において何らかの部分が選択されている状態を指す。**

**※注意４：VBA＆マクロにおけるオブジェクト：Python等におけるオブジェクトと同義、ここでは大きい順に（～オブジェクトは省略）**

```math
Application \supset Workbook（ブック）\supset　Worksheet（シート）\supset　Range（「セル」）\\\
\supset \lbrace Font（フォント）,Interior（塗りつぶし）,Border（罫線）,・・・ \rbrace
```

<h4>※少し勉強した感覚としては、Python のGUI化のための標準ライブラリー（pip や poetry でインストールしなくても import できるライブラリー）の tkinter にコードの書き方が似ているように感じました。</h4>

<h2>Subプロシージャで使うもの</h2>

※Subプロシージャ：指定した操作を実行する基本的なマクロ（Subから始まり、End Subで終わるもの）

<h3>①Range("取得したいセルの座標（A1等）") ：どのオブジェクトを「アクティブ」とするかの指定</h3>

A1セルの情報を取得して、Valueプロパティにおはようの文字を入力
```vb
    Range("A1").Value = "おはよう"
```

B4×C8の長方形部分のセル情報を取得
```vb
    Range("B4:C8")
```

A1セルをC1セルにコピーする
```vb
    Range("A1").Copy Range("C1")   
'   後者のRangeは Copyの引数（ここではコピー先）
```

____

<h3>② .Select（メソッド）：Rangeでアクティブにしたオブジェクトの「選択」</h3>

アクティブセル（※選択中のセル）が別である状態から、（同一）C2セルを選択されている状態にする。
```vb
    Range("C2").Select
```

____

<h3>③ .Add（メソッド）：引数に従いワークシートを追加する。※最大４つの引数があるが、必要ない物は省略可能（そこはおそらくデフォルト値になる）</h3>

```vb
    Worksheets.Add 第１引数(Before),第２引数(After),第３引数(Count),第４引数(Type)
```

①　Before シートの追加先を指定。指定した場所の前にシートを追加する
②　After　シートの追加先を指定。指定した場所のあとにシートを追加する
③　Count　追加するシートの数を指定。省略時は、１とみなされる
④　Type　 追加するシートの種類を指定

※オブジェクトとしてWorksheets以外の指定も参考資料①によるとありうる。
※追加するシートの場所は、Before または After で指定。Before と After の両方を省略すると、アクティブシートの前にシートが追加される

アクティブなシートのブック内に $n$ 枚シートを追加する。（ Worksheetsは全てのワークシートを示す。）Addメソッドを使用して「Sheet1」の前にワークシートを $n$ 枚追加

```vb
    Worksheets.Add Worksheets("Sheet1"), , n
```

「テスト」シートの前にシートを $n$ 枚追加する
```vb
    Worksheets.Add Before:=Worksheets("テスト"),Count:=n
    または
    Worksheets.Add ,Worksheets("テスト"),n
```
※下はAdd のすぐ後ろに 「,」があることに注意　※これは第１引数を省略することを表す。
___

<h3>④ Msgboxメソッド（メソッドというよりは関数？）</h3>
※メッセージウィンドウモーダルを出現させる。Pythonでいうところの

```python
import tkinter.messagebox as msg

response = msg.メッセージダイアログメソッド
#メッセージダイアログメソッド例　askokcancel('メッセージタイトル（枠端に表示）','メッセージ内容')
```
で出てくるメッセージボックスに近い（※↑はPythonです）

____

「こんにちは」と書かれたメッセージボックスを出す
```vb
    MsgBox "こんにちは"
```
A1セルを示すオブジェクトのValueプロパティに設定した値をMsgBox関数を使ってメッセージを表示
```vb
    MsgBox Range("A1").Value
```
___

<h3>⑤.Interior：Rangeでアクティブにしたセルの塗りつぶしに関する書式の変更に用いるオブジェクト</h3>

Rangeで情報を取得したセルの「（背景の）塗りつぶしの色」を「塗りつぶしなし」にする
```vb
    With Range("～").Interior
        .Pattern = xlNone
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
```

Rangeでアクティブにして情報を取得しセルの「（背景の）塗りつぶしの色」をつける
```vb
    With Range("～").Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 1234567    '数字を変えると色が変わる
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
```
<h3>なお、上のように「同じオブジェクト」についての指示をまとめて書くときは、With　～　End With で挟む（With Statement）と楽かつ、可読性が高い</h3>

____

<h3>⑥ .Font：その名の通り Range でアクティブにしたセルのサイズや太文字、罫線などを含むフォントの変更に用いるオブジェクト</h3>

A1セルをRangeで選択したあと、A1セルのフォントを「MSPゴシック、サイズを18、太文字、下二重罫線」に変更
```vb
    With Range("A1").Font
        '    フォントを変更する
        .Name = "MSPゴシック"

        '    サイズを「１８」にする
        .Size = 18
            
        '    太字をオンにする
        .Bold = True

        '　　下二重罫線を引く
        .Underline = _
            xlUnderlineStyleDoubleAccounting
        '    ↑xの隣は「エルの小文字」
    End With
```
____

<h3>⑦ .Clearcontents（メソッド）：Rangeでアクティブにしたセルに入力してあるデータを消去する</h3>

Rangeで取得したA1セルのデータの消去
```vb
Range("A1")
    .ClearContents
```
RangeでB4×C8の長方形範囲を複数選択して、一括データ消去
```vb
Range("B4:C8").Select
    Selection.ClearContents
```
___

<h3>⑧ Offset（引数１,引数２）：Range（セル）のプロパティ、指定したセルに対して相対的な位置で別のセルを指定するときに用いる</h3>

**※注意：第１引数が**「$y$ 軸方向の**負の方向への**「相対的な」移動」、**第２引数が**「$x$ 軸方向の正の方向への「相対的な」移動」

最初に選んだセルをA1とした場合に、右に１、下に２移動した位置に「実験」という文字列が入力されるようにする。
```vb
    ActiveCell.Offset(2, 1).Range("A1").Select
    ActiveCell.FormulaR1C1 = "実験"
    ActiveCell.Characters(1, 2).PhoneticCharacters = "ジッケン"
    ActiveCell.Offset(1, 0).Range("A1").Select
```

<h3>※PythonでExcel自動処理化するための外部ライブラリー「openpyxl」の使用感とかもまた追記します。</h3>
とりあえず、以下でインストール

※Anaconda使わずとも、VScodeのpowershellとかでも可能

```powershell
pip openpyxl
```


<h2>主な参考資料</h2>

①今すぐ使えるかんたん　Excel マクロ＆VBA　技術評論社 門脇香奈子　著
<details><summary>Amazonリンク</summary>

https://www.amazon.co.jp/%E4%BB%8A%E3%81%99%E3%81%90%E4%BD%BF%E3%81%88%E3%82%8B%E3%81%8B%E3%82%93%E3%81%9F%E3%82%93-Excel%E3%83%9E%E3%82%AF%E3%83%AD-Office-Microsoft-365%E5%AF%BE%E5%BF%9C%E7%89%88/dp/4297129701/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=87AM31OPUPGU&keywords=%E4%BB%8A%E3%81%99%E3%81%90%E4%BD%BF%E3%81%88%E3%82%8B%E3%81%8B%E3%82%93%E3%81%9F%E3%82%93+excel+%E3%83%9E%E3%82%AF%E3%83%AD%26vba+%E6%8A%80%E8%A1%93%E8%A9%95%E8%AB%96%E7%A4%BE+%E9%96%80%E8%84%87%E9%A6%99%E5%A5%88%E5%AD%90+%E8%91%97&qid=1705239199&sprefix=%E4%BB%8A%E3%81%99%E3%81%90%E4%BD%BF%E3%81%88%E3%82%8B%E3%81%8B%E3%82%93%E3%81%9F%E3%82%93+excel+%E3%83%9E%E3%82%AF%E3%83%AD+vba+%E6%8A%80%E8%A1%93%E8%A9%95%E8%AB%96%E7%A4%BE+%E9%96%80%E8%84%87%E9%A6%99%E5%A5%88%E5%AD%90+%E8%91%97%2Caps%2C281&sr=8-3
</details>

②スピードマスター　エクセル自動化 VBAサンプル100　コピってイジってすぐ使える　技術評論社　今村ゆうこ

<details><summary>Amazonリンク</summary>

https://www.amazon.co.jp/%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC-%E3%82%A8%E3%82%AF%E3%82%BB%E3%83%AB%E8%87%AA%E5%8B%95%E5%8C%96-VBA%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB100-%E3%82%B3%E3%83%94%E3%81%A3%E3%81%A6%E3%82%A4%E3%82%B8%E3%81%A3%E3%81%A6%E3%81%99%E3%81%90%E4%BD%BF%E3%81%88%E3%82%8B-%E4%BB%8A%E6%9D%91-%E3%82%86%E3%81%86%E3%81%93-ebook/dp/B0BTCM43GT/ref=sr_1_4?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3ZNXZDE69UB9&keywords=%E4%BB%8A%E6%9D%91%E3%82%86%E3%81%86%E3%81%93&qid=1705481528&sprefix=%E4%BB%8A%E6%9D%91%E3%82%86%E3%81%86%E3%81%93%2Caps%2C232&sr=8-4
</details>

③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やメール操作を自動化する　ツボとコツがゼッタイにわかる本　立山秀利　著　秀和システム社

<details><summary>Amazonリンク</summary>

https://www.amazon.co.jp/%E4%BB%8A%E3%81%99%E3%81%90%E4%BD%BF%E3%81%88%E3%82%8B%E3%81%8B%E3%82%93%E3%81%9F%E3%82%93-Excel%E3%83%9E%E3%82%AF%E3%83%AD-Office-Microsoft-365%E5%AF%BE%E5%BF%9C%E7%89%88/dp/4297129701/ref=sr_1_13?crid=MN161L425MW7&keywords=excel+%E3%83%9E%E3%82%AF%E3%83%AD+vba&qid=1705932478&sprefix=Excel+%E3%83%9E%E3%82%AF%E3%83%AD%2Caps%2C219&sr=8-13
</details>

⑥確かな力が身につくPython「超」入門 第2版 (確かな力が身につく「超」入門)　鎌田正浩　著　SB creative社　

<details><summary>Amazonリンク</summary>

https://www.amazon.co.jp/%E7%A2%BA%E3%81%8B%E3%81%AA%E5%8A%9B%E3%81%8C%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8FPython%E3%80%8C%E8%B6%85%E3%80%8D%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E7%A2%BA%E3%81%8B%E3%81%AA%E5%8A%9B%E3%81%8C%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8F%E3%80%8C%E8%B6%85%E3%80%8D%E5%85%A5%E9%96%80-%E9%8E%8C%E7%94%B0-%E6%AD%A3%E6%B5%A9/dp/4815613729/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2QWFRN76M4ZK9&keywords=python+%E8%B6%85%E5%85%A5%E9%96%80&qid=1705932839&sprefix=python%E8%B6%85%E5%85%A5%E9%96%80%2Caps%2C226&sr=8-1
</details>