いつもお疲れ様です!なのです!
ある程度Excelに慣れてくると、
「そろそろVBA使えるようにしたいな~」
「自動化したいな~」
と思いますよね
だけど、
「最初って何がわからないのかわからない」
「何から始めたらいいのかわからない」
って方多いと思います。
実は私もあまり使ったことがありません。。
。。。衝撃
なんなら勉強中の身でございます。
こんな私がなぜ今回VBAについて書こうと思ったか
それは、
- まだ使えないからこそ丁寧に紹介できるのではないか
- 自分のアウトプットのため
これが理由です。
なので、
かなり初心者向けの発信にはなりますが、一緒に習得していきましょう!
VBAとは
ざっくりとですが、VBAとは言語です。
PythonやC言語といったような意味ですね。
VBAはマイクロソフトオフィスで使えるプログラミング言語になります。
VBEの環境設定
VBAと似た言葉のため、ちょっと整理します。
ただし、言葉の意味などはそれほど重要ではありません。
なので、覚えなくても全然かまいませんし、
何度もエクセルにVBAを書いたりしていれば自然とやるようになります。
VBAとVBEの違い
VBA(ヴィジュアル・ベーシック・アプリケーションズ)
→プログラミング言語
VBE(ヴィジュアル・ベーシック・エディター)
→プログラミング言語を書く環境
VBEの開き方
では、VBEというエディターを開く方法をお伝えします。
ほとんどの方が開いた経験がないと思います。
私も、VBAをやるまでは、マクロは聞いたことがあるけど、
どこに書けば良いのかすらわかっていませんでした。
VBEの開き方は2種類あります。
①Excelのメニューバーから開く方法
”開発”タブに、VBEを開くボタンがありますが、
最初から”開発”タブが選択できる状況の人は少ないです。
まずは開発タブを選択できるようにしましょう!
ファイル→オプション→リボンのユーザー設定→開発にチェックを付ける
→開発タブをクリック→Visual Basicをクリック
開発タブが選択できるようになりますので、OKボタンをクリックしてください。
Visual Basicをクリックすると、VBEが開きます。
②短縮キーから開く方法
Alt + F11を押してください。Altを押しながらF11を押せばOKです。
短縮キーの方が圧倒的に楽なので、短縮キーで覚えた方が良いです。
会社で使うPCや会社でいつも使っているPCじゃないと、
開発タブを毎回設定しなくてはいけない・・・
VBEおすすめ環境
VBEを開くと、こんな画面が出てきます。
この状態で書き始めても良いのですが、使い続けていくうちに変更を絶対にします。
おすすめのVBE環境は下の画像です。
アレンジした内容
- イミディエイトウィンドウを追加
- ローカルウィンドウを追加
- タスクバーの「編集」を追加
- 文字色の変更
以下で、使い方について解説します。
イミディエイトウィンドウ
イミディエイトウィンドウは、デバッグをするときに使います。
また、Stopをかけた状態で変数が何を取得しているかを調べるときにも使います。
ローカルウィンドウ
ローカルウィンドウは、変数のステータスを確認するときに使っています。
イミディエイトの方が使う頻度は高いかもしれませんが、
ローカルウィンドウを基準にイミディエイトウィンドウを活用したりもするので、
非常に重要なウィンドウです。
コードウィンドウ
コードウィンドウに実際に書き込む項は、もうちょっと先にします。
まずは設定と言うところにフォーカスして、文字色の変更や背景色の変更をします。
とりあえず、標準モジュールを立ち上げてください。
コードウィンドウの文字色の変更
エディターの設定タブを押してください。
タスクバーの「編集」の機能と追加方法
編集はコメントアウトの時に使うだけです。もとに戻すときにも使います。
表示されていた方が楽なので使いやすさをお伝えします。
VBAの書き方
さて、いよいよVBAをVBEに書き込むところまで来ました。
しかし、どこに書き込めばよいのかわからないですよね?
まずは、どこに書き込むのかを説明していきます。
VBAを書き込むモジュールについて
モジュールとは、
VBEというノートに一枚一枚織り込まれている紙だと思ってもらえば良いと思います。
その紙にも種類があり、適正な種類の紙を選択していく必要があります。
なんか難しそうだなぁ~って思わなくて大丈夫です。
「標準モジュール」くらいしか最初のうちは使いません。
モジュールの種類は複数あるが、標準モジュールを覚えておけば十分
標準モジュールの追加方法
こんな感じで、簡単です。場所を覚えるまでが大変だと思います。一緒に頑張ってみましょう。
SubとFunctionの違いについて
モジュールの書き方が分かったら、モジュール内のルールについて確認しておきましょう。
Subには2種類の宣言方法がある
厳密に言うと3種類ですが、2種類にまとまります。
2種類の違いは、「公開」と「限定公開」に分類されるイメージです。
PublicとPrivateの違い
Public Sub(パブリックサブ)とSub(サブ)は、「公開」
Private Sub(プライベートサブ)は、「限定公開」
こんなことを言ってもわかりにくいので、ちょっとした例を出します。
4つの宣言をしています。
エクセルに移って、開発→挿入→ボタンをクリックして、ボタンを作成してください。
ドラッグするだけでも良いですし、ダブルクリックでも作れます。
ボタンの作成方法
すると作成前に、ポップアップが出てきます。
Private Subで宣言した「ddd」が出てきません。
後々いやでも覚えるので、基本は「Public Sub」を使用しておけば問題ありません。
PublicとPrivateの違い
限定公開の「ddd」がマクロの指定に出てこない。
Functionは、関数のイメージ
SubとFunctionの違いは、返り値があることです。
Subだと返り値を受け取ることができません。
しかし、Functionでは受け取ることができます。
最初はそこまで使わないと思いますので、
Functionがあるということを覚えておいていただければ大丈夫です。
SubとFunctionの違い
返り値がある!Excelの関数と同じような働きと思っていればOK!
ちょっと練習してみましょう
練習問題に最適なのはどんなのかなぁ?と思ったんですが、
英語と同じように頻出単語というのがVBAにもあります。
なので、まずは良く使われるコードの理解をしてから、
VBAを学ぶきっかけにもなっているであろう
ビジネスなどへの応用をしやすいコードで進めてみましょう。
よく使うコードのまとめ
今回紹介したいコードは2つあります。
IFとForというコードですが、何を言っているのかわからない。と思っても全然平気です。
IFは、分岐。Forは、ループ。
そんなキーワードを頭においてこの先を読んでみてください。
IFの使い方
IFのコードの使い方は簡単です。
とりあえず、
IF文はこんな形であると認識しておいてください。
If 条件式 Then
実処理記入
End If
条件式には種類がありますが、プログラミングの用語をそのまま覚えるのではなく、
日本語の文章だと思ってやってみたら簡単に覚えられると思います。
Forの使い方
For文はこんな形であると認識しておいてください。
For カウントを実行する変数のセット = 開始数 To 終了数
実処理記入
Next カウントを実行する変数
ループの実行はForだけではありませんが、一旦一つだけの方が分かり易いと思いますので、
基本はForで組み立てられるかを考えてみると作りやすいです。
初級者入門に向けた練習問題に挑戦!
何かと汎用性が高いであろうと思う練習問題を用意しました。
もちろん、これで覚えられるなんて思わないほうがいいです。
初めの一歩として、
こんな感じという感覚を身につけられたらいいかなと思います。
練習問題のチェックポイント
IFとForの感覚をつかんでほしい!
標準モジュールに対してのSubの役割をイメージしてほしい!
Functionの使い方は覚えなくて良い!
あまりごちゃごちゃ言っても最初は覚えきれないと思います。
なので、
こんな感じかという感覚をつかんでいきましょう!
ステップ1:動作を確認
特定の列から特定の値を探して特定の値に書き換える
①ボタン1をクリック
②ポップアップウィンドウが開く
③テキストボックスに検索したい値を入力
④「OK」
⑤検索した値の代わりに入力するワードをテキストボックスに入力
⑥「OK」をクリック
⑦メッセージボックスが表示されて処理が終了
というのが、表面の動きになります。
A列に書き込まれていること。
そして、5行目から始まっていることを覚えておいてください。
さて、では裏側の解説に行ってみましょう!
上記のような動作になるためのコード解説になります。
VBAコードの説明
では、ここから裏側の解説になります。
VBAのコードを日本語で読み上げてみると、
- 検索ワードと置換ワードをメッセージボックスで確認して、
- 最終行までのループを実施して、
- 検索ワードに一致していた時に置換ワードに置換する!
となります。
いっぺんにコードを見てもわからない部分が多いと思いますので、先に分割して説明します。
これから4分割されたそれぞれの担当部門が登場します。
最終的には全体のコードを作っていきますので、そのコードを標準モジュールに入れてみてください。
第一段階の説明
とりあえず、変数には型などがあります!
Stringは、文字列
Worksheetは、ワークシート
Integerは、整数(小さい方)
'===============================================================================
'==第一段階===モジュール全体で使う変数はここで宣言できる!
'===============================================================================
'===============================================================================
Dim SearchStr As String '探す値の変数
Dim SubstitutionStr As String '代入する値の変数
Dim MasterWs As Worksheet '使用するワークシートの設定
Dim lastrow1 As Integer '最終行の取得
モジュールの一番最初で変数を宣言すると、そのモジュール全体で使えます。
第二段階の説明
宣言した変数に、格納していきます。
'===============================================================================
'==第二段階===第一段階の変数を整えるときに使うことが多い!
'===============================================================================
'===============================================================================
Private Sub 初期設定()
'ワークシートの設定
Set MasterWs = Worksheets("実運用シート")
'最終行を取得
lastrow1 = MasterWs.Cells(Rows.Count, 1).End(xlUp).Row
End Sub
格納するだけであり、
初期設定と書いているのでイメージできているとは思いますが、補助的なSubです。
補助的なSubはボタンに登録したくないので、Privete Subで宣言しております。
第三段階の説明
役割は、メインコードです。
'===============================================================================
'==第三段階===実コード、本筋のコードになる
'===============================================================================
'===============================================================================
Public Sub 探して代入の処理()
Dim looprun1 As Integer
Dim cnt1 As Integer
Dim MsgStr As String
Dim IntStr As String
Call 初期設定
cnt1 = 0 'カウンターを戻す
'探す値を確定
MsgStr = "探す値を入力してください" 'InputBoxで表示させるステータスを表示
SearchStr = 値を返す(MsgStr)
MsgStr = "" '空白に戻しておく
'代入する値を確定
MsgStr = "代入する値を入力してください" 'InputBoxで表示させるステータスを表示
SubstitutionStr = 値を返す(MsgStr)
MsgStr = "" '空白にしておく
'実際に処理を開始
For looprun1 = 5 To lastrow1
IntStr = MasterWs.Cells(looprun1, 1).Value
If IntStr = SearchStr Then
MasterWs.Cells(looprun1, 1).Value = SubstitutionStr
cnt1 = cnt1 + 1
End If
Next looprun1
MsgBox SearchStr & "の値を" & SubstitutionStr & "に置換しました。" & Chr(10) & "実際に、処理した件数:" & cnt1 & "件"
End Sub
ここで、初期設定をお願いしたり、どういうシナリオなのかを明記している部分になります。
ボタンに登録したいので、Public Subで宣言しております。
第四段階の説明
'===============================================================================
'==第四段階===ファンクションは返り値があるのを覚えておいて!
'===============================================================================
'===============================================================================
Function 値を返す(MsgStr As String)
値を返す = InputBox(MsgStr)
End Function
正直、Functionの使い方としては簡単すぎますが、
頻出するタイプのものであれば、Functionはめちゃくちゃ便利です。
検索ワードと置換ワードを引っ張らなくてはいけないので、
同じコードを2回書いても良いんですが、面倒ですよね?
そんな時にFunctionを使っておけばめちゃくちゃ楽です!
コードの全体
'===============================================================================
'==第一段階===モジュール全体で使う変数はここで宣言できる!
'===============================================================================
'===============================================================================
Dim SearchStr As String '探す値の変数
Dim SubstitutionStr As String '代入する値の変数
Dim MasterWs As Worksheet '使用するワークシートの設定
Dim lastrow1 As Integer '最終行の取得
'===============================================================================
'==第二段階===第一段階の変数を整えるときに使うことが多い!
'===============================================================================
'===============================================================================
Private Sub 初期設定()
'ワークシートの設定
Set MasterWs = Worksheets("実運用シート")
'最終行を取得
lastrow1 = MasterWs.Cells(Rows.Count, 1).End(xlUp).Row
End Sub
'===============================================================================
'==第三段階===実コード、本筋のコードになる
'===============================================================================
'===============================================================================
Public Sub 探して代入の処理()
Dim looprun1 As Integer
Dim cnt1 As Integer
Dim MsgStr As String
Dim IntStr As String
Call 初期設定
cnt1 = 0 'カウンターを戻す
'探す値を確定
MsgStr = "探す値を入力してください" 'InputBoxで表示させるステータスを表示
SearchStr = 値を返す(MsgStr)
MsgStr = "" '空白に戻しておく
'代入する値を確定
MsgStr = "代入する値を入力してください" 'InputBoxで表示させるステータスを表示
SubstitutionStr = 値を返す(MsgStr)
MsgStr = "" '空白にしておく
'実際に処理を開始
For looprun1 = 5 To lastrow1
IntStr = MasterWs.Cells(looprun1, 1).Value
If IntStr = SearchStr Then
MasterWs.Cells(looprun1, 1).Value = SubstitutionStr
cnt1 = cnt1 + 1
End If
Next looprun1
MsgBox SearchStr & "の値を" & SubstitutionStr & "に置換しました。" & Chr(10) & "実際に、処理した件数:" & cnt1 & "件"
End Sub
'===============================================================================
'==第四段階===ファンクションは返り値があるのを覚えておいて!
'===============================================================================
'===============================================================================
Function 値を返す(MsgStr As String)
値を返す = InputBox(MsgStr)
End Function
最後に
いかがでしたか?
今の時点では、なんとなくの理解ができればいいかなと思います。
もう少しレベルアップしたいのであれば、
自分でVBEを開いて、本記事にあるコードをそのまま貼り付けて実行してみてください。
最初は、コードをパクるところからはじめて、
実際に動作を確認してみることで、
だんだんコードの意味も理解できるようになってきます!
向上心と好奇心の高い方はぜひ、試してみてほしいです!
コメント