VBAでアプリを作る方法とは?考え方・サンプルの作り方も解説!


VBAでアプリを作るときは、何からはじめればいいんだろう・・・
アプリを作るときの考え方や具体的な作り方が知りたいな・・・

簡単なVBAは作ったことがあっても、本格的なアプリの作り方がわからない方は多いのではないでしょうか。ただ処理を作るだけでなく画面を作ったり、ボタンクリック時の処理を作ったりと考えることが多いですよね。

こんにちは!フリーランスエンジニア兼テックライターのワキザカです。

この記事では、VBAでアプリ開発をしたい方向けに、アプリを作るときの考え方・具体的な作り方を解説します!

この記事はこんな人のために書きました。

  • VBAでアプリが作れるようになりたい人
  • アプリの作り方だけでなく、作るときの考え方も知りたい人

VBAでアプリを作るときの考え方

最初に、VBAでアプリを作るときの考え方について解説します。

アプリは、基本的に次のような流れで作ります。


■アプリ開発でVBAを書く前にすること
1. アプリの仕様を考える
2. 機能一覧を作る
3. 画面を設計する
4. 具体的な処理を設計する

簡単な自動化ツールを作るときは、1つの機能で動くものが大半ですよね。データをコピペする処理、レポートを自動で作成する処理、グラフを作成する処理などです。

アプリを作る場合は、データ登録・更新・削除などのデータ操作や、一覧データから欲しいデータを検索する処理など機能がとても豊富です。そのため、いきなりVBAを書く前に、仕様検討、機能一覧の作成、画面や詳細処理の設計が必要なのです。

ただ、解説だけ見てもわかりづらいと思うので、請求書管理アプリをサンプルに作り方を解説しますね。

【サンプル】VBAで請求書管理アプリの作り方

それでは、請求書管理アプリの作り方を解説します。

仕様検討・画面設計

まずは、仕様・画面設計についてです。

「請求書管理アプリ」と言っても、どんな機能があるか考える人によって変わってきますよね。そのため、何を作るか具体化するために設計をします

たとえば、次のようなイメージです。

■アプリの概要
請求書データを登録し、データ一覧から選んで請求書(PDF)を作成できるアプリ

■機能一覧

  • 請求データ新規登録機能
  • 請求データ更新機能
  • 請求データ削除機能
  • 請求データ一覧表示機能
  • 請求書作成機能

■画面例1:請求データ一覧

請求データ一覧

■画面例2:請求データ新規登録画面

請求データ新規登録画面

■画面例3:請求書作成機能

請求書作成機能

今回は、請求データの登録・更新・削除、データ一覧の表示、請求書が作成できる機能を設計しました。画面は実際にVBAのユーザーフォームで作った画面ですが、以下のようにExcelの図で作ってもOKです。


Excelの図で作った画面設計

このように、アプリの概要、機能の一覧、画面イメージの設計を作ることが最初のステップです。ここまで設計出来たら、次は詳細設計をしていきます。

詳細設計

次に、詳細設計をします。

今回は「請求データ登録機能」について、処理の詳細を考えていきましょう。

まず、登録画面の処理を作るときの考え方について解説します。アプリの仕様によって多少変わってはきますが、次のような流れで登録画面の処理を作ります。


■登録画面を作るときの考え方
1. 画面を起動する処理
2. ボタンクリック時の処理 - 入力チェック
3. ボタンクリック時の処理 - データ登録準備
4. ボタンクリック時の処理 - データ登録

それぞれ詳しく解説しますね。

画面起動時の処理

まず、画面起動時の処理を考えていきます。

今回作る画面は、以下でしたね。


新規登録画面

この中で「発行日」は、「画面を起動したときの日付」が自動で入っていたほうが親切ですよね。そのため、画面起動時に発行日に自動で日付を表示する処理が、起動時の処理になります。

このように、画面を起動したときの処理を考えていきます。

ちなみに今回は画面にありませんが、以下のように複数の選択肢から選ぶコンボボックスを使う場合も、画面起動時の処理を書きます。


コンボボックスの画面サンプル

「画面起動時に値をセットする処理が作れる」とまずは覚えて、画面の処理を考えるようにしましょう。

入力チェック

次に、入力チェックを考えていきます。

データを登録するときは、「必須項目のチェック」「型チェック」「桁チェック」などの入力チェックをします。


■入力チェックの種類

  • 必須チェック:必須項目が入力されているかチェック
  • 型チェック:数値型に文字列が入っていないかチェック
  • 桁チェック:〇桁までの数値に△桁以上の値が入っていないかチェック

今回は、わかりやすく解説するために「全ての項目を必須チェック」のみで進めます。

データ登録準備

入力したデータをそのまま登録するのではなく、入力したデータを使って計算してから登録したり、入力データとは別のデータを登録に使うケースはよくあります。

今回の例だと、請求データ一覧画面の「No」と「更新日時」は画面にないですよね。


請求データ一覧画面

この例だと、「データの一番最後のNoの数値 + 1」したNoを計算する処理、発行日に時分秒を足した処理が必要ですね。このように、データ登録前に必要な処理を考えていきます。

データ登録

最後に、データ登録する処理を考えていきます。

値だけでなく書式や罫線を設定する場合は、その処理も洗い出していきます。今回は値を登録するのみなので、セルを書き込む行番号を計算する処理、セルに書き込む処理のみでOKです。

ここまでできたら、アプリを作っていきます。以降は、画面ができていることを前提に進めていきます。画面を作ったことがない方は、先に以下を見てみてくださいね!

【VBA入門】ユーザーフォームの使い方(テキスト表示、カレンダー)
更新日 : 2019年4月22日
VBAのクイズの作り方とは?考え方やチュートリアルも解説!
更新日 : 2019年8月8日

登録処理の作り方

設計ができたら、コーディングに移ります。

解説が少し長かったため、ここまで設計した内容を整理しますね。


■請求データ登録機能の処理詳細

  • 画面起動時の処理

1. 発行日に画面を起動したときの日付を自動で表示する

  • 登録ボタンクリック時の処理

1. 【必須チェック】未入力の項目があった場合は、メッセージを表示して処理を止める
2. 登録するデータのNoを計算する
3. 登録するデータの行番号を計算する
4. 更新日時を計算する
5. 画面のデータ + No + 更新日時をセルに書き込む

画面起動時の処理の作り方

画面起動時の処理は、「UserForm_Initialize」に書きます。UserForm_Initializeの作り方は、次のとおりです。

1. ユーザーフォームの画面で右クリックして、コードの表示をクリック

コードの表示をクリック

2. 画面上部で「UserForm」「Initialize」を選択し、UserForm_Initializeを作成

UserForm_Initializeの作り方

3. 起動時の処理を書く

Private Sub UserForm_Initialize()
    '発行日に今日の日付を入力
    txtCreateDate = Format(Now(), "YYYY/MM/DD")
End Sub

4. 画面を起動して発行日が表示されることを確認する

起動した画面

今回は、オブジェクト名「txtCreateDate」のテキストボックスに、現在の日付を設定する処理を入れています。Format(Now(),表示方法)を使うと、現在の日付、時間を表示方法の内容に合わせて変更できるので、覚えておくと便利です!

これで、起動時の処理が完了です。

ちなみに、サンプルコードで書いたFormat関数の詳しい使い方について知りたい方は、以下がおすすめです!

【VBA】Formatで日付・時刻、数値、文字列の表示設定(和暦、曜日)
更新日 : 2019年4月21日

登録ボタンクリック処理の作り方

次に、登録ボタンクリック時の処理を作っていきます。


■登録ボタンクリック時の処理
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の請求書アプリを作れるようになると他にも様々な業務が効率化できて大切なスキルではありますが、このままVBAを学び続けるなら親和性のあるプログラミング学習に挑戦してみることもおすすめです。

VBAだと会社の業務改善などがメインの業務であり会社に貢献する場面が多くありますが、プログラミングなら年収や働き方などが選べるようになり、もっと自分に努力が返ってくるスキルです。

  • VBAは社内出世など、会社にずっと属していく人のみに必要
  • AIの発達によってVBAで条件を組まなくても良くなる可能性も
  • 人材不足かつ、市場か伸びているのはプログラミング、スキル次第で人生に選択肢が増える

これらの理由から、せっかくVBAというスキルを身につけようとしているなら親和性のあるプログラミングの方が、あなたの人生に選択肢や可能性を増やすのでは?と思います。

でもVBAでも精一杯なのにプログラミング?難しそう。

そんな心配をしているあなたでも大丈夫です。侍エンジニア塾ではあなたの目標や性格を踏まえて適切な講師を配属させていただき、マンツーマンで指導していくため、着実にスキルアップしていくことができます。

また、あなたの目標に対して現在のスキルや興味のある分野から最適な学習カリキュラムを作るフルオーダーメイドカリキュラムを作成いたします。これによりあなたの興味関心と授業のカリキュラムが完全にあった状態で学習できるため、確実に未来に繋がる実感を持ちながら学習ができます。

まずはあなたの興味や関心からおすすめの言語を判定するプログラミング学習診断アプリを受けてみてください。

質問に答えていくだけで、最適な言語やスキルと学習期間を提案いたします。

プログラミング言語診断を受ける

まとめ

今回は、VBAでアプリを作るときの考え方・具体的な作り方について解説しました。

アプリが作れるようになると、VBAで出来る事はとても増えます。

ぜひ、アプリ開発に挑戦してみてくださいね!

LINEで送る
Pocket

SEからWebエンジニアへ転職した理由

侍エンジニア塾卒業生の小池さんは、以前は社内SEとして約5年ほど勤務していました。しかし業務内容は社内のヘルプデスク対応など、プログラムを書く仕事は全くなかったそうです。

SEながらプログラムを書けない現状に「将来仕事がなくなるんじゃないか」と不安を感じ、プログラミング学習を決意。

弊社スクールで学習し、無事ベンチャー企業のプログラマーとして転職に成功しました。そんな小池さんの学習法や転職体験談を伺いましたので、是非ご覧ください。

「プログラミングができないSEは仕事がなくなる」不安を感じたSEが未経験から転職成功するまで
更新日 : 2019年10月7日

書いた人

Sanshiro Wakizaka

Sanshiro Wakizaka

フリーランスエンジニア兼ライターのワキザカ サンシロウです。
ExcelVBAの自動化ツール開発、WEB開発をメインにエンジニア業務をこなしつつ、サムライエンジニアにてライター業務をしております。

プログラミングをこれからやってみたい方に向けて、ためになる記事を全力で書いていきますので宜しくお願い致します!

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説