Excelが大好きだ!

Excel大好き経理マンがExcelの事を書き綴っていきます。


スポンサードリンク

CDと本の管理システムをExcelで作成する(5.SQLite3データベースへのデータ入力フォーム2)

前回は入力フォームに設置しているテキストボックス等の設定を確認した。

www.excellovers.com

今回はユーザーフォームに設定しているコードを確認していく。

入力項目を選択制にする

今回のコードはいずれもユーザーフォームに記載しています。

Private Sub UserForm_Initialize()
     With conCategory
          .AddItem "CD"
          .AddItem "本"
     End With
     
     With conStatus
          .AddItem "未読"
          .AddItem "読中"
          .AddItem "読了"
     End With
     
     With conPossession
          .AddItem "オリジナル"
          .AddItem "電子化"
     End With
     
     With conAssessment
          .AddItem 5
          .AddItem 4
          .AddItem 3
          .AddItem 2
          .AddItem 1
     End With
End Sub

UserForm_Initializeはユーザーフォームを起動した時に実行されます。
その特性からユーザーフォームの初期値の設定を行う際に利用されます。

上記ではいずれもComboboxの内容を設定しています。

フォームのデータをデータベースへ挿入

以下4つとも全てユーザーフォームへ記載してください。

Private Sub CommandButton1_Click()
    '①
     If Not (InsertDataCheck) Then
          MsgBox "カテゴリ・タイトル・アーティスト欄に入力漏れがあります。" & vbCrLf & _
               "あるいは購入日付に不備があります。", vbOKOnly + vbCritical, "入力漏れ"
          Exit Sub
     End If
     '②
     DataInsert
     '③
     DataClear
     
     MsgBox "データ登録が完了しました", vbInformation + vbOKOnly, "登録完了"
End Sub

ユーザーフォーム上に唯一設置しているコマンドボタンを押すと作動します。

①『InsertDataCheck』関数で入力漏れがないか確認しています。  入力漏れがあった場合falseを返します。  Not演算子で返り値のTrue・falseを反転させていますので、返り値がfalseの時にIF文にマッチします。

②入力漏れがなかった場合『DataInsert』を実行します。  データベースへのデータ挿入を行います。

③入力後のユーザーフォームから値を消去して初期状態にします。

Private Function InsertDataCheck() As Boolean
     Dim myCon As Control
     Dim AlertString As String
     Dim ReturnValue As Boolean
     
    '①
     If conStatus.Value = "" Then conStatus.Value = "未読"
     If conPossession.Value = "" Then conPossession.Value = "オリジナル"
     If conAssessment.Value = "" Then conAssessment.Value = 0
     
   '②                
     ReturnValue = True
     For Each myCon In Me.Controls
          Select Case myCon.Name
               Case "conCategory", "conTitle", "conArtist"
                    If myCon.Value = "" Then ReturnValue = False
               Case "conBuyDate"
                    If Not (IsDate(conBuyDate.Value)) Then ReturnValue = False
          End Select
     Next
     
     InsertDataCheck = ReturnValue
End Function

①4つのコンボボックスの内、カテゴリ以外の内容が未選択の場合、規定の値を設定します。

②ユーザーフォーム上のコントロールをループ処理で全てチェック。
 カテゴリ、タイトル、アーティストが空白の場合及び  購入日付が日付形式でない場合に『InsertDataCheck』関数はfalseを返します。

Private Sub DataInsert()
     Dim DBHandle As Long
     Dim DBFullpath As String
     DBFullpath = ThisWorkbook.Path & "\CDBookManager.db3"
     SQLite3Initialize
     SQLite3OpenV2 DBFullpath, DBHandle, SQLITE_OPEN_READWRITE, ""
     
     Dim mySQL As String
     Dim StmtHandle As Long
     
     mySQL = "Insert into CDBookManager values("
     mySQL = mySQL & """" & Me.conTitle.Value & ""","
     mySQL = mySQL & """" & Me.conCategory.Value & ""","
     mySQL = mySQL & """" & Me.conLabel & ""","
     mySQL = mySQL & """" & Me.conArtist & ""","
     mySQL = mySQL & """" & Format(Me.conBuyDate, "yyyy-mm-dd") & ""","
     mySQL = mySQL & """" & Me.conStatus & ""","
     mySQL = mySQL & Me.conAssessment & ","
     mySQL = mySQL & """" & Me.conComment & ""","
     mySQL = mySQL & """" & Me.conPossession & """)"
     
     SQLite3PrepareV2 DBHandle, mySQL, StmtHandle
     SQLite3Step StmtHandle
     SQLite3Finalize StmtHandle
     
     SQLite3Close DBHandle
End Sub

SQLのInsert分に関してはこちら。

一点気をつけないといけないのは購入日。

SQLite3には日付時刻の型は無いため文字列として扱います。 その際に『yyyy-mm-dd』という書式にしておくと、文字列なのですが日付型のように扱うことが出来ます。

qiita.com

そのため取込時にFormat関数を使用して書式をyyyy-mm-ddに変換しています。

Private Sub DataClear()
     Dim myCol As Control
     
     For Each myCol In Me.Controls
          If (myCol.TabIndex >= 9 And myCol.TabIndex <= 17) = True Then myCol.Value = ""
     Next
     Me.conCategory.SetFocus
End Sub

値を消すコントロールをタブオーダーの番号で判定しています。

ラベル以外の入力項目の値をクリアする処理になっています。

まとめ

今回で新しくデータを入力するフォーマットが整いました。

次回は入力したCD・本データを検索するユーザーフォームを作成したいと思います。