• ベストアンサー

アクセスのフォーム入力について

アクセス初心者です。操作方法でどうしてもわからないところがあり、知識を分けていただけたら嬉しいです。 仕事で、フォームを使って新規データ入力を行うことがとても多いのです。新しいレコードにデータを入力する際に、最終レコードのデータが初期値として入力されているようにすることは可能でしょうか? 日付などの共通のデータが、新しいレコードの初期値として予め入っていればとても助かります。新レコード入力の際に、常に最終レコード(一つ前に入力したデータ)の値を入れておく方法があれば、ご伝授をお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#22222
noname#22222
回答No.1

ここでは敢えて既定値の設定でもって代入する方法を案内します。 もちろん、同じ手法で、直接に 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)
回答No.3

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!コントロール名. ドットをお忘れなく

noname#22222
noname#22222
回答No.2

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 が正しいです。

関連するQ&A

  • アクセスでフォームにカレンダーを用いて入力する際の困りごと

    アクセスでフォームにカレンダーを用いて入力する際、同じ日付を続けて入力できないのはなぜでしょうか。  2006年1月25日を選択したレコードを保存して、 次のレコードも2006年1月25日を選択しようとしても反応しません。違う日付をいったんクリックしてからやると選択できるのですが、大量のデータを処理しようとする際は、かなりのストレスになりそうです。 宜しくお願いします。

  • アクセス フォームで同じ日にちを自動で入力させるには

    こんばんは。 アクセスで次のようなテーブルを作りました。 日   コード   工数(分) 5/2   12345    30 5/2   15555    20 5/2   13456    50 5/3   13545    100 このデータをフォームから入力させたいのですが、 同じ日付を何度も入力させるのが大変なので、 5/2  コード 工数     コード 工数 1度入力しただけで、次のレコードにも同じ日付が入るようにしたいのです。 また、5/2を一つのレコード。 5/3を次のレコードと認識してくれ、画面が切り替わるようにしたいのですが、アクセスではどのようにすれば良いのでしょうか。 (コードは月により変化します。) 宜しくお願い致します。

  • Accessのフォームでの入力について

    Win7 Access2003 コード(01-0010-000 ~ 99-9999-999) 名前 住所 電話番号 といったデータベースがあって、フォームでコンボボックスからコード入力しています。 「05-0280-000」とハイフォンも含めて入力すればいいのですが、「050280000」と省略入力したく思っています。 書式を「!00\-0000\-000」「!99\-9999\-999」ではダメで、「!@@\-@@@@\-@@@」にすると希望通り表示されますが、「名前 住所 電話番号」が常に先頭のレコードのデータになってしまいます。 「050280000」と入力すると「05-0280-000」と表示されて、「05-0280-000」のデータが出るようにできないでしょうか? どうぞ、宜しくお願いいたします。  

  • ACCESS フォーム

    ACCESSの初心者です。 フォームのメインフォーム、サブフォームを使ってデータを入力しています。 サブフォームにデータを入力後、マウスを使わないで次のレコードに移動したいのですが、どのような方法がありますか。   よろしくお願いします。

  • Access フォーム

    Accessでデータベースを作成しようと思っています。データ入力のフォームを作成して、利用者がそのフォームに値を入力する形式にするつもりです。 ただ、利用者には入力のインターフェースだけを公開したいのですが、フォームを表示するとAccess自体が起動しするので、その気になればデータベースに対して全ての操作が可能になってしまいます。 Accessってこういうものなのでしょうか。

  • Accessでフォーム上に 直前の データを表示させるには

    Accessでフォーム上で、データを入力するのに、一つ前のレコードの データを基参考に 次のデータを入力したいと思います。一つ前のレコードを そのフォーム上に表示させるには どうすれば良いのでしょうか? あるレコードのすべてのフィールドの値を表示させたいのです。

  • アクセスのフォームで

    アクセスのフォームで、ボタンを作成し、新規データ入力に際にそのボタンをクリックすると入力したデータが確定となり、次のレコード(新規データ)の入力になる様にするにはどうしたいいですか? 逆に言えば、そのボタンをクリックしない限り、次の新規レコード入力へ行けない様にしたいです。又、ボタンをクリックしても空白の項目があれば次へ行けない様にしたいです。 教えて下さい。よろしくお願いします。

  • ACCESSのフォームでの入力について

    ACCESS2000を使用しています。初心者のほうです。住所録のテーブルを作って、作業用のフォームを表形式で作りました。そのフォームに宛名印刷するためのコマンドボタンを配置しています。フォーム上で一件入力し、そのコマンドボタンを実行するのですが、その時点ではレコードとして入力されていないようで、実行できません。フォームを一度閉じて、また開くと出来るようになります。1件のレコードをフォームから入力すると同時にテーブルへも保存されていくようにしたいのですが、簡単にやる方法はないでしょうか?

  • アクセス フォームのマクロに関して

    アクセスでマクロにてフォームを閉じるを選択しているのですが 新規レコードが必ず追加されてしまいます。 そのフォームはデータ入力用のフォームなのですがデータ入力終了時 テキスト欄をすべて空白でマクロの閉じるを実行させると 必ずテーブルに空白の新規レコードが入力されてしまいます。 なにかいい方法ありますでしょうか?

  • Accessフォームの入力について

    Access2000・単票形式でのフォーム入力について教えてください。 入力の途中で、カーソルが次のページ(レコード)へ移動してしまいます。(例:レコード9の内容入力中、レコード10やレコード11などへ移動) どうしたらなおるでしょうか。 よろしくお願いします。

専門家に質問してみよう