Excelのマクロ【VBAについて学ぶ】

この記事は、[【完走したい】楽しくいろいろやる Advent Calendar 2023](https://qiita.com/advent-calendar/2023/notbeginner)10日目の記事です。
# はじめに
大学生です。大学の講義でVBAについて少しだけ触れました。
なので、その復習とまだ学んでいない部分も学習していきます。
# そもそもVBAとは
Excelのマクロです。excel全般を自動で動かせるようになります。
使いこなせたら結構便利だと思います。ほかの言語と比べると、どんなことをしているのかが直感的にわかりやすい気がします。
![スクリーンショット 2023-11-01 161511.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/9fa4d71d-964a-c6d7-3016-ae3bbf67b57a.png)
開発タブにあります。ないなら、設定から増やせば出ます。
Visual Basic→挿入→標準モジュールで、コードが書けるようになります。
# 本題：VBAの基本
以下の動画をご覧ください

https://twitter.com/Aruhimanahito/status/1722996404564418650

見てもらえばわかるとおり、
```
sub A()
```
と打って、Enterを押すと、
```
End Sub
```
が自動的に出てきて、しかも勝手に小文字を大文字にしてくれました。
Sub　〇〇()の、〇〇の部分がそのマクロの名前になります。
![スクリーンショット 2023-11-01 161511.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/9fa4d71d-964a-c6d7-3016-ae3bbf67b57a.png)
左から2番目のマクロを押してみると、
![スクリーンショット 2023-11-11 001217.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/4f1f30f8-8a50-70dd-727e-e90e7c3d9894.png)
こんな感じで、さっきのAがちゃんと出ます。

基本的に、End Subまでで完結します。
End Subの下に新しいのを作ることもできます。
その場合、前のものと新しいものが区別しやすいように自動で線を引いてくれます。とっても使いやすいです。

VBAでは、使いたい変数をまず宣言します。
基本Dimを使います。大学の講義でも宣言はすべてDimを使ってました。
ちなみに、DimはDimensionの略だそうです。寸法とか、範囲とかいう意味があるそうです。(https://ejje.weblio.jp/content/dimension)
```
Dim　変数名　As 〇〇
```
丸の中は型が入るようです。
# 簡単な動く何かを作る
せっかくなのでなんか作ります。
とりあえず、A1からA10セルにそれぞれ1から10まで入れてみたいと思います。
↓書いたもの
```
Sub A()

Dim Num As Integer
For Num = 1 To 10
Cells(Num, 1) = Num
Next Num


End Sub
```
これで実行すると、A1からA10まで出ました。
### 解説
#### Dim Num As Integer
→NumをIntegerとかいう型として宣言しました。
いつもC#ではint型を使っていましたが、VBAにintはなく、Integerと長い名前を打つ必要があるっぽいです。

#### For Num =1 To 10
→Numが1から10になるまで動きます。
説明は、見ただけでなんとなくわかるので省略します。
For文が()なしで動きます。
↓C#でForを使うとこんな感じです。
```
for(int Num=1;Num<10;Num++){
}
```
全然違うことがわかると思います。

#### Cells(Num,1)=Num
→(Num,1)のセルにNumの中の数字が出ます。
()の中は、(横,縦)です。中にA1とか書いても、エラーが出ます。セルの位置を調べなければならないみたいです。ここはちょっと不便かもしれません。
#### Next Num
→今回はNumが1増えます。それだけ。

↓ちゃんと動いたので載せます。
![スクリーンショット 2023-11-11 010022.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/edf62868-ffeb-7f7a-00de-5ac6626634d7.png)

## 追記　メッセージやグラフも出せる
内容が薄かったのでちょっと足します。
・メッセージボックス
MsgBoxを使って出せます。
```
Sub B()
MsgBox "VBAの勉強"

End Sub
```
MsgBoxの後、出したい文章を""で囲むとできるみたいです。簡単でした。
### 応用
```
Sub C()
Dim Question As VbMsgBoxResult
Dim F As Integer
Cells(1, 1) = Date
Question = MsgBox("今日、朝食を食べましたか?", Buttons:=vbYesNo)
If Question = vbYes Then
MsgBox "回答を記録しました。"
Cells(1, 2) = "〇"
Else
MsgBox "朝食はしっかり食べよう。"
Cells(1, 2) = "×"
End If
End Sub
```
今日朝食を食べたか記録できます。
これをちょっと改変すれば、毎日の朝食記録も作れるでしょう。(まだ知識が足りないけど。)
#### 解説
##### Dim Question As VbMsgBoxResult
→分岐型のものはこの「VbMsgBoxResult」とかいうのを使うっぽいです。

##### Cells(1, 1) = Date
→Dateで日付を表示できるようです。

##### Question = MsgBox("今日、朝食を食べましたか?", Buttons:=vbYesNo)
→質問は、こんな感じで書くみたいです。何のボタンを出すかも選べるみたいです。

##### If Question = vbYes Then 
→Yesの時の処理です。noの時はElseで十分でした。

##### Cells(1, 2) = "〇"
→セル内に文字を入れる場合、""で囲む必要があるようです。メッセージボックスの中の文章同様、ただの文字は""の中に入れる必要があるのかもしれません。

##### End If
→if終わり。
# 最後に
使いこなせれば社会人になった時に無双できると思ってます。（会社で禁止されている場合を除く）。
いい勉強（と復習）になりました。


参考



https://learn.microsoft.com/ja-jp/office/vba/language/concepts/getting-started/declaring-variables

https://www.sejuku.net/blog/32941

大学の講義