スポンサーリンク

【Excel/VBA】やってみよう!VBA!④

やってみよう!VBA! やってみよう!VBA
btr
スポンサーリンク
※当サイトは広告を含みます

勝手に初心者講座。「パートのおばさんにもできたんだから、あなたにもできる!やってみよう!VBA!」

前回はVBAのエディタを開き、VBAを実際に書いてみる、ということをやりました。

今回は、よーーーーく使う基本構文。

もし、〇〇だったら■■、〇〇でなかったら▲▲、の条件分岐。

ハイ次~ハイ次~と繰り返し処理してくれる、繰り返し構文等をやっつけてみたいと思います。

さて、いよいよ実務で使えそうなコードを書いてみましょう。

セルを最初から最後の行まで検査して、100点だったらセルを黄色くする、というコードを書いてみましょう。

1.コメントの入力

ここは必ずしも必要ではないのですが、まず何をしたいかを整理するために、「何をするよ」というのをコメントで書いていきましょう。

新たなプロシージャを作成します。

標準モジュールのSub 黄色2の下あたりに、Sub 黄色3() を入力してエンターを押します。

コメントを書いていきます。

シングルクォーテーションの後に何をしたいかを入力します。

「’」(シングルクォーテーション)の後に書いた文字は「コメント」となります。

「’」の後に入力した文字は「VBAコードではなくただの文字列」とエクセルさんは認識します。「’」を忘れてコメントを入力すると、エクセルさんから「こんなコード知らんねんけど」と怒られます。

コメントを入力しておくと、あとで見返したとき「何をやっているコードなんだっけ?」を思い出す助けとなります。


コメントを書きました。さて、この「何をしたいか」をコードに起こしていきましょう。

2.繰り返し~ループ処理~

ループ処理とはVBAでよく使う繰り返し処理です。

繰り返し処理をするには「繰り返し処理構文」を使います。

繰り返し処理構文は For~Next や Do~Loop 等いろいろあります。(詳しくは書籍やネットで見てみてください)

ここではDo~Loopを使ってみます。

以下のように黄色3プロシージャに書いてみてください。

1つずつ説明します。

Dim i As Long

i = 2

長整数型の変数 i を宣言しています。

訳すと(?)「変数にiを使うよ。入れられるのは数値だけだよ。よろしくね(その分のメモリ確保しておいてね)」というところでしょうか。

次の行で変数 i に 2 を代入しています。2行目から開始したいからです。(変数に値を入れることを代入と言います)

変数とは

一時的に何かを入れておく箱のようなものと思ってください。

ここで変数 i はカウンタとして使うので、1ずつ増やしていきます。増やしていきたい、とかちょっととっておいてあとで計算に使いたい、とか、変数って便利に使えるんですよ。

変数は i でも j でも hensu でも、変数1 などの日本語でも大丈夫です。数字で始まっちゃダメとかVBAのキーワードとかぶっちゃだめとかある程度の規則はありますが。

変数の宣言

変数の宣言は Dim 変数 As 変数の型 と宣言します。

Dim はDimensionの略のようです。Dimensionは「次元」とか「容積」とかそんな意味みたいです。変数を宣言することで「どのような値だけが代入されるのを許すか」を限定することができます。

変数の宣言は省略可能です。宣言しなくてもよいのです。ですが、数値を入れるべきところに間違って文字列が入っちゃったり、その後の間違いを防ぐことができるので、極力変数は宣言した方といろんな方が言っています。

変数の型は数値型(IntegerやLongとか)や文字列型(String)等いろいろ種類があります。詳しくはネットや書籍を参考にしてください。

uxmilk.jp

Do Until Cells(i,2).Value = “”

Do Loop構文のはじめです。

「セルの値が空白になるまでループする」という意味です。

Cells(i,2)

前回はRange(“C6”)とセルを指定したのを覚えていますか?

セルの指定の仕方は2種類あり、例えばセルC6を指定するのに以下の2通りの書き方ができます。

Range(“C6”)  ・・・ 文字列でセルC6を指定

Cells(6,3)    ・・・ 行番号,列番号でセルを指定(6行目・3列目のセル)

変数を使ってセルを指定する場合、行番号列番号で指定するCellsの方が書きやすいです。Range(“C” & i )といった書き方もできますが、好みですかね・・・。

******************

話はそれますが、ダブルクォーテーション(” ”)で囲まれた部分は文字列として認識されます。

セルC6に「山田」と入れたいときは

Range(“C6”).Value = “山田”

と書きます・

Range(“C6”).Value = 山田 と、山田を囲むダブルクォーテーションを忘れると、

エクセルさんは

山田… え?そんなコード知らない?⇒じゃあVBAコードじゃなくて変数か?

と認識して、「そんな変数宣言されてない」または「変数になにも代入されてない、空っぽだ」という処理に走ります。

なお、”” とダブルクォーテーションの間になにも文字列を入れない場合は「長さ0の文字列」つまり「空っぽ」ということになります。上記のDoLoop構文で「セルに何も入力されてなかったら」という条件式で使っています。例の表で7行目以降はセルになにも入力されていないので、7行目まで来たらLoop処理が止まります。

*******************

Do の後には繰り返ししたい処理を書きます。ここは後で書きます。

i = i+ 1

行数カウンタ変数 i に1をプラスし、次のLoopでは次の行を処理します。

1回目の処理は i =2だったので、2行目を処理。

i に1プラスして i は3になったので、次の処理では3行目を処理します。

3→4→5→6行目と次々処理をして、その次の7行目で Do Until Cells(i,2).Value = “”

の判定がTrueとなり(セル7行・2列目は空白)、処理を抜けます。

この i = i + 1 を書き忘れると・・・ずーーーと同じ2行目を処理することとなり、いわゆる無限ループに陥ります。(私、よくやるんです・・・)

そんなときは!Ctrl+Breakキーでストップできますのでご安心ください!

Loop

Do Loop構文の終わりです。

DoとLoopで囲まれた部分を繰り返し処理します。 

今回は前判定ですが、

Do

  処理

Loop Until Cells(i,2).Value= “”

のように後判定で書くこともできます。

処理をした後に「セルの値は空白かな?」と調べます。

かならず1回は処理したいときは後判定とか場合によって使い分けます。

また、Until ではなく While というキーワードも使えます。

Until は「~になるまで」ですが While は「~の間は繰り返す」です。

Until Cells(i,2).Value= “” は「セルの値が空白になるまでは処理をする。空白になったらLoop処理を抜ける」

While Cells(i,2).Value<> “” は「セルの値が空白ではないあいだは処理をする。『空白ではない』が成立しなくなったら(つまり空白になったら)Loop処理を抜ける」

DoLoop構文についてここではさらりと触れましたが、詳しくはネットや書籍の情報を参照してください。

3.条件分岐

さて、Do Loopの間の繰り返し行う処理を書いていきましょう。

その前に!「セルの値が100」であるかどうかを判定して、100だった場合にセルを黄色くしますよね。

「セルの値が100である」→Yes→セルを黄色くする

「セルの値が100である」→No→なにもしない

「セルの値が100である」という条件を判定し、その後の処理が分かれる、というのが条件分岐になります。

値を判定し、条件分岐する構文を書きます。If文を使います。

If 判定する条件 Then

  Yseの時の処理

Else

  Noの時の処理

End If

実際に書いてみます。

赤枠内の部分を追加しました。

「もし、セルの値が100だったら」という条件判定をしています。

Noの場合は何もしないので、今回はElseの部分は省略し、End Ifで終了しています。

セルの値が100だったら「ここにセルを黄色くする処理を書く」の部分に流れ、End Ifに抜けます。

セルの値が100ではない場合はそのままEnd Ifに抜けます。

ではいよいよセルを黄色くする処理を書きます。赤枠の部分を追加します。

これで完成です!早速マクロ「黄色3」を動かしてみましょう。

エクセルに戻って、開発タグ→マクロ→「黄色3」→実行 です。

100点のセルが黄色くなりましたか?

でもー。B列だけですね。

C・D列も黄色判定するように書き直しましょう。

列3・4も処理対象となるようにIfからEndIfの部分をコピーして、以下のように書いても正しく動きます。

4.もう一つ繰り返し処理構文 For~Next

でも、コピーできるということは、繰り返し処理ができるかも?

ということで、こんどはDoLoopとは別の繰り返し処理構文 For Next を使って書いてみましょう。

赤枠部分を追加・修正しています。

Dim j As Long

カウンタ変数 j を追加します

For j = 2 To 4

For Next構文の始めです。

j を2から4まで1つずつ増やしながらNextまでの処理を繰り返し行います。

Cells(i,j).Value

セルの列指定を数値ではなく変数 j で指定します。

Next

For Next 構文の終わりです。For以下ここまでの処理を繰り返し行います。

処理の流れはこうなります。

Do 入る i=2

Do の判定文 Cells(2,2)が空白ではないので処理進む

For  入る j=2→4

 1回目:セル2行・2列目(i = 2, j =2)
 2回目:セル2行・3列目(i = 2, j =3)
 3回目:セル2行・4列目(i = 2, j =4)

For 抜ける

i = i + 1 で i が3になる

Do の判定文 Cells(3,2)が空白ではないので処理進む

2回目のFor入る  j=2→4
 4回目:セル3行・2列目(i = 3, j =2)
 5回目:セル3行・3列目(i = 3, j =3)
 6回目:セル3行・4列目(i = 3, j =4)

For 抜ける

i = i + 1 で i が4になる

Do の判定文 Cells(4,2)が空白ではないので処理進む

3回目のFor入る  j=2→4

 7回目:セル4行・2列目(i = 4, j =2)
 8回目:セル4行・3列目(i = 4, j =3)
 9回目:セル4行・4列目(i = 4, j =4)

For 抜ける

i = i + 1 で i が5になる

Do の判定文 Cells(5,2)が空白ではないので処理進む

4回目のFor入る  j=2→4

 10回目:セル5行・2列目(i = 5, j =2)
 11回目:セル5行・3列目(i = 5, j =3)
 12回目:セル5行・4列目(i = 5, j =4)

For 抜ける

i = i + 1 で i が6になる

Do の判定文 Cells(6,2)が空白ではないので処理進む

5回目のFor入る  j=2→4

 13回目:セル6行・2列目(i = 6, j =2)
 14回目:セル6行・3列目(i = 6, j =3)
 15回目:セル6行・4列目(i = 6, j =4)

For 抜ける

i = i + 1 で i が7になる

Do の判定文 Cells(7,2)が空白なのでDoの処理終了

ふう~。ひとつずつ追うのはつかれますね。

5.メッセージボックス

ついでに処理が終わったとわかりやすいように最後にメッセージを表示する分を書き足します。

Loopの下に

MsgBox “処理終了”

と書きます。

6.ボタンでマクロを起動

エクセルに画面を切り替えて、開発タグの挿入をクリックしボタンをクリックします。

ボタンを書きたい位置で適当にドラッグします。

下のような画面が出るので「黄色3」を選択して「OK」ボタンを押します。

ボタンをクリックしてみてください。

100点のセルが黄色くなり、メッセージが表示されましたでしょうか?

メッセージは「OK」ボタンを押すと消えます。

ボタンの名前を変えることもできます。

ボタンを配置した後で、別のマクロをボタンに割り当てることもできます。

詳しくはネットや書籍を参照してください。

下が黄色3の完成形コードです。

業務で使うVBAを書く場合、あとあと修正が必要になることもありますし、ほかの人が修正する場合が出てくることもあります。後で見返して、だれにもわかりやすい、読みやすいVBAとなるように心がけましょう。(これがなかなか難しい・・・)

おさらい

こんなことをやりました。

・コメントの書き方

・繰り返し構文 Do~Loop

・変数とは、変数の宣言、変数の値の代入

・セルの指定方法 Range/Cells

・条件分岐 If文

・繰り返し構文 For~Next

・メッセージボックス

・マクロをボタンで起動する方法

長くなってしまいました。

最後までお付き合いいただきありがとうございました。

やってみよう!VBA!シリーズ

【Excel/VBA】やってみよう!VBA①

【Excel/VBA】やってみよう!VBA!②

【Excel/VBA】やってみよう!VBA!③

【Excel/VBA】やってみよう!VBA⑤ワークシートの操作

【Excel/VBA】やってみよう!VBA⑥ファイルの操作

【Excel/VBA】やってみよう!VBA!⑦ファイルの操作その2

【Excel/VBA】やってみよう!VBA⑧最後に

【Excel/VBA】わたしがVBAをがっちり習得した方法

【Excel/VBA】フォルダ内のファイルの情報を取得する

【Excel/VBA】フォルダ内のファイルの情報を取得する

コメント

タイトルとURLをコピーしました