VBAでアプリを作るときは、何からはじめればいいんだろう・・・
アプリを作るときの考え方や具体的な作り方が知りたいな・・・
簡単なVBAは作ったことがあっても、本格的なアプリの作り方がわからない方は多いのではないでしょうか。ただ処理を作るだけでなく画面を作ったり、ボタンクリック時の処理を作ったりと考えることが多いですよね。
こんにちは!フリーランスエンジニア兼テックライターのワキザカです。
この記事では、VBAでアプリ開発をしたい方向けに、アプリを作るときの考え方・具体的な作り方を解説します!
この記事はこんな人のために書きました。
- VBAでアプリが作れるようになりたい人
- アプリの作り方だけでなく、作るときの考え方も知りたい人
VBAでアプリを作るときの考え方
最初に、VBAでアプリを作るときの考え方について解説します。
アプリは、基本的に次のような流れで作ります。
■アプリ開発でVBAを書く前にすること
1. アプリの仕様を考える
2. 機能一覧を作る
3. 画面を設計する
4. 具体的な処理を設計する
簡単な自動化ツールを作るときは、1つの機能で動くものが大半ですよね。データをコピペする処理、レポートを自動で作成する処理、グラフを作成する処理などです。
アプリを作る場合は、データ登録・更新・削除などのデータ操作や、一覧データから欲しいデータを検索する処理など機能がとても豊富です。そのため、いきなりVBAを書く前に、仕様検討、機能一覧の作成、画面や詳細処理の設計が必要なのです。
ただ、解説だけ見てもわかりづらいと思うので、請求書管理アプリをサンプルに作り方を解説しますね。
【サンプル】VBAで請求書管理アプリの作り方
それでは、請求書管理アプリの作り方を解説します。
仕様検討・画面設計
まずは、仕様・画面設計についてです。
「請求書管理アプリ」と言っても、どんな機能があるか考える人によって変わってきますよね。そのため、何を作るか具体化するために設計をします。
たとえば、次のようなイメージです。
■アプリの概要
請求書データを登録し、データ一覧から選んで請求書(PDF)を作成できるアプリ
■機能一覧
- 請求データ新規登録機能
- 請求データ更新機能
- 請求データ削除機能
- 請求データ一覧表示機能
- 請求書作成機能
■画面例1:請求データ一覧
■画面例2:請求データ新規登録画面
■画面例3:請求書作成機能
今回は、請求データの登録・更新・削除、データ一覧の表示、請求書が作成できる機能を設計しました。画面は実際にVBAのユーザーフォームで作った画面ですが、以下のようにExcelの図で作ってもOKです。
このように、アプリの概要、機能の一覧、画面イメージの設計を作ることが最初のステップです。ここまで設計出来たら、次は詳細設計をしていきます。
詳細設計
次に、詳細設計をします。
今回は「請求データ登録機能」について、処理の詳細を考えていきましょう。
まず、登録画面の処理を作るときの考え方について解説します。アプリの仕様によって多少変わってはきますが、次のような流れで登録画面の処理を作ります。
■登録画面を作るときの考え方
1. 画面を起動する処理
2. ボタンクリック時の処理 – 入力チェック
3. ボタンクリック時の処理 – データ登録準備
4. ボタンクリック時の処理 – データ登録
それぞれ詳しく解説しますね。
画面起動時の処理
まず、画面起動時の処理を考えていきます。
今回作る画面は、以下でしたね。
この中で「発行日」は、「画面を起動したときの日付」が自動で入っていたほうが親切ですよね。そのため、画面起動時に発行日に自動で日付を表示する処理が、起動時の処理になります。
このように、画面を起動したときの処理を考えていきます。
ちなみに今回は画面にありませんが、以下のように複数の選択肢から選ぶコンボボックスを使う場合も、画面起動時の処理を書きます。
「画面起動時に値をセットする処理が作れる」とまずは覚えて、画面の処理を考えるようにしましょう。
入力チェック
次に、入力チェックを考えていきます。
データを登録するときは、「必須項目のチェック」「型チェック」「桁チェック」などの入力チェックをします。
■入力チェックの種類
- 必須チェック:必須項目が入力されているかチェック
- 型チェック:数値型に文字列が入っていないかチェック
- 桁チェック:〇桁までの数値に△桁以上の値が入っていないかチェック
今回は、わかりやすく解説するために「全ての項目を必須チェック」のみで進めます。
データ登録準備
入力したデータをそのまま登録するのではなく、入力したデータを使って計算してから登録したり、入力データとは別のデータを登録に使うケースはよくあります。
今回の例だと、請求データ一覧画面の「No」と「更新日時」は画面にないですよね。
この例だと、「データの一番最後のNoの数値 + 1」したNoを計算する処理、発行日に時分秒を足した処理が必要ですね。このように、データ登録前に必要な処理を考えていきます。
データ登録
最後に、データ登録する処理を考えていきます。
値だけでなく書式や罫線を設定する場合は、その処理も洗い出していきます。今回は値を登録するのみなので、セルを書き込む行番号を計算する処理、セルに書き込む処理のみでOKです。
ここまでできたら、アプリを作っていきます。以降は、画面ができていることを前提に進めていきます。画面を作ったことがない方は、先に以下を見てみてくださいね!
登録処理の作り方
設計ができたら、コーディングに移ります。
解説が少し長かったため、ここまで設計した内容を整理しますね。
■請求データ登録機能の処理詳細
- 画面起動時の処理
1. 発行日に画面を起動したときの日付を自動で表示する
- 登録ボタンクリック時の処理
1. 【必須チェック】未入力の項目があった場合は、メッセージを表示して処理を止める
2. 登録するデータのNoを計算する
3. 登録するデータの行番号を計算する
4. 更新日時を計算する
5. 画面のデータ + No + 更新日時をセルに書き込む
画面起動時の処理の作り方
画面起動時の処理は、「UserForm_Initialize」に書きます。UserForm_Initializeの作り方は、次のとおりです。
1. ユーザーフォームの画面で右クリックして、コードの表示をクリック
2. 画面上部で「UserForm」「Initialize」を選択し、UserForm_Initializeを作成
3. 起動時の処理を書く
Private Sub UserForm_Initialize() '発行日に今日の日付を入力 txtCreateDate = Format(Now(), "YYYY/MM/DD") End Sub
4. 画面を起動して発行日が表示されることを確認する
今回は、オブジェクト名「txtCreateDate」のテキストボックスに、現在の日付を設定する処理を入れています。Format(Now(),表示方法)を使うと、現在の日付、時間を表示方法の内容に合わせて変更できるので、覚えておくと便利です!
これで、起動時の処理が完了です。
ちなみに、サンプルコードで書いたFormat関数の詳しい使い方について知りたい方は、以下がおすすめです!
登録ボタンクリック処理の作り方
次に、登録ボタンクリック時の処理を作っていきます。
■登録ボタンクリック時の処理
1. 【必須チェック】未入力の項目があった場合は、メッセージを表示して処理を止める
2. 登録するデータのNoを計算する
3. 登録するデータの行番号を計算する
4. 更新日時を計算する
5. 画面のデータ + No + 更新日時をセルに書き込む
作り方は次のとおりです。
1. ユーザーフォームのボタンをダブルクリックして、オブジェクト名_Click処理を作る
ボタンのオブジェクト名が「btnRegist」の場合は、btnRegist_Clickの名前でマクロが自動で作られます。
Private Sub btnRegist_Click() End Sub
2. クリック時の処理をVBAで書く
ここからは、サンプルコード + 補足説明で解説します。
クリック時の処理:
Private Sub btnRegist_Click() '変数宣言 Dim lngNo As Long 'No Dim strInvoceNo As String '請求書番号 Dim createDate As Date '発行日 Dim paymentDate As Date '支払期限 Dim strClientName As String '得意先名 Dim lngCost As Long '請求額 Dim updateDate As Date '更新日時 '①未入力の項目があった場合はメッセージを表示して処理終了 If txtInvoiceNo = "" Or txtCreateDate = "" Or txtPaymentDate = "" Or txtClientName = "" Or txtCost = "" Then MsgBox "入力項目は全て必須です。" & vbCrLf & _ "すべて入力してから登録ボタンをクリックしてください。", vbExclamation Exit Sub End If '②Noの値を計算 Dim maxRow As Long maxRow = Cells(Rows.Count, 2).End(xlUp).Row 'データの最大行番号を取得 lngNo = Cells(maxRow, 2).Value + 1 '③データ登録準備 strInvoceNo = txtInvoiceNo '請求書番号 createDate = txtCreateDate '発行日 paymentDate = txtPaymentDate '支払期日 strClientName = txtClientName '得意先名 lngCost = txtCost '請求額 updateDate = txtCreateDate & " " & Format(Now(), "HH:MM:SS") '更新日時 (時分秒を追加) '④データをセルに書き込む Dim writeRow As Long writeRow = maxRow + 1 With Worksheets("請求データ一覧") .Cells(writeRow, 2) = lngNo 'No .Cells(writeRow, 3) = "未"; '請求書出力フラグ .Cells(writeRow, 4) = strInvoceNo '請求書番号 .Cells(writeRow, 5) = createDate '発行日 .Cells(writeRow, 6) = paymentDate '支払期限 .Cells(writeRow, 7) = strClientName '得意先名 .Cells(writeRow, 8) = lngCost '請求額 .Cells(writeRow, 9) = updateDate '更新日時 End With '画面を閉じる Unload Regist_Frm End Sub
①の処理で、必須チェックを行っています。「オブジェクト名 = “”」をOrでつないで条件作り、未入力項目があった場合はMsgBox関数でメッセージを表示して、Exit Subで登録処理を止めています。
②の処理では、Noを計算しています。データ一覧で登録されているデータの一番下の行番号を取得し、「取得した行番号のNo + 1」でNoを計算しています。
③の処理では、データ登録準備をしています。画面で入力した値を変数にセットし、Noや更新日時は計算した値を入れています。このように、事前に登録するデータを変数に入れておくことで計算ミスも減ります。
④の処理では、③まで準備したデータを使ってセルに値を書き込んでいます。②の処理で最終データの行数は取得しているので、それを使ってデータを書き込む行数を計算し、データを登録しています。
このように、あらかじめ設計をしておくことで、処理に悩まずコードを書いていくことができるのです。
アプリ開発を成功させる鍵はExcel機能を有効活用すること
ここまで、アプリ開発の考え方・具体的な作り方を解説してきました。
画面を作れば、さまざまなアプリを作ることができるため、とても便利です。ただ、やみくもに画面を作ればOKという考え方だと、開発に時間がかかってしまう時があります。
Excelはとても機能が豊富なので、Excelの機能でできることは任せることも重要です。たとえば今回作った画面は、Excelのシートでも同じことを実現できます。
ユーザーフォームの使い方を覚えなくても、シートで実現することもできるのです。このように、Excelの機能を最大限活用して作っていく考え方がとても重要です。
「作ること」を目的にせず、「アプリを作って実現したい課題」を意識して設計してみてくださいね!
まとめ
今回は、VBAでアプリを作るときの考え方・具体的な作り方について解説しました。
アプリが作れるようになると、VBAで出来る事はとても増えます。
ぜひ、アプリ開発に挑戦してみてくださいね!