ExcelでRDB(リレーショナルデータベース)を操作してみようという連載のその21です。前回の記事はこちらです。
データ入力ツール
前回はデータ入力ツールの概要を検討してみました。ここが決まれば形にするのは楽ですね。
今回は、この概要にしたがって作っていけばいいと思います。
既存のツールを流用する
前回作成した概要をおさらいすると、以下になります。
- Accessファイルを指定して接続する
- データを入力するテーブルを選択する
- データ入力のがメニューが現れる
- データを入力する
- 決定ボタンを押すと入力した内容が記録される
このうち上の2つは前回までで開発していたAccessファイル確認ツールを流用できますね。これを使ってひな形を作っていきましょう。
ひな形のデザイン
入力決定ボタンが新たに必要になってきます。また、入力中に間違ってファイル指定ボタンやクリアボタンを押してしまうと、入力した内容が無効になってしまいます。入力決定ボタンと間違って押してしまわないように、位置を離しておきましょう。3つのボタンとも、押した後に確認のメッセージボックスを表示する事にします。
テーブルを選択した際に、該当テーブルのレコード数が取得されると便利です。(ここは、追ってクラスモジュールで取得できるようにします。)
これらの条件をふまえて、入力画面は以下の様になりました。 ファイルとテーブルを指定すると、フィールド名と続くデータ型、キーの情報が表示されて、その右側に対応するデータを入力することとします。
ここまでのソースリスト
少し長いのですが、ここまでのソースリスト(クラスモジュールを除く)を掲載します。上の図のシートモジュールに記述しています。ファイルを開いて選択したテーブルに応じて情報を表示するまでを記述しました。
Option Explicit 'Accessファイルの指定を実行します Public Sub cmdFile_Click() Dim db As New clsAccessDbase Dim fileName As String Dim fileFilter As String If MsgBox("ファイルを指定します", vbYesNo) = vbNo Then Exit Sub fileFilter = "Accessファイル(*.accdb),*.accdb" 'ダイアログを表示してファイルを指定 fileName = Application.GetOpenFilename(fileFilter) 'テーブルリストを表示します Me.ClearData If fileName <> "False" Then Me.Range("FileName").Value = fileName db.dbFileName = fileName With Me.Range("TableName").Validation .Delete TopSheet.Unprotect .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:=Join(db.dbTableList, ",") TopSheet.Protect Userinterfaceonly:=True End With Me.Range("TableName").Value = db.dbTableList(0) End If End Sub '表示クリアを実行します Public Sub cmdClear_Click() If MsgBox("表示をクリアします", vbYesNo) = vbNo Then Exit Sub ClearData End Sub '選択テーブルが変更された際にカラムリストの表示を変更します 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 End Sub 'カラムリストを表示します Private Sub DispColumnList(fileName As String, tableName As String) Dim db As clsAccessDbase Dim i As Long On Error GoTo ErrorHandler '表示をクリアします Me.Range("DATA_AREA").ClearContents Me.Range("A10").Activate Me.Range("TableName").Select 'カラム情報を表示します Set db = New clsAccessDbase db.dbFileName = Me.Range("FileName").Text db.dbTableName = Me.Range("TableName").Text With Me.Range("columnList").Offset(1, 0) For i = 0 To UBound(db.dbFieldList) .Offset(i, -1) = i + 1 .Offset(i, 0) = db.dbFieldList(i) .Offset(i, 1) = GetDataInfo(CLng(db.dbFieldType(i))) .Offset(i, 2) = GetKeyInfo(CLng(db.dbKeyType(i))) Next i End With 'レコード数表示します Me.Range("RecordCount").Value = db.dbRecordCount ErrorHandler: If Err.Number <> 0 Then MsgBox "テーブルエラーです" End Sub '番号からキーの種類を返します Private Function GetKeyInfo(keyNumber As Long) As String Select Case keyNumber Case 0: GetKeyInfo = "" Case adKeyPrimary: GetKeyInfo = "主キー" Case adKeyForeign: GetKeyInfo = "外部キー" Case adKeyUnique: GetKeyInfo = "キー" Case Else: GetKeyInfo = "???" End Select End Function '番号からデータ型の種類を返します Private Function GetDataInfo(DataNumber As Long) As String Select Case DataNumber Case adGUID: GetDataInfo = "オートナンバー" Case adVarWChar: GetDataInfo = "テキスト" Case adLongVarWChar: GetDataInfo = "メモ" Case adSmallInt: GetDataInfo = "整数" Case adInteger: GetDataInfo = "長整数" Case adSingle: GetDataInfo = "単精度浮動小数点" Case adDouble: GetDataInfo = "倍精度浮動小数点" Case adDate: GetDataInfo = "日付" Case adDBTimeStamp: GetDataInfo = "日付/時刻" Case adCurrency: GetDataInfo = "通貨" Case Else:: GetDataInfo = "???" End Select End Function '表示をクリアします Public Sub ClearData() Me.Range("FileName").ClearContents Me.Range("TableName").Validation.Delete Me.Range("TableName").Value = "" Me.Range("RecordCount").ClearContents 'テーブル表示をクリアします Me.Range("DATA_AREA").Clear Me.Range("A10").Activate End Sub
次回はデータ入力
これで大体形が見えてきました。次回はデータ入力機能を実装していきたいと思います。お楽しみに!!