Mutable_Yunの業務改善ブログ

業務改善や生産性向上のブログです。自動化の手段として、VBAやRPAの勉強に役立つ解説をしています。

Excel VBA入門 本当のど初心者向け⑤ Endプロパティで最終行の取得

プログラミング自体が初めての入門者を初心者の出口まで連れていくシリーズの最終回です。前回までで、繰り返しと条件分岐ができました。エクセルの実務を自動化するための最低限の武器を既に手に入れたので、今回は表の作成を実際に行っていきます。

この記事は初心者向けです。
レベルについてはExcel VBAの実力(レベル)を定義してみる 初心者~三段をご参照ください。

目次

Endプロパティの書き方だけ知りたい方は、Endプロパティを使って最終行を取得するに飛んで下さい。

今回の事例

今回の事例は、売上高の分析です。下記のような表があるとします。

売上データの表
売上データの表

やりたいことはF列に売上高の列を作り、販売単価×販売実績の数字を記入していくことです。
最後にメッセージボックスに支店ごとの売上高をまとめて表示させます。この部分は実務では別のシートにまとめとして一覧表を作る、メールに記載して特定の人に贈るなど必要に応じて変えることができます。ここでは、メッセージボックスに表示させるにとどめておきます。

繰り返しと条件分岐で実装する

売上データは7行目まであります。1行目はヘッダ行なので繰り返しの為のカウントアップ変数は2~7までにすればよさそうです。実務ではデータの行数は毎回異なるので、最終行を取得するようにします。この方法は後で解説します。

まずは繰り返しの中身を作ってみる

まず、繰り返しの中身を作成してみましょう。F列に掛け算した結果を書くんですよね。まずは、自分でどう記述するのか考えてみてください。

Cells(2, 6) = Cells(2, 3) * Cells(2, 4)

まずは変数を使わずに2行目の処理を具体的に書いてみましょう。これができれば、それを7行目まで繰り返すだけです。

これで2行目のF列目に販売単価×販売実績の数字を記入することができました。Cells(X, Y)の書き方は、行番号、列番号でしたね。そして、最終的に売上をまとめるんですよね。なので支店ごとの売上を覚えておく必要があります。

東京支店と大阪支店と札幌支店の売上高を入れておく変数を東京売上、大阪売上、札幌売上とします。先ほどのコードに追記します。

    Cells(2, 6) = Cells(2, 3) * Cells(2, 4)
    
    If Cells(2, 1) = "東京支店" Then
        東京売上 = 東京売上 + Cells(2, 6)
    End If

    If Cells(2, 1) = "大阪支店" Then
        大阪売上 = 大阪売上 + Cells(2, 6)
    End If
    
    If Cells(2, 1) = "札幌支店" Then
        札幌売上 = 札幌売上 + Cells(2, 6)
    End If

前回やったIf文を使いました。勉強した文法が実務の中で使われているのを見ると、具体的なイメージとして定着しやすいですよね。

東京売上 = 東京売上 + Cells(2, 6) の部分について解説します。数学の=と違い、この=は代入です。つまりここでは東京売上という変数を使って、A列が東京支店の時に東京売上にF列の値を足しこんでいくという作業をしています。東京売上の値を東京売上+F列の値に置き換えているということです。

もし、東京売上=Cells(2, 6)とすると足しこむのではなく、単に入れ替えただけになってしまいます。2をiに置き換えると最終的に、最後に東京支店が出てきた時の売上高が格納されているだけになってしまいますね。

これでFor文の中身ができました。For文で繰り返すときに、行番号をカウントアップしていくので、2行目のところを変数で置き換えます。

私が教えた人はここで、単にFor文の中に入れて、変数で置き換えずに??ってなっている人がたくさんいました。気を付けましょう。

繰り返しのFor文の中に入れる

行番号を2からiに置き換えつつ、For文の中に入れます。Subプロシジャの中に書いて、実際に動くようにしましょう。

Sub 売上分析()

    For i = 2 To 7
    
        Cells(i, 6) = Cells(i, 3) * Cells(i, 4)
        
        If Cells(i, 1) = "東京支店" Then
            東京売上 = 東京売上 + Cells(i, 6)
        End If
    
        If Cells(i, 1) = "大阪支店" Then
            大阪売上 = 大阪売上 + Cells(i, 6)
        End If
        
        If Cells(i, 1) = "札幌支店" Then
            札幌売上 = 札幌売上 + Cells(i, 6)
        End If
        
    Next i
    
End Sub

実務では先にFor文を作っておいて、中身を後から作る

今回は初心者の説明用として、まず、For文の中身を作って、それをFor文の中に入れました。この方法で慣れて頂いてもOKです。しかし、私の経験上ForとNextを先に書いてしまうほうが良いと思います。

理由は、プログラムの全体像が分かりやすくなり、エラーを起こしにくくなるからです。このシリーズの3回目でFor文は入れ子にできることを学びました。For文の中にFor文を入れることですね。複雑になってくるとこの内側のFor文の中に分岐があって、さらにその中にFor文がある、みたいな場合が出てきます。

そういう時に処理の流れとしてFor Nextを先に書いてしまうことで、構造を見えやすくしてしまうのです。あと、Nextを書き忘れるのを防止する意味もあります。実務的には先にFor Nextを書いてしまう。その後に中身を作る、というコツを今のうちに身に着けておきましょう。

Endプロパティを使って最終行を取得する

今回は売上データが7行目までしか存在しませんでした。しかし、売上は日々積みあがっていくので毎日データの行数は変わるはずです。最終行を取得して、行数が変わることに耐えられるようにしておきましょう。

最終行の取得方法は下記のとおりです。

最終行の取得方法
最終行の取得方法

いきなりちょっと難しくなったと感じるかもしれません。今は意味がわなからなければ写経でも構いません。(コピペは身につかないのでダメです)

これは必ず通る道なので、ちょっと長いですが、きっちり理解して書けるようにしておきましょう。まず最終行を入れる変数を用意します。今回はrwとしました。行の英語のRowから取りました。

Cellsの中身でRows.Countとあります。Rowsはこのシートの行全部の事です。それをCountしろ、ということなので、このエクセルシートに存在する行数が入ります。つまり、Cells(Rows.Count, 1)はA列の一番下のセルのことです。

Ctrlと矢印を押すと初めてデータがあるところにアクティブなセルを動かすことができますよね。それが.End(xlUp)のところです。最後のRowはその時の行番号を取る、という意味です。

つまりこの一文で、A列の一番下のセルからCtrl + ↑で行けるセルの行番号、ということです。これで最終行の行番号をrwに入れることができました。

実際に使えるものに仕上げる

この最終行の取得と、メッセージボックスへの各支店の売上高の表示を実装します。
売上高のヘッダも作成しておきましょう。

Sub 売上分析()
    
    Cells(1, 6) = "売上小計"   'ヘッダを追記
    rw = Cells(Rows.Count, 1).End(xlUp).Row  '最終行をrwで取得した

    For i = 2 To rw  '繰り返すのは最終行まで
    
        Cells(i, 6) = Cells(i, 3) * Cells(i, 4)
        
        If Cells(i, 1) = "東京支店" Then
            東京売上 = 東京売上 + Cells(i, 6)
        End If
    
        If Cells(i, 1) = "大阪支店" Then
            大阪売上 = 大阪売上 + Cells(i, 6)
        End If
        
        If Cells(i, 1) = "札幌支店" Then
            札幌売上 = 札幌売上 + Cells(i, 6)
        End If
        
    Next i
    
    MsgBox "東京支店の売り上げ:" & 東京売上 & vbCrLf & "大阪支店の売り上げ:" & 大阪売上 & vbCrLf & "札幌支店の売り上げ:" & 札幌売上
    
End Sub


実行結果

実行結果
実行結果

無事に狙い通りのものができました。ここまで、自分で実装できればあなたはすでに初心者ではなく、初級者です!

今後の話

ここまでで初級者になることができました。初級者を卒業するためには、どんなに小さくてもいいので実際に業務で使えるツールを作ることです。それを可能にするために必要なステップを示して、この入門者、初心者向けのシリーズを締めくくりたいと思います。

今後は標準モジュールに書く

今まで、あえて明確に言っていませんでしたが、今までプログラムコードを書いてきたところはシートモジュールという場所でした。今後は標準モジュールというところに書くことにしましょう。まずはネットで「標準モジュール」を検索してみましょう。

今後は変数は宣言してから使う

そのプログラム内で初めて出てくる言葉は変数として使うことができました。今回の例でいえば、最終行を格納するためのrwであったり、カウントアップのためのiだったりですね。今後は変数は宣言してから使うようにしましょう。

理由は、一見面倒なようであっても結果的にそれがあなたを助けることになるからです。ネットで調べる時は「VBA 変数 宣言」ですね。

シートやブックの操作を覚える

今までは、すでにデータのあるエクセルブックのシートモジュールにコードを書いていました。実際は別のデータを取り込んだり、新しいブックを作成したりシートを転記したりします。これらの操作を身に着けることによって、さらにできることが増えていきます。

初級者の入り口までは新しいことを覚えていくことで到達可能でしたが、初級者を脱するためには一つ、完成品を作る必要があります。これらは、体系的に覚えるというより、都度色々調べながら身に着けていくようにしましょう。

そして、初めのころは調べる時間のほうが、コードを書く時間より圧倒的に長いと思います。繰り返し調べることによりだんだん調べる時間が短くなり、早く作れるようになってきます。

そして、1つのものが完成したとき、中級の入り口に立ちます。

リファクタリングできょうのプログラムの完成度を高める

リファクタリングとは動作を変えずにコードの中身を改善することです
今回の例もいろいろと改善することができます。変数を宣言してから使うようにしたり、配列を使った高速化も可能です。

また、リファクタリングとは言いませんが、機能を充実させることもできます。例えば、売上の元データをユーザーに選択してもらうようにするといったことです。

今回は支店が東京支店、大阪支店、札幌支店と分かっていました。それではどんな支店名があるかわからないときはどうしますか。

今回で一つ、確実に動くものが作れましたが、このように一度作ったものをブラッシュアップすることも上達につながります。

これで初心者は卒業で次は初級者です。次のステップとして、初級者と中級者の違いは、どんなに小さくてもいいので、実際に使えるモノが作れるかどうかです。よって、初級者向けの講座はありません。とにかく何でもいいので実務で使えるものを何か完成させましょう。

では、中級編でお会いしましょう!

中級編に進む→