連載
» 2016年10月07日 05時00分 公開

全社員プログラマー時代も目前? VB初心者でもできるExcelアプリ開発&正規表現を使うにはExcelマクロ/VBAで始める業務自動化プログラミング入門(13)(3/4 ページ)

[薬師寺国安,PROJECT KySS]

マクロのコード画面の表示

 では、UserForm1内にプログラムを書いていこう。UserForm1を選択しマウスの右クリックで表示される、[コードの表示]で、マクロのコード画面が表示される(図14)。

図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 終端行を取得してデータが入っていると、その下の行にデータを追加する処理

 このリスト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
リスト2 コンポーネントの読み込み中に発生するInitializeイベントの処理

 「個人情報データ」シートを選択状態にして表示させる。ラベルの[Caption]プロパティを使って、「IDラベル」内に文字列「K」と現在の「年月日時分秒」の値を連結して、これをIDとする。AddItemメソッドを使って「性別コンボボックス」に「男性」「女性」の項目を追加して、選択を可能にする(図15)。

図15 コンボボックスで「男性」「女性」の選択を可能にする

「コンボボックス」の値が変化したときの処理

 次は「性別コンボボックス」の値が変化したときの処理だ(リスト3)。グローバル変数「性別」に「性別コンボボックス」から選択された値を格納しておく。

Private Sub 性別コンボボックス_Change()
  性別 = 性別コンボボックス.Value
End Sub
リスト3 「性別コンボボックス」の値が変化したときの処理

「登録」ボタンがクリックされたときの処理

 次は、いよいよ「登録」ボタンがクリックされたときの処理だ(リスト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
リスト4 「登録」ボタンがクリックされたときの処理

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。