Access フォーカスが移動できない

レコードセットを使った処理ののち、コントロールを移動させようと頑張ったが、行方不明になり、テキストボックスをクリックしないとカーソルが戻ってこない。自動で移動させたいのだができなかった。
調べてやっとできた。
このような情報がAccessの開発には必要なんですよね。

レコードセットをつかったVBAが書かれているとする。  
Set Me.Recordset = rs

rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
DoCmd.ShowAllRecords ※これの前に入れてしまうとコントロールは移動できない。

#####ここ以下にいれることで移動できるようになった######
If IsNull(call_受注番号) Then
受注番号検索 = Null
Me.Visible = False  ※これが必要
Me.Visible = True  ※これが必要
Me.受注番号検索.SetFocus
Else
受注番号検索 = Null
Me.Visible = False
Me.Visible = True
Me.input_納品日入力.SetFocus ※これでやっとコントロールが移動できた。
End If

Null と ”” は違うようなのでで、注意してください。

Access エラー処理

簡単そうだけど、忘れてしまう。
なので、記載しておきます。3か所の部分が必要です。

Private Sub 製品名コード検索_AfterUpdate()
On Error GoTo Err_check  ※この部分。

DoCmd.ShowAllRecords
製品名コード検索 = Null
DoCmd.GoToControl “在庫数”

Exit_Err_check: ※この部分
Exit Sub

Err_check:  ※この部分
MsgBox “検索するデータが存在しないか、エラーが発生しました。”
Resume Exit_Err_check

End Sub

Access テキストボックスのロック

入力ミスを防ぐためと、データの不一致をさせないために、あるタイミングで、テキストボックスに編集ロックをかけたい時がある。その方法。

Sub Form_Current()
If Me.[社員ID] = “0001” Then
Me.[旅費明細].Enabled = True  ※テキストボックス変化なし。
Me.[旅費明細].Locked = False  ※ロックを外す
Else
Me.[旅費明細].Enabled = False ※テキストボックスグレーになり、フォーカス移動できない。
Me.[旅費明細].Locked = True  ※ロックをする。
End If
End Sub

EnableとLockedはセットで使用しなくてもOK
編集だけできないようにさせる場合は、LockedだけでOKである。

Access レコードセットを2つ使いたい場合

本当は、1つのVBAの中で、2つのレコードセットを使う方法があるのかもしれないが、今回はこの方法で処理して解決しました。callで別のVBAにして処理をさせた。

Private Sub B在庫処理_Click()
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim SQL As String

On Error GoTo ErrRtn

SQL = “SELECT * FROM dbo_stock_parts WHERE HNO =” & Me!call_HNO & “”
Set cn = CurrentProject.Connection
rs.Open SQL, cn, adOpenKeyset, adLockOptimistic

cn.BeginTrans

While Not rs.EOF
If IsNull(call_在庫確認) Then

If IsNull(rs!在庫数) Then
rs!在庫数 = call_数量
Else
rs!在庫数 = rs!在庫数 + call_数量
End If
Else
rs!在庫数 = rs!在庫数 – call_数量
End If
rs.Update
rs.MoveNext
Wend

cn.CommitTrans

rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing

ExitErrRtn:

Call stock
Exit Sub

ErrRtn:
MsgBox “エラー: ” & Err.Description

cn.RollbackTrans
rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
End Sub

※callで下記のVBAを呼ばせて処理をさせている。

Sub stock()
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim SQL As String

On Error GoTo ErrRtn

SQL = “SELECT * FROM dbo_receiving_materials WHERE JNO =” & Me!call_JNO & “”

Set cn = CurrentProject.Connection
rs.Open SQL, cn, adOpenKeyset, adLockOptimistic

cn.BeginTrans

While Not rs.EOF
If IsNull(call_在庫確認) Then
rs!在庫確認 = “在庫済”
MsgBox (“在庫更新しました。”)
Else
rs!在庫確認 = Null
MsgBox (“在庫取消しました。”)
End If
rs.Update
rs.MoveNext
Wend

cn.CommitTrans

rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing

ExitErrRtn:

DoCmd.ShowAllRecords
Exit Sub

ErrRtn:
MsgBox “エラー: ” & Err.Description

cn.RollbackTrans
rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing

End Sub

Access VBA 帳票レコード削除

フォームの帳票表示のレコードを消したい場合
下記のVBAにて対応可能。帳票の各レコードに削除ボタンを設置する。

Private Sub Bレコード削除_Click()

If MsgBox(“削除しますか?”, vbCritical + vbOKCancel) = vbOK Then
DoCmd.RunCommand acCmdDeleteRecord
MsgBox “削除を完了しました。”
Else
MsgBox “削除を中止しました。”
End If

End Sub

Access トランザクション処理付きADO追加処理

Private Sub 新規登録_Click()

Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset

On Error GoTo ErrRtn

Set cn = CurrentProject.Connection
rs.Open “dbo_receiving_materials”, cn, adOpenKeyset, adLockOptimistic

‘トランザクションの開始
cn.BeginTrans

rs.AddNew
rs!HNO = Me!input_HNO
rs!MNO = Me!input_MNO
rs!メーカー名 = Me!call_メーカー名
rs!品名コード = Me!input_品名コード
rs!品名 = Me!input_品名
rs!型式 = Me!input_型式
rs!単価 = Me!input_単価
rs!数量 = Me!input_数量
rs!備考 = Me!input_備考
rs.Update
MsgBox (“追加しました。”)

‘トランザクションの保存
cn.CommitTrans

rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing

ExitErrRtn:
input_品名 = Null
input_品名コード = Null
input_型式 = Null
input_HNO = Null
input_単価 = Null
input_数量 = Null
input_備考 = Null
input_数量 = Null
HNO検索 = Null

Exit Sub

ErrRtn:
MsgBox “エラー: ” & Err.Description
‘BeginTransの時点まで戻り、変更をキャンセルする
cn.RollbackTrans
rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing

End Sub

Access DLookup 数値型の複数検索

HNOとMNOの数値型の複数検索にて、非連結テキストボックスのフォームに代入。

Me.input_品名 = DLookup(“品名”, “dbo_mst_parts”, “HNO =” & Me!HNO検索 & “AND MNO=” & Me!input_MNO)
Me.input_品名コード = DLookup(“品名コード”, “dbo_mst_parts”, “HNO =” & Me!HNO検索 & “AND MNO=” & Me!input_MNO)
Me.input_型式 = DLookup(“型式”, “dbo_mst_parts”, “HNO =” & Me!HNO検索 & “AND MNO=” & Me!input_MNO)
Me.input_HNO = DLookup(“HNO”, “dbo_mst_parts”, “HNO =” & Me!HNO検索 & “AND MNO=” & Me!input_MNO)
Me.input_単価 = DLookup(“単価”, “dbo_mst_parts”, “HNO =” & Me!HNO検索 & “AND MNO=” & Me!input_MNO)

Access 複数条件にてホーム入力

複数条件から抽出して、フォームに入力するために、Dlookupでは、うまくいかなかったのでレコードセットをつかった入力をしましたが、
Me.input_数量.SetFocus
をしても、フォーカスが行方不明になってカーソルが移動しないという不具合から下記のような内容にして終結しました。

Private Sub input_品名コード_AfterUpdate()
Me.input_型式 = DLookup(“型式”, “dbo_mst_parts”, “MNO=” & Me!input_MNO & ” AND [品名コード]='” & Me.input_品名コード & “‘”)
Me.input_HNO = DLookup(“HNO”, “dbo_mst_parts”, “MNO=” & Me!input_MNO & ” AND [品名コード]='” & Me.input_品名コード & “‘”)
Me.input_単価 = DLookup(“単価”, “dbo_mst_parts”, “MNO=” & Me!input_MNO & ” AND [品名コード]='” & Me.input_品名コード & “‘”)

Me.input_数量.SetFocus
End Sub

Access コンボボックスの編集ブロック

リストに表示されているものは選択できるが、それ以外のものを入力することができないようにする方法。
コンボボックスの[入力チェック]プロパティを「はい」にし、[値リストの編集の許可]プロパティを「いいえ」にする。これらのプロパティは、[データ]タグの中。

こうすることで、リストにない値を入力した場合には、エラーメッセージが表示され、入力を拒否され、再度選択リストが表示させる。