BLOG ブログ


2023.06.22 TECH

【エクセルVBA入門】簡単なTODOアプリを作成してみた

エクセルVBA入門 簡単なTODOアプリを作成してみた

スキマ時間でVBAの勉強をしているWebディレクターのふるたです。
プログラム入門と言えば、TODOアプリを作るのが定番?かと思い、作ってみました。

やりたいこと

  • タスクの情報を入力して、登録ボタンをクリックすると、TODO一覧表の最後尾に追加される
  • 「削除」ボタンをダブルクリックでタスクの行が消える
TODOアプリ 完成説明図

プログラムの流れ

  1. TODO一覧の行の最下部に取得した配列データを追加する関数(addNewTodo)を定義
  2. 新しいTODOのデータを配列で取得して、関数(addNewTodo)を呼び出す
  3. 削除ボタンをダブルクリックすると、該当の行が削除

TODO一覧の行の最下部に、取得した配列データを追加する関数(addNewTodo)を定義

Sub addNewTodo(newTodoItem() As Variant)

    Dim newTodoRng As Range
    Dim rowNo As Long
    
    With Worksheets(1)
    
        rowNo = .Cells(Rows.Count, "B").End(xlUp).Row + 1
        Set newTodoRng = .Range(.Cells(rowNo, "B"), .Cells(rowNo, "F"))
    
    End With
    
    newTodoRng.Value = newTodoItem
    
End Sub

新しいTODOのデータを配列で取得して、関数(addNewTodo)を呼び出す

Sub inputData()

    Dim itemRec(4) As Variant
    
    itemRec(0) = Range("C3").Value
    itemRec(1) = Range("C5").Value
    itemRec(2) = Range("C7").Value
    itemRec(3) = Range("C9").Value
    itemRec(4) = "削除"

    Call addNewTodo(itemRec)

End Sub

登録ボタンには「inputData」のマクロを登録

ボタンにマクロを設定する図

削除ボタンをダブルクリックすると該当の行が削除

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

    Dim res As VbMsgBoxResult
  
    If Target.Value = "削除" Then
  
        res = MsgBox("タスクを削除しますか?", vbYesNo + vbQuestion, "確認")
        
        If res = vbYes Then
            Target.EntireRow.Delete
            MsgBox "削除しました。"
        End If
  
    End If
  
End Sub

以上で、簡単なTODOアプリの完成です。
エクセルのワークシートでのセル番号などを合わせれば、上記のコードをコピペすれば動作するはずです。

コードの解説

ここからはコードの解説となります。長いので興味のある人だけ読んでください。

まずは、TODO一覧に追加するコードの解説

関数を定義

  • 一覧シートに、新しいタスクを登録する関数名を定義。関数名は任意でOK
  • 引数には配列の変数を設定します。配列のデータ側は「Variant」を指定

変数を設定

  • 追加するセル範囲の変数を定義
  • 追加する行番号の変数を定義

Worksheetsオブジェクトに複数の設定

  • オブジェクト(Worksheets)に複数の設定をする場合は、「Withステートメント」を利用
  • Workheetsのオブジェクトは一つ目のsheetなので(1)を指定。sheet名を指定してもOK

TODO一覧の最下部の行番号を取得

  • 一覧にデータが登録されている行の最下部のセルを指定する場合は、一旦、エクセルの最下部にアクセスして、「End(xlUp)」でデータ一覧の最下部へ上に移動させます。「+1」で最下部のデータの次の行を指定できます
  • 一覧の直下の行が指定できたら、新しいデータを入力するデータ領域を指定します

TODO一覧直下の行にて、入力するセルの範囲を指定

  • 一覧の直下の行が指定できたら、新しいデータを入力するデータ領域を指定します

関数の引数を入力データ領域に登録

  • 関数の引数「newTodoItem」の配列を「newTodoRng」の値に登録

これで、一覧に追加するマクロは完成です。

次に、新しいTODOデータを取得するコードの解説

マクロ名を定義

  • マクロ名「inputData」を定義。※マクロ名は任意でOK。

配列の変数を設定

  • 5つのデータを登録する配列の変数(itemRec)を設定

配列にデータを登録

  • 配列にそれぞれのデータを登録。固定のセルや値なので、やることはシンプルです

「Call」ステートメントでマクロ(関数)を呼び出す

  • 先に作ったマクロ(関数)「addNewTodo」を「Call」ステートメントで呼び出します
    ※関数の引数には「itemRec」を設定

登録ボタンにマクロ「inputData」を設定

  • 登録ボタンには、マクロ「inputData」を設定

以上で、新しいTODOデータを取得して、一覧に追加するコードは完了です。

最後に、削除ボタンをダブルクリックで、行が削除されるコードの解説

「削除」ボタンをダブルクリックしたら行を削除される説明図

マクロ名を定義

  • ダブルクリックでセル情報を取得するには、Worksheetのイベントプロシージャーの1つ「BeforeDoubleClick」イベントを利用
  • Private Sub ~ Cancel As Boolean」のステートメントはVBAでの決まり文句です。そのまま使う必要があります
  • Target」にセル情報が格納されます

メッセージBOXの戻り値を変数に設定

  • メッセージBOXの戻り値を変数に設定する場合は、メッセージBOX専用のデータ型「VbMsgBoxResult」を用います

IF文の設定(ダブルチェックしたセルの値が「削除」の場合)

  • ダブルチェックしたセルの値が「削除」の場合、メッセージBOXが表示されるように設定

IF文の設定(メッセージBOXで「はい」をクリック場合)

  • メッセージBOXの戻り値が「yes」の場合、ダブルクリックしたセルの行を削除
  • メッセージBOXで「削除しました。」を表示

以上で、コードの解説は終了です。

あとがき

今回は、エクセルVBAでプログラム入門の定番「TODOアプリ」を作ってみました。やはり、アプリ的なものをつくって動かすとプログラムを書いている実感がわきますね。ただ、解説を丁寧に書こうとすると記事のボリュームが多くなります。これでも省略したつもりだったのですが。。。だれが読むんだろうか?自己満足で終わっているような気もしますが。。。まあいいか。

また、簡単なアプリを作ったらブログで紹介したいと思います。


一覧に戻る


LATEST ARTICLE 最新の記事

CATEGORY カテゴリー