<超初心者向け>VBAの基礎からひと通りできるようになるまで
※このnoteは「Excelはある程度わかるけど1秒でも早くVBA使いたいです!」という方向けに初心者がある程度かみ砕いて画像多めで解説していくスタイルです
はじめに
お久しぶりです。スズです。 今回は「未経験者だからこそ大事な技術」を書いた後に触ったVBAについてnoteで残しておこうと思います。 自分自身、SHIFTに入社してからほぼ初めての状態でVBAに触れる機会があったのですが「そもそも何から始めればいいんだ?」からスタートした身です。様々なサイトだったり本を眺めて、最終的には先輩にかなりお世話になりました。 恐らく聞ける環境が整っていなければどうしたらいいのループから一生抜け出せずにいました。
ということで今回は 「このnoteを見れば、知識0だったけどなんとかやっていけそう」くらいまでを目標にゆるゆる書いていきます。
とても時間がない方:📸スクリーンショット📸辿ればいけるはず。
ちょっと時間がある方:📸スクリーンショット📸+太字を辿ると最低限の知識はさらえます。
ちゃんと時間がある方:全て読んで頂けるとある程度の自立はできると思います。
そもそもVBAってどんなことができる?
一言でいうと 「Excel上で決まった作業を自動的にやってもらえる」 という感じです。 じゃあ何ができるの?基本なんでもできます。 セルへの入力はもちろん、コピペやシートの追加、さらには新しいブックの作成まで。 人間的な創造力が必要なもの以外は指示すれば基本やってくれます 。
0. Excelのオプションから「開発」を追加する
まずは準備編。「開発」がなくてはそもそもVBAなんてはじまりません。早速追加しましょう。Excelを開いたら
①オプション>②リボンのユーザー設定>③☑開発>④OK
ワークシートの画面で「開発」のタブが出現したら準備は完了です。最低限ここまで完了していればとりあえずVBAは始められます。ようこそ。
1. ファイルの形式を.xlsxから.xlsmへ変換する
実際にVBAに触れてみるには、それ専用のファイルが必要です。 マクロを有効にするためにはExcelのファイル形式にしていきます。 私はVBAを使用するファイルを作成する際は以下手順より.xlsmファイルを作成しています。
ファイルタブをクリックしたら以下の順番でファイルを保存します。
①名前を付けて保存>②任意の保存場所>③ファイル名決定>④Excel マクロ有効ブック(*.xlsm)>⑤保存
これで心置きなくスタートできます。おめでとうございます。
2. VBAの作業場へいく
わかりやすく作業場と書きましたが、正しくは「Visual Basic Editor」です。Altキー+F11キー、もしくは 開発タブのVisual Basicを押すと出てきます。
さて、ここが作業場です。ここにいろいろ書いていくことになりますが、最初は「Sub Sample()」を入力し、Enterを押してみてください。自動で下に「End Sub」が出てくると思います。
この囲まれた部分に作業内容を書いていきましょう。 ここの「Sample」の部分は英語でも日本語でも、何でもいいです。その作業に対しての名前を命名してあげる場所になります。Sampleの部分は他人が見ても何をするための作業なのかがわかるようになるのがベストかなと思います。
Subってなんだ?という方もいらっしゃると思いますがそれは「4. Subの話とFunction(プロシージャ)」で説明しますね。とりあえず「Sub ●●()」を覚えてください。
3. 実際にコードを書いてみる
例えばこんな感じで書きます。やりたい内容を上から順番に書いていくだけです。 ただこれ以降、プログラミング未経験者でもわかりやすくいうと、代入が基本ということを念頭に置いておいてください。以下は見本ですが、私自身も完全にマスターしているわけではないので、あくまでも「初心者でもこれくらいはできるようになる」くらいに思ってください。
最初のConstとDimの説明だけしておきますね。
~~~~~
Const ●● = "〇〇" …定数
絶対に何が何でも値・文字列が変わらないもの。後に触れますがデータ型の宣言をすることもでき、省略もできます。
Dim ●● As 〇〇…変数
データ用の入れ物だけは用意しておくから実際の値は実行してから確認してね、となるもの。〇〇の部分には、どんなデータが入るのか(データ型)を宣言する必要があります。 データ型の種類は検索をお勧めします。(じゃないとこの記事がとんでもないことになる)
ただ、VBA特有のデータ型である「Variant型」だけは紹介させてください。(今回の見本にないのはどうぞお許しをmm)
Variant型とは
簡単に言うと「どんなデータ型でも対応します」というタイプのエリートです。そのため数値であっても文字列であっても対応してくれます。ただし、そんなエリートのメリットは 「基本どんなデータ型でも対応できる」、デメリットは 「予期せぬデータに仕上げちゃう可能性がある」、「実行のスピードが、ほんの少し落ちてしまう」 という覚えておいてください。
例を挙げると虹に矢印が向けられたイラストと共に文字で「これは何色?」と質問があったとき。
あなたはどう答えますか?「7色」と答えますか?それとも矢印の先にある「赤色」と答えますか?日本語特有の例を挙げてみましたが、今の質問は「数を聞いているのか種類を聞いているのか」がわからないと答えられないと思います。Variant型は常にそういう状態にあるということを覚えていてあげてほしいです。
~~~~~
それ以外なんとなくやっていることは見えるでしょうか?基本的な書き方としては 「●● = (場所).(属性)」 もしくは 「●● .(場所)=(どうしたい)」 という感じです。
ここの(どうしたい)の表現方法は私もわからなくなることがあるので遠慮なくWeb検索します。シートの複製方法を知りたければ「VBA シート複製」などで調べると教えてくれます。
そして実際にコードを書いていくとたまに「私いま何してるんだっけ?」と迷子になりますので行頭に(')を入力してから作業内容を書いておきましょう。(コメントアウト)
※コメントアウト…コード自体には影響しないがメモとして残せる。
4. 書いているものは正しく動く?動作確認方法
コードを書いているだけでは正しく動くかなんてわかりません。動作確認をしなくては! ということで以下の4つは最低限使えるようにしてください。
①ステップイン:一行ずつ実行させる堅実なやつ(F8キー)
F8キーを押すたびに実行されていきます。実行する行は左側に➡がつく&行の色が変わるのでわかりやすいと思います。実行中はカーソルを当てると出てきたデータの内容を見ることもできます。画像は「Q2Answer」にカーソルを当ててる時のスクリーンショットです。
②Sub/ユーザーフォームの実行:最初からブレイクポイントまでを一瞬で実行する(F5キー)
上部の▶ボタンからも実行できます。もしブレークポイントがなければそのSub内の最後まで実行されます。
③ブレークポイント:ここから重点的に見たい!という場所をマークする
赤いハイライトになっている状態の場所です。行を選択してF9キー、もしくは画像の●が書いている場所をクリックするとマークできます。
④イミディエイトウィンドウ:コード中に「Debug.Print(変数)」を入れたときに値を出してくれるウィンドウ
見本としてQ2の答えとして取り出した行番号をイミディエイトウィンドウに表示させました。イミディエイトウィンドウ自体は「表示」タブから選択すると登場します。
ここでは上記使い方のほか、かなり可能性に満ちた場所となっております。私もここは研究中なので是非いろいろと研究してみてほしいです。
ちなみに作成したコードが変だとエラー画面が表示されて教えてくれます。エラー内容によっては「デバッグ(D)」というボタンがあります。躓いた場所を表示してくれるのでそれを参考に修正していきましょう。
5. SubとFunctionの話(プロシージャ)
先に「プロシージャ」について触れておきます。「塊なんだなぁ」くらいで覚えてください。VBAでは作業の流れ部門と 詳しい作業内容部門に分けて書くので、それぞれの部門を「プロシージャ」と呼ぶのねオッケーくらいであらかた何とかなります、初めのうちは。
そんなプロシージャは大きく分けて2つあります。それがSubとFunctionです。ざっくりいうと 「返り値が欲しいかどうか」 ですが、それぞれの特徴を私的に言い換えるのであればこんな感じです。
なぜプロシージャを分けるのか?私なりのメリットを考えてみました。
最初の方に見本として掲載したコードもプロシージャを分けるこうなります。
プロシージャ分けメリット
全体の流れが見やすくなる
ひたすら作業を羅列して書いていると、いくらコメントアウトを使用しても「どこまでがどの作業なのか」が見えづらくなってしまいます。プレゼン資料等でも最初にアジェンダを表示させますよね。少し違うかもしれませんがそんなイメージです。
同じ作業を繰り返し記載せずに済む
見本として載せているものは本当に短く済むものを厳選しましたが、長いときはもっと長いです。コピペすればいいじゃーん!と思うかもしれませんが、もし仮にその作業内容に変更が生じると何度も同じ修正をする必要が出てきてしまいます。
SubとFunctionの違い
Sub:作業してくれるだけでいい
呼び出したいSubの名前の前に「Call」をつけるだけでその作業を行ってくれます。
ちなみにSubはSubでももう1つ、Private Subがあります。この辺は初心者の頃は考えなくても良い気がする、というのが私の見解です。深いことは話しません。
Funtion:行った作業で出てきた答えが欲しい
オリジナルの関数を作るみたいなイメージです。以下の例でいうと、「FindRow(文字)」というオリジナル関数を作っており、これを実行するとA列内で文字を探し出し、行番号を返してくれるという内容のものです。
6. 作成できたは良いけどどうやって実行させる?
せっかくここまでできてもわざわざEditorに入ってF5を押して…なんてやっていると何のための効率化なんだ?となります。ここでは1番ベーシックな方法として 「Excelシート上にボタンを設置する」 を載せておきます。その他も使える方法はいくつかありますが、初めのうちはこれだけでも覚えてください。
ボタンの名称の変更はCtrlキーを押下しながらボタンクリックしてオブジェクトを選択、ボタン内の文字をクリックすると編集できるようになるのでそこから変更できます。
おしまい。
今回の内容は「このnoteを見れば、知識0だったけどなんとかやっていけそう」を目標としているのでちょっと物足りないなぁと思うかもしれません。むしろ最低限ここまで理解ができれば、あとは検索しながらでも自力でコーディングをしていくことはできるでしょう、というところまでスズ流に解説してみました。
もしどうしても分からない!となった場合は「マクロの記録」で実際の動きを表現して、コードを確認する方法もアリです✨書き方等結構勉強になります。
VBAの本質は「作業をいかに効率化できるのか」を考えてから実装する必要があると私は考えています。「たくさん時間をかけたのに数回しか使わない」などせっかく作ったのに全然使えるものになりませんでした、という悲しい結果にならないことも念頭に将来の自分たちの負担を軽くしてあげられるものを作ってみてください。
おまけ
超初心者向けに、今回使ったコードたちの解説載せておきます。
Sub Sample()
Const Q2Text = "Q2"
Const Q3Text = "2枚目"
Dim Q2Answer As Long
' ------------------------------------
' Q1の処理
' …セルB3にQ1Textに割り当てられた定数を入力する
' ------------------------------------
Cells(3, 2).Value = "Hello, VBA World"
' Cells(行番号,列番号)の順番での入力。
' 行番号=3、列番号=2(つまりB列)-> Cells(3,2)はセルB3を表している
' ------------------------------------
' Q2の処理
' …変数Q2Answerに行番号を入れて、セルB6に入力する
' ------------------------------------
' 変数Q2Answerに答えとなる行番号を入れる
Q2Answer = Columns(1).Find(Q2Text).Row
' Columns(1) -> 1列目 で
' .Find(Q2) -> 見つけてね、Q2Textと定義した内容を
' .Row -> 見つけたらその行番号を教えてね
' ということで「Q2Answer」という変数には見つけた行番号が割り当てられる
' セルB6にQ2Answerの内容を入力する
Cells(6, 2).Value = Q2Answer
End Sub
ではまたいつか!
お問合せはお気軽に
SHIFTについて(コーポレートサイト)
SHIFTのサービスについて(サービスサイト)
SHIFTの導入事例
お役立ち資料はこちら
SHIFTの採用情報はこちら