Excel VBAに少し触れてみよう!

この記事は[Gizumoエンジニア Advent Calendar 2015](http://www.adventar.org/calendars/919)の21日目の記事です


私は株式会社Gizumoという会社で見習いエンジニアをしています。
IT業界の経験はまだ3ヶ月程度でExcel VBAは10日前に触り始めました。
そんな超初心者の私が超超初心者に向けて書いた記事になります。

###注意
**※私のパソコンにはExcelがない為、この記事の画像は全て｢Visual Basic｣で作成しています。
またそのため遷移や操作方法等は殆ど書いてありません。**

悲しい説明から始まってしまいましたが、この記事を読めば少しはVBAが理解出来る様になります！
また実際に書くことで今日からVBAが必ず使えるようになるはずです。

#はじめに
さて、Excel VBAと聞くと定期的な作業を自動化する時に使うイメージが強いですよね。
もちろん自動化がメインですが、自動化だけではありません。
ダイアログを表示させたり、選択項目を作ったり、Excelでゲーム作ってる~~変な~~凄い人もいます。

自動化出来たら楽だし興味はあるけど、難しいイメージがあったりして触ってこなかった...
この記事はそんな方やVBA自体を知らないような方に少しでも知って貰えたらと思い書きました。

冒頭でも書いたように、私はVBAを触って10日程ですが、思った以上に出来るようになりました。
それは私が天才だから･･･ではなく
ExcelやVBAの情報はとても多く丁重に書いてある記事が溢れています。
また、Excelさえあれば面倒な環境構築も必要ありません。(一部設定が必要な場合もあります)
その為、少し触れてしまえば後は調べながらで大体出来てしまいます！

Excelを使う機会は割とあると思うのでVBAの触りや出来る事を少し知っておくだけでも役に立つはずです。

##Excel VBA 【 Visual Basic for Applications 】
**Excel VBAについて**
>Visual Basic for Applications（ビジュアルベーシック・フォー・アプリケーションズ、VBA）は、
マイクロソフト社製のMicrosoft Officeシリーズに搭載されているプログラミング言語である。

元は**Microsoft Visual Basic**で、それが派生してExcel用に機能が追加や削除された物です。「Applications」という名称が付いてる理由はそこからなんですね～


##VBA使うと何が出来るの？
これ出来るかな？ってイメージ出来るような事は大体出来ると思います。
これは無理だろって事も大体実装できます。

人によってやりたい事も違うので、
出来るかな？の発想を広げる為に一部紹介します。

- セルに文字を入力する
- セルの内容を取得する
- csvファイルから文章を取得する
- 取得した内容を別のセルや別のExcel,csv,txtファイル等に出力する
- Sheet毎に内容をcsvファイル等に出力する
- ダイアログを表示させる
- 条件によって処理を分岐させる→条件を満たすまで印刷出来ない、出力する内容を分岐等
- 条件を満たすまで処理を繰り返す

少し難しいですが、
printscreenを撮る度Excelに貼り付けしていったり、Excel上でメールの送受信なんかも作れます。

他にもXMLやAPIなんかも扱えます。

VBAでは上記のような処理をパズルのように色々組み合わせて作っていくような感じで制作をします。

長くなりましたが次で早速VBAに触れてみましょう！

##マクロの記録

初めて触る場合は、**マクロの記録**を使ってみるのがイメージを掴み易くて良いです。

マクロの記憶では実際にコードを記述する事はありません。
**記録開始から記録終了までの実際の操作を記憶してコードに直してくれます！**
一度記憶したら後は実行するだけで同じ作業を行ってくれます！すごい！！！

記録した後は実際に動かし、ソースコードも見ておきましょう。
初めてでも少しは理解出来ると思います。

##実際に書いてみよう
まずはメッセージボックスを出してみます。
好きな文字を表示･･･と言いたい所ですが･･･
初めてVBAを触る人は**Hello World!**と表示させましょう！
理由はわかりませんが最初は**Hello World!**らしいです。絶対です。

```
1:Sub 初めてのVBA()　　　　
2:    MsgBox "Hello World!"　
3:End Sub
```
上記がVBAのコードになります
これだけでメッセージボックスでHello Worldと表示させる事が出来ます！

**Sub**は処理の開始,**End Sub**は処理の終了だと考えればOKです。
この間に色々記述していく事になります。

「**初めてのVBA**」() の部分はこの処理の名前なので好きに付けて大丈夫です。

「**MsgBox**」がメッセージボックスを呼び出す関数で ” ” の間に表示させたいメッセージを記入します。

では実行してみましょう。

![Helloworld.png](https://qiita-image-store.s3.amazonaws.com/0/104372/f355c4b5-8b0a-c1cf-d348-7dd38680bd0d.png)

メッセージボックスが表示されました！簡単ですね。

これでもうメッセージボックスを表示出来るようになりました！

**MsgBox "Hello World"**⇒この後に文章を追加していけばメッセージボックスに機能を追加する事が出来ます。

```
1:Sub 初めてのVBA()　　　　
2:    MsgBox("Hello World!", vbYesNo, "こんにちは世界")
3:End Sub
```
![msgboxyn.png](https://qiita-image-store.s3.amazonaws.com/0/104372/835a0587-e203-b6ac-3c69-626f086ef44c.png)



「**vbYesNo**」で「はい」「いいえ」ボタンが追加されました。

しかし、これでは「はい」「いいえ」を押下しても**何も動作しません**

「はい」「いいえ」を押下した時の**動作の記述が無い**からです。

では、「はい」の場合と「いいえ」に対しての動作を記述しましょう。

```
1 :Sub 初めてのVBA()
2 :    Dim YesNoBox As Integer
3 :
4 :    YesNoBox = MsgBox("Hello World!", vbYesNo, "こんにちは世界")
5 :
6 :    If YesNoBox = vbYes Then
7 :        MsgBox "はい"
8 :    Else
9 :        MsgBox "いいえ"
10:    End If
11:
12:End Sub
```
急に記述が増えましたね･･･難しいように見えますが一つ一つ見ていけば簡単です。

2行目では、YesNoBoxという整数型(Integer)の変数を宣言しています。
構文は「Dim 変数名 As データ型」
今回はYesNoBoxという名前の整数型(Integer)のデータを出し入れ出来る箱を作ったイメージです。

4行目では、YesNoBoxにMsgBoxを入れています。
なんとなくのイメージで大丈夫です。

6-10行目は分岐処理を記述しています。
わかりやすく説明してみます。

```
6 :    If YesNoBox = vbYes Then  　もし ○○　が　○○　だったら
7 :        MsgBox "はい"　　      　○○を行う　←ここに処理を記述
8 :    Else                　    　それ以外なら
9 :        MsgBox "いいえ"　　　　　○○を行う　←ここに処理を記述
10:    End If　　　　　　　　　　　　条件分岐終了

6 :    もし YesNoBoxの中身｢MsgBox｣で　｢はい｣　が選択されたら
7 :    メッセージボックスで｢はい｣と表示する
8 :    「はい」以外なら
9 :    メッセージボックスで｢いいえ｣と表示する
10:    条件分岐終了
```

急に色々出て来ましたが無理に暗記する必要はありません。
VBAで出来る事が分かり、上記が少しでも理解出来たなら後は書く度に調べましょう。
暗記しても応用する事になるので必ず調べますし、必ず自然と覚えていきます。

ちなみに、VBAは変数を宣言しなくてもいきなり書けます、
便利と思いきや後々面倒くさくなるので宣言はした方が良いらしいです。
自由すぎるのも困るんですね･･･

##ユーザーフォーム
実はダイアログはパズルのように作成することも出来ちゃいます。
VBAメニューバーの三角定規のアイコンにユーザーフォームがあります。

![ユーザーフォーム.png](https://qiita-image-store.s3.amazonaws.com/0/104372/d407bc50-41a6-61a5-c0dd-4114af5dc6c8.png)

こんな感じで見てわかるように、ボタンやコンボボックス等がありマウスで自由に配置出来ます。

では適当に配置してみます。

![GIZUMOアドベント.png](https://qiita-image-store.s3.amazonaws.com/0/104372/4db51cb5-1558-b8ea-9dd9-a10b32381194.png)


めちゃくちゃですが･･･色々有るのを見せたかったんです笑

さて、この配置したボタン達はまだ動作はしません
動かす為にはこいつらに対して動作を記述しなければいけません
さっきの「はい」「いいえ」と同じですね！

では「Button1」を動かしてみます。
まず「Button1」をタブルクリックします

```
Sub Button1

End Sub
```
上記のコードがある入力画面に飛ぶはずです。
もうこのコードは読めますね！

では何か書きます。

```
Sub Button1()
    MsgBox("こんにちは世界")
End Sub
```
先程と同じくメッセージボックス表示の処理を記述しました。
ではButton1を押してみます。

![こんにちは世界.png](https://qiita-image-store.s3.amazonaws.com/0/104372/a296934c-81df-e64a-4ad3-67e9357ee76e.png)

**出ました！**さっきからメッセージボックスばかりですがExcelがないので許してください笑

では、書き方が少しわかってきたところで最後は実行のタイミングについてです。

##マクロの実行タイミング
作成したマクロが開始するタイミング(開始点)の種類について少し紹介します。

**1.オブジェクトに割り当てる**
※オブジェクトとはセルに入力されたデータ以外のもので画像や図形等の事です。

オブジェクトをクリックするとマクロが始まります。
図形でマクロ開始ボタンを作るイメージですね。これはよく使われる気がします。

**2.マクロでマクロを呼び出す**
そのまんまです

```
Sub hoge()
    Call 初めてのVBA
End Sub
```
と書くだけです。
この場合先ほど作ったメッセージボックスを呼び出してます。

**3.シートに割り当てる**
指定したシートに移動すると実行されます。

**4.Excelの開始､終了時に実行する。**
例えば、画面下のツールバーはオプションでは消せませんが、**VBAを使えば消せます。**
画面を広く使いたいブックがあった場合、実行時にツールバーを消すマクロを実行するようにすれば良いですね。

他にも指定したキー入力等で開始させたり、まだまだ色々出来ます。


##最後に
簡単簡単と言いましたが、もちろん複雑な処理をしようとすれば、それなりに難しいです。
今回は殆どメッセージボックスにしか触れていませんが、
今回VBAに触れた事で、ある程度の事なら調べれば理解できるし書けるようになっているはずです！

この記事が少しでもExcel VBAを触るきっかけになれば嬉しいです。

以上です！
最後までご覧頂きありがとうございました。