Accessの非連結フォームを作成する方法についてご紹介します。
非連結フォームはデータベースのテーブルと直接関連付けられず、独自の表示と操作を行う事ができます。
要するに、フォームの入力項目を自由に入力させ、
更新ボタンをクリックしたイベントとして更新処理をVBAで記載することで
入力チェックを行ったり、関連テーブルへ同時に更新したりすることができます。
1. 非連結フォームを作成する
2. 更新ボタンクリック時のVBA処理
フォームを作成
(1)作成>フォームデザイン を選択

(2)ラベル、テキスト、ボタンを配置します

背景緑の項目はラベルです
Noのテキストの名前は「txtNo」
得意先名のテキストの名前は「txt得意先名」
得意先名略のテキストの名前は「txt得意先名略」
得意先名担当者のテキストの名前は「txt得意先担当者」
ACCESS VBA
更新と登録は1つのフォームで行うので起動時にモードを取得し
更新モードの場合は、キーを取得し(strCode)このキーを元にデータ検索します。
データが取れないということは既に他の人に削除されたデータなので
エラーとなり画面は表示されません。
'***************************
' 画面起動時
'***************************
Private Sub Form_Open(Cancel As Integer)
Dim strCode As String
On Error GoTo Error
' 起動時のモード判定
If IsNull(OpenArgs) Then
' 新規モード
msMode = MODE_INS
Else
' 更新モード
strCode = Me.OpenArgs
Me.AllowAdditions = False
Me.NavigationButtons = False
msMode = MODE_UPD
End If
' 画面サイズ初期化
Call subReSize
' 画面初期化処理(コントロールの初期化)
Call subInitialize
If msMode = MODE_INS Then
'--------------
' 新規モード
'--------------
Else
'--------------
' 編集モード
'--------------
' 得意先マスタ取得
If funGetTokuisaki(strCode) = False Then
MsgBox "選択されたデータは既に削除されています。" & Chr$(10), vbExclamation, C_MSG_TITLE
Cancel = True
End If
End If
Me.txt得意先名.SetFocus
Exit Sub
Error:
MsgBox "エラーが発生しました。エラー内容:" & Err.Description & Chr$(10), vbCritical, C_MSG_TITLE
End Sub
更新ボタン押下時に行うのは
1. 入力チェック
2. モード判定による処理分岐
登録モードの場合、登録処理
更新モードの場合、更新処理
3. 処理が終了したら画面を閉じて前の一覧画面を再表示する
'***************************
' 更新ボタン
'***************************
Private Sub cmd更新_Click()
Dim sMsg As String
'=================
' 入力チェック
'=================
If funCheckInput = False Then
Exit Sub
End If
If msMode = MODE_INS Or mintId = 0 Then
'=================
' 登録処理
'=================
If funTokuisaki_Insert() = True Then
MsgBox "登録処理が正常に終了しました。", vbInformation + vbOKOnly, C_MSG_TITLE
' 一覧再表示
Call Form_F_M得意先マスタ一覧.cmd検索_Click
Call cmd終了_Click
End If
Else
sMsg = "更新します。よろしいですか?"
If MsgBox(sMsg, vbInformation + vbYesNo + vbDefaultButton2, C_MSG_TITLE) = vbNo Then
Exit Sub
End If
'=================
' 更新処理
'=================
If funTokuisaki_Update() = True Then
MsgBox "更新処理が正常に終了しました。", vbInformation + vbOKOnly, C_MSG_TITLE
' 一覧再表示
Call Form_F_M得意先マスタ一覧.cmd検索_Click
Call cmd終了_Click
End If
End If
End Sub更新処理関数は下記のようなイメージになります。
トランザクションの記載についての説明はまた機会がありましたらしたいと思いますが
更新系はトランザクションを使用した方が良いと思います。
ここでADOを使用しているのは外部のDBへの接続の際にも比較的改修少なく済むので
DAOで更新処理を書いていくよりADOを使う方が良いと思います。
Rem ----------------------------------------------------------------------------------
Rem 関数名 : funTokuisaki_Update
Rem 処理内容 : 得意先マスタの更新を行う
Rem 引 数 : なし
Rem 戻り値 : true(正常)/false(異常)
Rem ----------------------------------------------------------------------------------
Private Function funTokuisaki_Update() As Boolean
Dim objCon As New ADODB.Connection
Dim objCmd As New ADODB.Command
Dim strSql As String
On Error GoTo EXCEPTION
funTokuisaki_Update = False
Application.Echo False
DoCmd.Hourglass True
' データベースを開く
Set objCon = CurrentProject.Connection
objCmd.ActiveConnection = objCon
' トランザクション開始
objCon.BeginTrans
' SQL生成
strSql = "UPDATE m_tokuisaki SET"
strSql = strSql & " tokuisaki_name ='" & Nz(Me.txt得意先名.Value) & "'"
strSql = strSql & " ,tokuisaki_short_name ='" & Nz(Me.txt得意先名略.Value) & "'"
strSql = strSql & " ,tokuisaki_tanto_name ='" & Nz(Me.txt得意先担当者.Value) & "'"
strSql = strSql & " ,upd_dt =Now()"
strSql = strSql & " WHERE tokuisaki_id =" & mintId & ""
objCmd.CommandText = strSql
' SQL実行
objCmd.Execute
' コミット
objCon.CommitTrans
' 後処理
objCon.Close: Set objCon = Nothing
funTokuisaki_Update = True
Application.Echo True
DoCmd.Hourglass False
Exit Function
EXCEPTION:
Application.Echo True
DoCmd.Hourglass False
MsgBox "エラーが発生しました。エラー内容:" & Err.Description & Chr$(10), vbCritical, C_MSG_TITLE
On Error Resume Next
' ロールバック
objCon.RollbackTrans
' 後処理
objCon.Close: Set objCon = Nothing
End Function動作確認
(1)一覧画面

編集ボタンを押下
編集ボタン押下時は、その行のキー(strCode)を入力画面に引き渡します。
'***************************
' 編集ボタン
'***************************
Private Sub cmd編集_Click()
Dim strCode As String
If Nz(Me.txtID_明細.Value) = "" Then Exit Sub
strCode = Me.txtID_明細.Value
Me.Refresh
DoCmd.OpenForm "F_M得意先マスタ入力", acNormal, , , , acDialog, strCode
End Sub(2)更新画面(初期表示)
更新モードで表示

(3)更新画面(データを修正)

(4)更新画面(更新ボタン押下)

確認メッセージが表示されますので「はい」を押下
(5)一覧画面再表示

更新画面が閉じられて一覧画面が再表示されます


コメント