- ベストアンサー
アクセスのフォーム入力について
アクセス初心者です。操作方法でどうしてもわからないところがあり、知識を分けていただけたら嬉しいです。 仕事で、フォームを使って新規データ入力を行うことがとても多いのです。新しいレコードにデータを入力する際に、最終レコードのデータが初期値として入力されているようにすることは可能でしょうか? 日付などの共通のデータが、新しいレコードの初期値として予め入っていればとても助かります。新レコード入力の際に、常に最終レコード(一つ前に入力したデータ)の値を入れておく方法があれば、ご伝授をお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
ここでは敢えて既定値の設定でもって代入する方法を案内します。 もちろん、同じ手法で、直接に Value を更新することもOKです。 <テーブル1> ID 作成日 1 2006/10/12 というテーブルに[ID]、[作成日]を登録するフォームがあるとします。 Private Sub Form_Current() Dim lngMaxID As Long Dim strQuerySQL As String If Me.NewRecord Then lngMaxID = DBMax("ID", "テーブル1") strQuerySQL = "SELECT 作成日 FROM テーブル1 WHERE ID=" & lngMaxID Me.作成日.DefaultValue = """" & DBLookup(strQuerySQL) & """" End If End Sub で事足りると思います。 ここでは、列[ID]の最大値=既定値を参照するレコードと定義しています。 この辺りは、質問者サイドの事情によります。 Private Sub Form_Current() Dim lngMaxID As Long If Me.NewRecord Then lngMaxID = DMax("ID", "テーブル1") Me.作成日.DefaultValue = """" & DLookup("ID", "テーブル1", "ID=" & MaxID) & """" End If End Sub このように、Access の DLookup関数、DMax関数を利用することも可能です。が、多少、処理に時間がかかります。 ************************* 既定値を使えば復元も可 ************************* Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) ' ' フォームに [F5:前の値 F6:既定値] と表示し ' On Error Resume Next If KeyCode = &h74 Then SendKeys "^("")", False KeyCode = 0 ElseIF KeyCode = &h75 Then SendKeys "^(%({ }))", False KeyCode = 0 End If End Sub で、前のレコードの列の値はF5、既定値ならばF6を押して代入する方法も提供します。 これですと、ユーザが既定値を誤って修正後に再び既定値に戻すのも楽です。 この機能は、ベテランユーザは多用しています。 わざわざ、新規レコードの値を既定値を介して設定する理由です。 なお、DLookup関数、DMax関数の高速版は次のようです。 Public Function DBLookup(ByVal strField As String, _ ByVal strTable As String, _ Optional ByVal strWhere As String = "", _ Optional ByVal ReturnValue = Null) As Variant On Error GoTo Err_DBLookup Dim DataValue Dim strQuerySQL As String Dim rst As ADODB.Recordset Set rst = New ADODB.Recordset strQuerySQL = "SELECT " & strField & " FROM " & strTable If Len(strWhere) > 0 Then strQuerySQL = strQuerySQL & " WHERE " & strWhere End If With rst .Open strQuerySQL, _ CurrentProject.Connection, _ adOpenStatic, _ adLockReadOnly If Not .BOF Then .MoveFirst DataValue = .Fields(0) End If End With Exit_DBLookup: On Error Resume Next rst.Close Set rst = Nothing DBLookup = Nz(DataValue, ReturnValue) Exit Function Err_DBLookup: MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _ "・Err.Description=" & Err.Description & Chr$(13) & _ "・SQL Text=" & strQuerySQL, _ vbExclamation, " 関数エラーメッセージ" Resume Exit_DBLookup End Function Public Function DBMax(ByVal strField As String, _ ByVal strTable As String, _ Optional strWhere As String = "") As Variant On Error GoTo Err_DBMax Dim N Dim strQuerySQL As String Dim rst As ADODB.Recordset Set rst = New ADODB.Recordset strQuerySQL = "SELECT MAX(" & strField & ") FROM " & strTable If Len(strWhere) > 0 Then strQuerySQL = strQuerySQL & " WHERE " & strWhere End If With rst .Open strQuerySQL, _ CurrentProject.Connection, _ adOpenStatic, _ adLockReadOnly If Not .BOF Then .MoveFirst N = Nz(.Fields(0), 0) End If End With Exit_DBMax: On Error Resume Next rst.Close Set rst = Nothing DBMax = N Exit Function Err_DBMax: MsgBox "SELECT 文の実行時にエラーが発生しました。(DBMax)" & Chr$(13) & Chr$(13) & _ "・Err.Description=" & Err.Description & Chr$(13) & _ "・SQL Text=" & strQuerySQL, _ vbExclamation, " 関数エラーメッセージ" Resume Exit_DBMax End Function
その他の回答 (2)
- nicotinism
- ベストアンサー率70% (1019/1452)
Ctrl + ' (Ctrlキー と シングルクォーテーション)で直前値がコピーできますが ご存知かな。 自動的に直前値を新規レコードの規定値に代入するためには VBAで設定してやらねばなりません。 基本形は、それぞれのコントロールの更新後処理にデータ型に合わせて Private Sub 日付_AfterUpdate() '日付型の規定値変換 Me.ActiveControl.DefaultValue = "#" & Me.ActiveControl.Value & "#" End Sub Private Sub 文字_AfterUpdate() '文字列型の規定値変換 Me.ActiveControl.DefaultValue = "'" & Me.ActiveControl.Value & "'" End Sub Private Sub 数値_AfterUpdate() '数値型の規定値変換 Me.ActiveControl.DefaultValue = & Me.ActiveControl.Value End Sub とすれば初回の入力時は無効ですが、二回目以降は直前の値が規定値として 新規レコードに代入されます。 フォームをデザインビューにして、プロパティを表示 → イベントタブを選択 更新後処理の欄に、[・・・] こんなのをクリックしイベントプロシージャ内に 上記例を参考に記述してみて下さい。 ※Me.ActiveControl. の部分はそれぞれのコントロール名にしておいた方が良いかも? Me.ActiveControl. → Me!コントロール名. ドットをお忘れなく
s_husky です。 DBLookup関数はDLookup関数に酷似したタイプを紹介していました。 よって、 Private Sub Form_Current() Dim lngMaxID As Long If Me.NewRecord Then lngMaxID = DBMax("ID", "テーブル1") Me.作成日.DefaultValue = """" & DBLookup("作成日", "テーブル1", "ID=" & lngMaxID) & """" End If End Sub が正しいです。