データ入力ツール④(ExcelでRDBその23)

ExcelRDB(リレーショナルデータベース)を操作してみようという連載のその23です。前回の記事はこちらです。

hirocom777.hatenadiary.org

入力規制機能の追加

前回はデータ入力機能を実装してみました。実際に動かして結果を確認できると面白くなってきますね!!

でも、何でも入力できればいいというものではありません。まず、データ型に合った入力以外は受け付けないようにしましょう。Excelのセルの入力規制、書式設定を使えば実現可能だと思います。

入力規制を考える

それでは、今回実装する入力規制を考えてみましょう。現在データ入力ツールがサポートしているデータ型と対応する入力規制の設定です。また、データ入力時にVBA側でもチェックしましょう。

データ型 入力規制 セルの書式設定 データ入力時の確認
テキスト 文字列
メモ 文字列
整数 整数 -32768~32767
長整数 整数 -2147483648
~2147483647
単精度浮動小数 IsNumericで確認
倍精度浮動小数 IsNumericで確認
日付 日付 IsDateで確認
通貨 IsNumericで確認

入力規則とセルの書式設定

それでは機能を実装していきましょう。まずは入力規則とセルの書式設定からです。以下のプロシージャを作成しました。

'入力規則とセルの書式を設定します
Public Sub SetValidaion(rng As Range)
  TopSheet.Unprotect
  rng.Validation.Delete
  Select Case rng.Offset(0, -2).Value
  Case "整数"
    rng.Validation.Add Type:=xlValidateWholeNumber, AlertStyle:=xlValidAlertStop, _
        Operator:=xlBetween, Formula1:="-32768", Formula2:="32767"
  Case "長整数"
    rng.Validation.Add Type:=xlValidateWholeNumber, AlertStyle:=xlValidAlertStop, _
        Operator:=xlBetween, Formula1:="-2147483648", Formula2:="2147483647"
  Case "テキスト", "メモ"
    rng.NumberFormatLocal = "@"
  Case "日付"
    rng.NumberFormatLocal = "yyyy/mm/dd hh:mm:ss;@"
  End Select
  TopSheet.Protect Userinterfaceonly:=True
End Sub

入力セルの2つ左のセルでデータ型を判定して、対応する処理をしています。引数がRangeになっていますので、このプロシージャを前回作成したプロシージャDispColumnListでセルのロック解除の直後で呼び出しましょう。

データ入力時の確認

お次はデータ入力時の確認です。データ型に応じてIsNumericかIsDateで確認します。プロシージャWorksheet_Changeの処理を以下の様に変更しました。上と同様にデータ型を確認した上で、値が正しいかどうかを確認します。

'選択テーブルが変更された際にカラムリストの表示を変更します
'入力された値の確認を行います
Private Sub Worksheet_Change(ByVal Target As Range)
  'カラムリスト表示の更新
  If Target.Address = Me.Range("TableName").Address And Target.Text <> "" Then
    DispColumnList Me.Range("FileName").Text, Me.Range("TableName").Text
  End If
  '入力された値の確認
  If Not Target.Locked Then
    Select Case Target.Offset(0, -2).Value
    Case "単精度浮動小数点", "倍精度浮動小数点", "通貨"
      If Not IsNumeric(Target.Value) Then
        MsgBox "数値ではありません"
        Target.ClearContents
      End If
    Case "日付"
      If Not IsDate(Target.Value) And Target.Value <> "" Then
        MsgBox "日付型ではありません"
        Target.ClearContents
      End If
    End Select
  End If
End Sub

今回のプログラムとサンプルファイルは、以下からダウンロードできます。興味のある人は試してみてください。(サンプルなので実務には使用しないでください!!)

23_データ入力ツール④.zip - Google ドライブ

次回は制約

いかがでしょうか?これで少し使いやすくなったと思います。次回は制約です。主キーや外部キーなどに設定されているフィールドは、入力内容に制約がかかります。この仕様に対応していこうと思います。お楽しみに!!

hirocom777.hatenadiary.org

ExcelVBAでAccessファイルを操作する連載はコチラから