全社員プログラマー時代も目前? VB初心者でもできるExcelアプリ開発&正規表現を使うには:Excelマクロ/VBAで始める業務自動化プログラミング入門(13)(3/4 ページ)
プログラミング初心者を対象にExcelマクロ/VBAを使った業務自動化プログラムの作り方を一から解説します。今回から応用編として実用的なExcelアプリの作り方を解説していく。まずはデータ登録処理から【Windows 10、Excel 2016に対応】。
マクロのコード画面の表示
では、UserForm1内にプログラムを書いていこう。UserForm1を選択しマウスの右クリックで表示される、[コードの表示]で、マクロのコード画面が表示される(図14)。
UserForm1のイベントとしては「Initialize」などがある。後ほど解説する。
データを順次追加して登録していくためにEndプロパティを使う
まず、データを登録する際に一番問題となるのは、データを順次追加して登録していくことだ。登録するセルの範囲を直接指定して下記のように書くと、入力して登録される「ID」は「個人情報データ」シートの「A3」に登録され、そのセルにのみ上書きされて登録されることになる。
WorkSheets("個人情報データ").Range("A3").Value=IDラベル.Caption
しかし、それでは大変困る。セル「A3」にデータが登録されていたなら、その次の下のセル「A4」にデータを登録していく必要があるからだ。
そのためには、連載第4回「Excelの基本オブジェクト「セル」の参照、移動、コピー、選択、挿入、削除」でも解説した、終端セルを参照するEndプロパティを使用する。
マクロとしてはリスト1のように記述する。この処理は、A列の最終行から上方向の終端セルを選択し、すなわち、A列の最終行を取得して、データが入っていると、次の行にデータが追加される処理だ。
Dim lastRow As Long With Worksheets("個人情報データ") lastRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1 End With
このリスト1がこのプログラムの一番の肝となる部分だ。このことを頭に入れておいてほしい。後ほど『「登録」ボタンがクリックされたときの処理』のリスト4の最後に使われる。
プライベートモジュールレベルで変数の宣言
まずは、「プライベートモジュールレベル」で変数「性別」を文字列型として宣言しておく。「プライベートモジュールレベル」については、連載第3回「マクロが動かない原因の見つけ方とVBAの変数、データ型」の「VBAの変数の有効範囲」を参照してほしい。
Dim 性別 As String
フォームの読み込み中に発生するInitialize(初期化)イベントの処理
次に、フォームの読み込み中に発生するInitialize(初期化)イベントの処理だ(リスト2)。
Private Sub UserForm_Initialize() Worksheets("個人情報データ").Select IDラベル.Caption = Format(Now, "K" & "yyyymmddHHMMSS") 性別コンボボックス.AddItem "男性" 性別コンボボックス.AddItem "女性" End Sub
「個人情報データ」シートを選択状態にして表示させる。ラベルの[Caption]プロパティを使って、「IDラベル」内に文字列「K」と現在の「年月日時分秒」の値を連結して、これをIDとする。AddItemメソッドを使って「性別コンボボックス」に「男性」「女性」の項目を追加して、選択を可能にする(図15)。
「コンボボックス」の値が変化したときの処理
次は「性別コンボボックス」の値が変化したときの処理だ(リスト3)。グローバル変数「性別」に「性別コンボボックス」から選択された値を格納しておく。
Private Sub 性別コンボボックス_Change() 性別 = 性別コンボボックス.Value End Sub
「登録」ボタンがクリックされたときの処理
次は、いよいよ「登録」ボタンがクリックされたときの処理だ(リスト4)。このサンプルアプリでは全ての項目が入力必須となっているので、注意してほしい。全てのデータが入力されて「登録」ボタンがクリックされたときの処理だ。
Private Sub 登録ボタン_Click() Dim myRegEx As New RegExp Dim regCheck As Boolean If 氏名テキストボックス.Text = "" Then MsgBox "氏名を入力してください。" Exit Sub End If If 郵便番号テキストボックス.Text = "" Then MsgBox "郵便番号を入力してください。" Exit Sub End If If 住所テキストボックス.Text = "" Then MsgBox "住所を入力してください。" Exit Sub End If If 電話番号テキストボックス.Text = "" Then MsgBox "電話番号を入力してください。" Exit Sub End If If メールテキストボックス.Text = "" Then MsgBox "メールを入力してください。" Exit Sub End If If 性別 = "" Then MsgBox "性別を選択してください。" Exit Sub End If '郵便番号正規表現チェック' myRegEx.Pattern = "^[0-9]{3}[\-]?[0-9]{4}$" regCheck = myRegEx.Test(郵便番号テキストボックス.Text) If regCheck = False Then MsgBox "郵便番号が不正です。" Exit Sub End If '電話番号正規表現チェック' myRegEx.Pattern = "\d{2,4}-\d{2,4}-\d{4}" regCheck = myRegEx.Test(電話番号テキストボックス.Text) If regCheck = False Then MsgBox "電話番号が不正です。" Exit Sub End If 'メール正規表現チェック' myRegEx.Pattern = "[\w\d_-]+@[\w\d_-]+\.[\w\d._-]+" regCheck = myRegEx.Test(メールテキストボックス.Text) If regCheck = False Then MsgBox "メールアドレスが不正です。" Exit Sub End If 'データの登録' Dim lastRow As Long With Worksheets("個人情報データ") lastRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1 .Cells(lastRow, 1).Value = IDラベル.Caption .Cells(lastRow, 2).Value = 氏名テキストボックス.Text .Cells(lastRow, 3).Value = 性別 .Cells(lastRow, 4).Value = 生年月日テキストボックス .Cells(lastRow, 5).Value = 郵便番号テキストボックス .Cells(lastRow, 6).Value = 住所テキストボックス.Text .Cells(lastRow, 7).Value = 電話番号テキストボックス .Cells(lastRow, 8).Value = メールテキストボックス.Text End With IDラベル.Caption = Format(Now, "K" & "yyyymmddHHMMSS") End Sub
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- Excelマクロ/VBAリファレンス用途別・キーワード別一覧超まとめ
- ピボットテーブルとは何か──「そもそも、何をする機能か」を理解する
Excelを通じて「ピボットテーブル」の基礎を学び、データ分析を実践するまでを習得する本連載。初回はピボットテーブルの基礎と、「どんなことができるのか」を解説する。 - どんなビジネスにも欠かせないリレーショナルデータベースの基礎知識と作り方――テーブル、レコード、フィールド、主キーとは
Accessを通じて、初心者がリレーショナルデータベースやSQLの基本を学び、データベースを使った簡単なシステムの作り方を習得する本連載。初回はデータベースの基本を理解し、Accessを使い始めてみよう。