みなさん、こんにちはケンケンです。
エクセルVBA入門編も3回目になりました。
前回までの復習はできていますか。
みなさん、こんにちはケンケンです。 業務改善の基本とは何だと思いますか? いろいろ答えはあるでしょうが、僕がこの問いに答えるとしたら 考えること! だと思います。 ど[…]
さて、今回は、前回書いていただいたコードを解説していきます。
For Next構文の解説が中心になります。
これをマスターすれば、エクセルの世界がぐっと広がることは確実です。
今シリーズでは請求書作成を自動化することを最終目標にしていますので、がんばっていきましょう。
変数って何だろう
For Next構文の解説をする前に、変数についてお話しします。
みなさん変数はご存知ですか。
プログラミングの勉強をしていると出てくるのが「変数」という概念です。
変数とは何かを出し入れできる「箱」のようなものだと考えてください。
この箱の中には「値」とか「文字列」とかを入れておくことができ、自由に出し入れできます。
ここで、前回書いていただいたコードをご覧ください。
1 2 3 4 5 6 7 8 |
Sub kunimei() Dim kuni For kuni = 2 To 7 Worksheets.Add after:=Worksheets(Worksheets.Count) ActiveSheet.Name = Worksheets("Sheet1").Range("A" & kuni) ActiveSheet.Range("A1").Value = Worksheets("Sheet1").Range("A" & kuni) Next End Sub |
2行目に「Dim kuni」という部分がありますね。
VBAでは、これから変数を使いますよ、という場合に「変数の宣言」をしなければなりません。
それが、「Dim」の部分です。読み方は「ディム」です。
まずこの「Dim」で変数を使うことを宣言し、半角スペースを空けて変数名を入力します。
今回は、国名を判別するための変数として「kuni」と名付けました。
漢字やカタカナも変数名に使えますが、一般的ではないのでアルファベットのほうが良いでしょう。
また、変数の名付け方は法則のようなものがけっこうあるので、ご興味のある方は調べてください。ここでは割愛します。
後で見直したときに分からなくならなければ基本的に問題ありません。
さて、変数の宣言までできましたので、今度はこの変数を使っていきましょう。
■変数を使ってメッセージボックスを表示してみよう
それでは、宣言した変数に「日本」という文字列を入れてメッセージボックスを表示させてみましょう。
コードは以下のようになります。VBEへコピペしてください。
1 2 3 4 5 |
Sub hoge() Dim kuni kuni = "日本" MsgBox kuni End Sub |
このコードを一行ずつ実行していきましょう。
一行ずつ実行する方法はSub~EndSubの間にカーソルをもっていき「F8」を押せばできます。
ちなみに「F8」で一行ずつ実行する方法をステップインと言います。
では画像をお見せしながら変数の動きを解説していきます。
一度F8を押すと黄色の帯がでてきますね。
この帯がかかった行を実行していきます。という意味です。
では、このままF8を押していきましょう。
上記の行に来た時に変数「kuni」にカーソルを合わせてみましょう。
すると「kuni = Empty 値」というメッセージが出ます。
これは、今現在変数kuniには値が何も入っていません。という意味です。
この状態でもう一度F8を押してみましょう。
するとどうですか、変数kuniに日本という文字列が挿入されていますね。
これで、晴れて変数に文字列を格納することができました。
ちなみに、「kuni = “日本”」の「=」は代入演算子ですのでご注意ください。
そこまでできたら、もう一度F8を押してください。
すると
メッセージボックスが開いて、「日本」という文字列が表示されましたね。
いかがでしょうか。
変数の意味と格納の仕方をご紹介しました。
次項ではこの変数を使い、For Next構文を紐解いていきます。
この記事を読み終わったときには、意外に自動化って簡単にできるな。
という感覚になっているのではないでしょうか。
最強ツールFor Next構文
それでは、前回書いたFor Next構文を読み解いていきましょう。
もう一度コードの全体を表示しておきます。
まず、For Next構文の公式を確認しましょう。
上記のようになります。
ForとNextの間にある処理を初期値から最終値まで繰り返します。
ちなみに、最後のNextが漏れてエラーがでてしまうことがよくあります。
For Next構文を書き始めたらNextまで書いてから繰り返したい処理を書くようにしましょう。
■For Nextを使う最初のステップ
For Nextを使う場合の最初のステップとして重要なのは、
一つ目の処理ができるか?ということです。
逆に言うと一つ目の処理ができれば、あとはそれを繰り返すFor Next構文にあてはめればいいだけです。
一つ目の処理は大事です。
それを踏まえて、例を使ってFor Next構文の書き方をひとつずつ解説していきます。
上記のようにFor Nextを使ってA1セルからA10セルまで連続した数字を入力するコードを書いてみましょう。
最初のステップとして、一つ目の処理を書いていきます。
一つ目の処理とは「A1セルに数字の1を入力する」ということです。
では、コードを書いていきます。
新しいプロシージャrensyu1を作ってみました。
そこに、Range(“A1”).value = 1と入力しました。これは、連続してA10まで入力するための最初の一歩になります。
F5で実行してA1セルに「1」が入ることを確認してください。
一つ目の処理ができれば、あとは構文の公式にしたがって繰り返すだけです。
これ以降の方法は以下の画像をご覧ください。
まず、変数を宣言しておきます。
今回は数字をカウントするための変数として変数名を「cnt」としました。COUNTを短縮した名称でけっこう使います。
ちなみに、VBEにはコメントを書くことができます。シングルクォーテーションのあとに書いた文字はコードとして認識されなくなるので、開発の備忘録や他者が見たときに分かりやすくするためにコメントを残せます。
さあ変数も宣言しましたので、For Next構文を書いていきましょう。
この構文はForからNextを一気に書き切ってください。先ほども言いましたが、Nextを書き損ねてエラーがでてしまうと後で修正するのに手間がかかるときがあるので先に書いちゃいましょう。
初期値と最終値は1行目から10行目までなので「1 to 10」とします。
次は、繰り返す処理を書いていきますが、これは、さっき最初の処理として書いた
Range(“A1”).value = 1
を使います。
使い方にもコツがあるのでご紹介します。
ここで字下げについてお話しします。
「Tab」で字下げした箇所がありましたね。
字下げはインデントと言われるもので、コードを書くときの段落を付けるときに見やすくするものです。
インデントしているコードは上記のように読みやすくなるので、意識して使っていきましょう。
さて、これでFor Next構文の中に処理をコピーできましたが、当然これで終わりではありません。
コピーした処理の部分を変数に対応させて繰り返せるようにコードを変更していきましょう。
ここでも、ひとつずつじっくり解説していきます。
まず、どこに変数を入れるべきでしょうか。
セルを1~10まで順番に繰り返すのですから、
Range(“A1”)の「1」の部分に1~10まで数字が循環していけば良さそうですね。
では、「1」に「cnt」を代入して、Range(“Acnt”)とすれば良いかというとそうではありません。
Rangeオブジェクトは行と列で分けないと変数を受け付けてもらえないので、まず(”A1″)の部分を二つに分けます。分け方は
(”A” & 1)
となります。A列と1行目を&で分けて表現しています。
そして、上記で分けた「1」の部分に変数「cnt」を代入していきます。
(”A” & cnt)
となりますね。
では、これをコードに反映して実行してみて下さい。
どうですか。
A1からA10まで繰り返しの処理ができましたね。
これが繰り返し処理の方法ですが、ひとつ問題があります。
すべてのセルに入力された数字が「1」になってしまってますね。
これは、セルは1から10まで数字が順番に代入されて繰り返し処理ができましたが、
入力すべき数字が「1」のままですね。
つまり、コードの右辺「=1」の部分も繰り返し処理をするために変数を代入する必要があります。
これを踏まえた完成形のコードがこちらです。
1 2 3 4 5 6 7 |
Sub rensyu1() Dim cnt '数字をカウントする For cnt = 1 To 10 Range("A" & cnt).Value = cnt Next End Sub |
1~10まで数字が入りましたね。
以上がFor Next構文の使い方の基本です。
できるようになるまで練習しておいてください。後々、必ず大きな力になっていきます。
■前回のコードを読み解こう
先ほどまで勉強した構文の基礎を使って、前回のコードを実際に書きながら読み解いていきましょう。
上記が完成形です。
それでは、ひとつずつ分解して一から書いていきます。
一つ目の処理が出来るか否かが重要、というお話をしましたね。
ということで、一つ目の処理を順を追ってやってみましょう。
- シートをファイルの最後に追加
- 追加したシートの名前をA2セルの「日本」に変える
- 名前を変えたシートのセルA1に国名「日本」を入力する
上記の1~3が一つ目の処理です。
■シートをファイルの最後に追加する
まず、シートをファイルの一番後ろに追加するコードです。
Worksheets.Add after:=Worksheets(Worksheets.Count)
シートを追加するには、Worksheetsオブジェクトのaddメソッドを使います。
新しくメソッドという言葉が出てきましたが、これは、オブジェクトにある動作をすることを命令する文だと思って下さい。
ここでは、シートに対して追加(add)しなさいという命令をしている、ということです。
そして、after以下は追加したシートをどこに置くかを指定しています。
Worksheets(Worksheets.Count)はシートの数を数えて最後に置く、という意味です。
かっこ内の「Worksheets.Count」は数字に置き換えることができます。
シートの2枚目に追加したいのであれば、「Worksheets.Count」を「1」に変えて
Worksheets(1)とすれば1枚目の後ろに追加されます。
試してみてください。
■追加したシートの名前をA2セルの「日本」に変える
今度は、追加したシートの名前を変更してみましょう。
追加したシートはActivesheetで表現します。
Activesheetとは今現在表示されている(アクティブ状態にある)シートのことです。
シートが追加されると、その追加されたシートが表示されますから、
追加されたシート=アクティブ状態にある
ということで、Activesheetと表記します。
そのシートの名前を変えるので、nameプロパティを使います。オブジェクトの状態を変えるのはプロパティでしたね。
では、まずActivesheetの名前を「日本」に変えてみましょう。
ActiveSheet.Name = “日本”
上記のコードで追加したシートの名前を日本に変えられます。
ここまでは大丈夫ですか。
実際にシートの名前が変更されることを確かめてください。
シートの名前を変えましたが「日本」に変えるのが目的ではなく、A2セルにある文字列の「日本」を代入したいので右辺を変更していきます。
変更前:ActiveSheet.Name = “日本”
変更後:ActiveSheet.Name = Worksheets(“Sheet1”).Range(“A2”)
上記のように変更してください。
Worksheets(“Sheet1”)で特定のシートを指定しています。
この部分を省略してしまうと追加されたシートのA2セルを指定してしまいます。
どのシートを使うかは、常に意識してコードに書いておくようにしましょう。
上記のように変更してもシートの名前が日本になることを確認してください。
ちなみに、同じ名前のシートは作れませんので以前作ったシートは削除してください。
■名前を変えたシートのA1セルに国名「日本」を入力する
次は、追加したシートのA1セルに国名を入れていきましょう。
シートの名前を変えたのとほとんど同じです。
ActiveSheet.Name = Worksheets(“Sheet1”).Range(“A2”)
上記のコードの「Name」の部分を「Range(“A1”).Value」を変えるだけです。
これで、追加されたシートのA1セルに国名を入力することができます。
この技は、請求書などを作成する際に、先方の会社名をリストから転記するときなどに役立ちます。
どうですか?
ここまでで、シートを追加し、追加したシートの名前とA1セルを「日本」に変えるところまでできました。
つまり一つ目の処理ができた!ということです。
そして、これからはとうとうFor Next構文を使って繰り返し処理をします。
実は、ここまで出来れば後は簡単です。
では、やっていきましょう。
■For Next構文を完成させよう
もう一度これまで書いたコードを表示しておきます。
このコードにFor Next構文を用いて繰り返し処理していきましょう。
まず、変数を宣言します。
「Dim ~」で宣言できましたね。
僕は、国名を判定するために使う変数なので「kuni」としました。
変数の付け方にはいろいろ記法があったりしますが、基本的にわかりやすければ良いと思います。
ただ、個人的には日本語は止めたほうがいいと思っています。
さて、変数も宣言しましたので次はFor Next構文を書いていきます。
下記をご覧ください。
まず、For ~Nextまで一気に書きましょう。エラー防止のためですね。
「2 To 7」の意味は、国名のリストがA2からA7セルに入っているから、2を初期値7を最終値としています。
ここまで書けたら、一つ目の処理をForとNextの間に入れてあげます。
できましたか。
もちろん、このままではエラーになってしまいますから、コピペしたコードを変更していきます。
具体的に何を繰り返したいでしょうか。
- シートを追加した時に名前を付ける作業
- 追加したシートのA1セルに入力する国名
上記をそれぞれのシートごとに反映したいですね。
では、上記のコードでその部分に該当する箇所を変数に変えていきましょう。
変えたいのは、Sheet1のA2からA7ですからそれが記載されている
ActiveSheet.Name = Worksheets(“Sheet1”).Range(“A2”)
ActiveSheet.Range(“A1”).Value = Worksheets(“Sheet1”).Range(“A2”)
この2行の「(”A2″)」の部分ですね。
分解して変更すると(”A” & kuni)になりますね。
これで、完成です。
実行してみてできることを確認してください。
構文を使って繰り返し処理をする基本をお伝えしました。
基本と言ってもこの知識があれば応用できることはたくさんありますので、実務でいろいろ活用してください。
まとめ
いかがだったでしょうか。
今回は、VBAを使った繰り返し処理をご紹介しました。
基本事項ではありますが、順序立ててコードを書けるるようになることが重要です。
今回ご紹介した方法で順序立ててコードを書けるようになれば、請求書作成を自動化できる日も近いです。
次回から、実務でよく使う、請求書作成を自動化するツールを作っていきますのでお楽しみに。
それでは、また次回お会いしましょう。
みなさん、こんにちはケンケンです。 前回は、ForNext構文を使った例をお見せしました。 請求書作成自動化への道が一歩一歩切り開かれていますよ。もう少しで完結しますからがんば[…]
エクセルVBA入門編~請求書作成自動化への道~記事一覧
【エクセルVBA入門編①】VBAで何ができるのだろうか?【請求書自動作成の第一歩】
【エクセルVBA入門編②】めんどうな仕事はForNext構文で解決【請求書自動化の最重要構文】
【エクセルVBA入門編③】繰り返し作業はFor Next構文で完全自動化!【請求書作成自動化は目前!】
【エクセルVBA入門編④】自動記録を使い方とコード編集法を解説【請求書作成自動化への道】
【エクセルVBA入門編⑤】If Then構文で条件分岐をマスター【請求書自動化の最終ステップ】
【エクセルVBA入門編⑥】手順に沿って請求書を作成してみよう【請求書作成自動化最終章】