前回は入力フォームに設置しているテキストボックス等の設定を確認した。
今回はユーザーフォームに設定しているコードを確認していく。
入力項目を選択制にする
今回のコードはいずれもユーザーフォームに記載しています。
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』という書式にしておくと、文字列なのですが日付型のように扱うことが出来ます。
そのため取込時に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・本データを検索するユーザーフォームを作成したいと思います。