アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

ExcelVBA入門 #6:ここまでの総集編

問題

今回は以下の仕様のものを作ります。できる人はそれ以降読まなくてOK。
Excelワークシート関数は禁止)

  • Sheet1に、「年」「月」「日」「金額」の4列がある
  • 1行目はタイトル行、2行目から30行目までデータが入っている(全部半角の数字)
    • データは30行に足りていなくても余っていてもOK、とにかく2行目から30行目までだけを考慮すればOK
  • 年が「2015」で月が「8」の行の金額を合計して、メッセージボックスに出したい

「Sheet1」は要するにこんな感じです。
中の数字やデータ数はどうでもよいので、とりあえず用意してみてください。
f:id:honey8823:20150828150815p:plain

ではいきますよー。
途中で「あっわからない」と思ったら一旦中断して、これまでの記事を読み返すなりググるなりしてみてください。
(「わからなくてもとりあえず最後までやった方が理解しやすい派」な人は、それはそれで)

まずは設計する

設計といっても、難しく考える必要はありません。
とりあえず「プログラムを書きはじめられる段階」にする作業です。
自分でやりやすいようにするのが一番良いです。

キッチリ設計書にまとめたいという人はそれもOKですし、
設計せずにいきなりプログラム書くのが一番楽!という人はそれもOK。
あまり経験のない場合はかえって分からなくなることもあると思いますし、向き不向きもあります。


だからといって「ご自由にどうぞ」とだけ言うのも何なので、とりあえずここは「わたしの場合」について書きます。

わたしはガチガチに設計してから書くことはほとんどやりません。
(本当は、業務で書くときはきちんと設計してからの方が良いのですが…)
とりあえず仕様を単純化して頭に叩き込んで、あとは書きながら設計…というか、プログラミングと設計を交互に…という感じです。

仕様を単純化というのは、今回の場合はこんな感じ。

  • 日付は使わないので無視してOK。
  • 大きく分けるとやることは2つ、「①2行目から30行目までのデータをチェックして2015年8月の金額の合計値を計算」と「②2015年8月の金額の合計値を表示」だけ。
  • ①はFor文で2~30行目をチェックして、A列とB列の値を見てD列の合計を計算していく。
  • ②は①の計算結果を出すだけ。

こういうことを設計書に書く代わりにコメントとして書いていき、いらなくなったら消したり書き変えたりしています。

…と説明していくよりも、これから書いていくところにそういうコメントを残したり消したりしていくので、それで見てもらった方が早いかも。

プロシージャを作る

さて、では作っていきましょう。
新しいExcelファイルを開いて、VBEで「標準モジュール」を追加します。
追加したらエディタが出て、「Option Explicit」と表示されていますか?
表示されていたら、その下に空っぽのプロシージャを追加してみましょう。

こんな感じですね。
さっきも書きましたが、コメントはわたしの脳内の設計をそのまま出している感じです。
真似しなくてよいので、必要に応じて、自分で分かりやすいように書いていきましょう。

Option Explicit

Public Sub SumAmount()
    'これからここに処理を書く
End Sub

はい、ブックを保存した上で一旦実行してみましょう。
もちろん何も起こりませんね。OKです。

表示する部分を作る

ややこしい部分は置いといて、まず最後の表示部分を作ってしまいましょう。
どうにかして計算した結果を変数に入れるとして…その変数を定義して表示、っと。

Option Explicit

Public Sub SumAmount()

    '変数の定義
    Dim lAmount As Long '金額合計値入れるやつ

    'とりあえず0にしておく
    lAmount = 0

    '①データをチェックして合計値を計算
    '(あとで実装)

    '②表示する
    MsgBox (lAmount)

End Sub

はい、ブックを保存した上で一旦実行してみましょう。
「0」と書かれたダイアログボックスが出てきましたね。OKです。

1行ずつチェックする部分を作る

For文を使って、データ部分を1行ずつ参照できる状態にします。
2行目から30行目なので…

Option Explicit

Public Sub SumAmount()

    '変数の定義
    Dim i As Long
    Dim lAmount As Long
    
    'とりあえず0にしておく
    lAmount = 0
    
    '①データをチェックして合計値を計算
    For i = 2 To 30
        '2015年8月の合計値を計算
        '(あとで実装)
    Next
    
    '②表示する
    MsgBox (lAmount)

End Sub

はい、ブックを保存した上で一旦実行してみましょう。
合計値はまだ計算していないので、今回も「0」と書かれたダイアログボックスが出てきましたね。OKです。

合計値を計算する処理を作る

とにかく、合計金額を計算しないことには話になりません。
条件は置いといて、とりあえず金額用の変数に全部の合計を入れてみましょう。
セルから値を取る時は、「ブック指定.シート指定.セル指定.Value」で、
データを入れるときは、「変数 = 値」なので…

Option Explicit

Public Sub SumAmount()

    '変数の定義
    Dim i As Long
    Dim lAmount As Long
    
    'とりあえず0にしておく
    lAmount = 0
    
    '①データをチェックして合計値を計算
    For i = 2 To 30
        '2015年8月の合計値を計算
        '…ですが、とりあえず試しに全部合計
        lAmount = lAmount + ThisWorkbook.Sheets("Sheet1").Range("D" & i).Value
    Next
    
    '②表示する
    MsgBox (lAmount)

End Sub

はい、ブックを保存した上で一旦実行してみましょう。
金額列の2行目から30行目の合計が出ていますね。OKです。

合計値を計算する処理に条件をつける…完成!

では、さっき追加した計算部分にIf文で条件をつけてみましょう。
ついでに、毎回シートを指定するのが面倒なので、ワークシート用のオブジェクト変数に入れて使ってみましょう。

Option Explicit

Public Sub SumAmount()

    '変数の定義
    Dim i As Long
    Dim lAmount As Long
    Dim wsList As Worksheet
    
    'とりあえず0にしておく
    lAmount = 0
    
    'ワークシート設定
    Set wsList = ThisWorkbook.Sheets("Sheet1")
    
    '①データをチェックして合計値を計算
    For i = 2 To 30
        '2015年8月の合計値を計算
        If wsList.Range("A" & i).Value = 2015 And wsList.Range("B" & i).Value = 8 Then
            lAmount = lAmount + wsList.Range("D" & i).Value
        End If
    Next
    
    '②表示する
    MsgBox (lAmount)

End Sub

はい、ブックを保存した上で一旦実行してみましょう。
2行目から30行目のうち、年が2015で月が8の行の金額のみが合計されていますね。
これでOKです!

動作確認

完成後は、きちんと動作確認をしましょう。
年月や金額を変えたりして、いろいろ試してみてください。
お疲れさまでした!

次回予告

ExcelVBA入門 #7:デバッグのコツ - アナログCPU:5108843109
きちんと変数と繰り返し処理と条件分岐処理、そしてセルから値を取ったり入れたり…ができれば、もう簡単なプログラムはいくらでも作れると思います。
ということで次回からは応用編。
まずは、「ちゃんと」プログラミングするために必須&便利な知識をいろいろ覚えていきましょう。