Accessフォームで時刻を入力する方法 保存と自動入力の設定

概要

この記事の結論
Accessフォームで時刻を保存するには、テーブルの日付/時刻型フィールドにテキストボックスを連結し、書式を時刻に設定します。書式だけでは保存先は作られません。現在時刻の初期入力には既定値のTime()、日時の記録にはNow()を使い、ボタンで記録する場合は押した瞬間の値を代入します。この記事では設定手順から、入力定型との違い、日付をまたぐ勤務時間、保存されない場合の確認まで説明します。

この記事でわかること

  • 時刻入力は保存先と表示を分けて考える
  • フォームの時刻入力欄を設定する
  • ボタンを押した時刻を記録する
  • 入力と保存のトラブルを切り分ける

この記事の主な内容

  1. 時刻入力は保存先と表示を分けて考える
  2. 日付と時刻を保存するテーブルを用意する
  3. フォームの時刻入力欄を設定する
  4. 現在時刻を自動入力する方法を選ぶ
  5. ボタンを押した時刻を記録する
  6. 日付をまたぐ作業時間を計算する
  7. 入力と保存のトラブルを切り分ける
  8. よくある質問

想定読了時間:約16分~20分


時刻入力は保存先と表示を分けて考える

Accessで時刻を入力するフォームは、日付/時刻型のフィールドに連結したテキストボックスを使って作ります。連結とは、画面の入力欄とテーブルの保存先を結び付けることです。書式を時刻に変える操作は、表示の調整に当たります。

例えば受付時刻を「09:30」と表示できても、入力欄が非連結なら通常のレコード保存ではその値はテーブルへ入りません。反対に、日付を含む値を保存していても、時刻書式では日付部分が画面に出ません。保存と見た目を別々に確認しましょう。

設定役割受付入力の例
データ型保存する値の種類日付/時刻型
コントロールソース入力欄の保存先受付日時
書式値の表示方法hh:nn
既定値新規レコードの初期値=Now()
保存先の日付/時刻型、テキストボックスの連結、時刻書式の役割を示す図

この手順で扱う範囲

以下はWindows版の通常の日付/時刻型を使う例です。日付/時刻拡張型や、SQL Server側で日時を自動記録する構成は個別に確認してください。Accessのバージョンによってタブ名が異なる場合がありますが、対象テキストボックスのプロパティシートで設定する考え方は同じです。


日付と時刻を保存するテーブルを用意する

まず、何を記録したいかを決めます。「毎日の始業予定は9時」という時刻と、「10月15日の9時に受付した」という日時は意味が違います。後から日付別に集計したい記録には、年月日も持つ日時を保存すると判断しやすくなります。

記録する内容保存方法の例注意点
毎日の開始予定日付/時刻型に時刻対象日を別項目で管理するか決める
受付や作業開始の記録日付/時刻型に日時表示を時刻だけにしても日付は残る
作業にかかった長さ数値型に分数など単位を明示し24時間超にも対応する

データベースの複製で、テーブル「T_受付」をデザインビューで開きます。主キーの「受付ID」と日付/時刻型の「受付日時」を用意し、保存します。既存の短いテキスト型を変更すると変換できない値が出る可能性があるため、まず新しいフィールドを追加して確認する方法が安全です。

時刻だけ、日時、分数で保存する経過時間を比較する図

未入力と午前0時を区別する

時刻の未入力はNull、午前0時は有効な時刻です。必ず記録する業務なら値要求などで未入力を防ぎます。一方、終了前の作業で終了日時を空欄にする設計では、空欄を勝手に0時へ置き換えないようにします。未完了の状態が分からなくなるためです。


フォームの時刻入力欄を設定する

次の手順は、受付日時を保存しつつ、入力欄では時刻を見せる設定例です。日付も入力させたい場合は、書式を日時全体の表示にして、利用者が対象日を確認できるようにしてください。

1. フォームを複製し、デザインビューで開きます。フォーム全体のレコードソースに「T_受付」または受付日時を含む更新可能なクエリを指定します。

2. [既存のフィールドの追加]から「受付日時」を配置します。手動配置ならテキストボックスのコントロールソースを「受付日時」に設定します。

3. 入力欄を選びF4を押します。ラベルではなく、値が表示されるテキストボックスを選んでいることを確認します。

4. [その他]などのタブで名前を「txt受付日時」にします。[書式]タブの書式には「hh:nn」を指定します。nは分を示す書式文字です。

5. フォームビューに切り替えて「9:30」を入力し、別レコードへ移動して保存します。フォームを閉じて開き直し、テーブルにも値があるか確認します。

時刻のみを手入力した値と、Now()で日付も含めて記録した値を、説明なく同じ欄へ混在させないことが大切です。受付記録なら日時の表示欄も設けるか、入力時の日付を業務ルールに沿って補う処理を別途設計します。

デザインビューから連結先と書式を設定し保存確認する流れ図

入力定型は必要な場合だけ使う

「09:30」のように入力の形をそろえるには入力定型を利用できます。ただし書式と入力定型は目的が違います。まず「9:30」が正しく保存されることを確認し、その後で必要な入力補助を追加すると、原因を分けて調べられます。

日付/時刻フィールドに入力定型を設定すると日付選択カレンダーを利用できなくなる制約があります。また、数字だけの「930」を自動的に9時30分へ変換するものとは限りません。数字のみの入力が必要なら、専用の入力欄と妥当性確認を用意してから日時へ変換します。


現在時刻を自動入力する方法を選ぶ

自動入力には、初期値を入れる方法、操作した瞬間を記録する方法、現在値を表示する方法があります。同じTimeやNowを使っていても結果の意味は異なります。受付時刻を正確に残したいなら、いつの時点を記録するのかを先に決めましょう。

方法設定例使う場面
連結欄の既定値=Time()新規入力の時刻候補を入れる
連結欄の既定値=Now()新規入力の日時候補を入れる
ボタンのクリック時Me!txt受付日時 = Now()押した瞬間の日時を入れる
非連結の計算表示コントロールソースに =Now()参照用の日時を表示する

既定値は新規レコードに適用される初期値です。既存レコードを開くたびに上書きする設定ではありません。また、新規入力を始めてから保存するまで時間がかかると、初期値と保存時刻は一致しません。保存時刻そのものが必要な場合は保存処理側の設計が必要です。

既定値、ボタン記録、計算表示の違いを比較する図

現在時刻を示す計算欄も、保存済みの受付日時とは別物です。再計算で変わり得るうえ、秒単位の時計のように自動更新し続けるとは限りません。「受付済みの証拠」として使う場合は、連結フィールドへ固定した値を保存してください。

設定変更の影響範囲を判断できない場合は

共有データや既存の計算式まで影響する場合は、症状・対象画面・期待する結果を整理してAccessの教科書へご相談ください。データの持ち方と表示・集計の設定を分けて確認すると、必要な改修範囲を検討しやすくなります。


ボタンを押した時刻を記録する

連結済みの「txt受付日時」があるフォームへボタン「cmd時刻記録」を追加します。ボタンの[クリック時]を[イベントプロシージャ]にし、コードビルダーで次の処理を設定します。この例は既存値を誤って置き換えないよう、値がある場合に確認します。

Private Sub cmd時刻記録_Click()
    On Error GoTo ErrHandler

    If Not IsNull(Me!txt受付日時) Then
        If MsgBox(“受付日時を現在の日時に置き換えますか。”, _
                  vbYesNo + vbQuestion) <> vbYes Then Exit Sub
    End If

    Me!txt受付日時 = Now()
    Exit Sub

ErrHandler:
    MsgBox “日時を入力できませんでした。” & vbCrLf & _
           Err.Description, vbExclamation
End Sub

上のコードは値を代入する処理で、保存成功まで保証するものではありません。通常はレコード移動などで保存されます。ボタンで保存も確定したい場合は、代入後に「If Me.Dirty Then Me.Dirty = False」を追加できますが、フォーム上の他の変更も一緒に保存され、必須項目不足などで失敗することがあります。

コードを試す前にテキストボックス名と連結先を確認してください。書式を変えても、Now()で代入された値から日付が消えるわけではありません。また端末の時計を参照するため、複数PCの記録を厳密に比較する場合は時刻同期やサーバー側での記録も検討します。

押下時刻を連結欄へ代入し保存と再表示で確認する図

日付をまたぐ作業時間を計算する

深夜作業を扱うなら、開始と終了を両方とも日時で保存します。23:30と翌日1:15は、時刻だけを見ると終了が開始より前に見えます。開始日と終了日が分かれば、翌日の作業として正しく区別できます。

クエリの計算列は、例えば次のように定義します。開始日時と終了日時が日付/時刻型で、未入力や終了の前後関係を別途確認することが前提です。nは分単位で、DateDiffは指定した単位の境界を数える関数です。秒の扱いや端数処理の規則も決めておきましょう。

経過分: DateDiff(“n”,[開始日時],[終了日時])

開始日時終了日時分単位の例
2026/10/15 09:002026/10/15 10:3090分
2026/10/15 23:302026/10/16 01:15105分
2026/10/15 09:00未入力作業中として扱う
開始と終了を日時で保存し差分を分単位で求める考え方図

経過時間は時刻の書式で表すと24時間で折り返すなど、長さを誤認する原因になります。合計作業時間は分や秒の数値で集計し、表示時に「25時間30分」などへ整える設計が適しています。休憩時間や日別の丸め方は、日時入力とは分けた業務ルールとして決めます。


入力と保存のトラブルを切り分ける

「時刻が変」「保存されない」という症状では、まず保存された値と画面表示を比べます。フォームに見えているだけなら、非連結や計算欄の可能性があります。テーブルに正しい値があるなら、表示書式や入力欄の幅を確認します。

症状確認する場所対処の方向
閉じると値が消えるコントロールソース日時フィールドに連結する
入力できない編集ロック、使用可能、フォームの更新可否意図した制限か確認する
保存時に止まる必須項目、入力規則、更新可能なクエリか表示されたエラーの原因を直す
日付が見えないテキストボックスの書式日時全体を一時表示して確認する
既定値が反映されない新規か既存か、テーブルとフォームの既定値新規レコードで確認する
時刻がずれるPC時計、外部連携先の時刻基準時刻基準を統一する
連結先、更新可否、入力規則、保存結果の確認点図

運用前の確認とまとめ

設定が完了したら、通常入力だけでなく、空欄、午前0時、23時59分、既存レコード、日付をまたぐ記録で確認します。入力直後の画面だけで判断せず、保存後にフォームを開き直して値が残っていることまで確認してください。

時刻入力の要点は、保存型、連結先、表示書式、記録タイミングをそろえることです。予定時刻なら手入力の分かりやすさ、受付履歴なら日時の確実な保存、勤務時間なら日跨ぎと集計単位を優先します。用途ごとに必要な設定を選ぶと、後からの修正も少なくなります。

新規、既存、未入力、深夜、再表示の確認項目図

よくある質問

書式だけでは保存先は決まりません。テキストボックスのコントロールソースが、フォームのレコードソースにある日付/時刻型フィールドを参照している必要があります。非連結欄に入力した時刻は、通常のレコード保存だけでは残りません。まず入力欄を選んでF4を押し、[データ]タブを確認してください。テスト入力後に別レコードへ移動し、フォームを開き直す確認とテーブル側の確認を組み合わせると、表示と保存を取り違えずに判断できます。

Timeは現在の時刻、Nowは現在の日付と時刻を返します。毎日の予定時刻だけが必要なら時刻で足りますが、受付履歴や作業開始の記録では、いつの日の出来事か分かるNowが適しています。Nowを入れて書式を時刻だけにしても、保存値の日付は残ります。日付をまたぐ差分計算や履歴確認を考慮して選びましょう。どちらもPCの時計を基にするため、複数端末で厳密に記録する業務では端末の時刻同期と共通の時刻基準も確認します。

既定値は新規レコードに入る初期値であり、既存データを一括更新する設定ではないためです。フォームを開いたときに過去の受付が表示されていても、その日時が現在値に置き換わらないのは意図した動作です。新規レコードへ移動して確認してください。既存値の補正が必要なら対象と補正理由を決め、バックアップ後に更新処理を行います。なお初期値を設定した後、入力に時間がかかると、その値は保存を完了した瞬間の時刻とは一致しません。

書式を時刻にしただけで、数字の930が常に9時30分へ変換されるとは考えないでください。まずは9:30のように区切って入力する方法が分かりやすく、環境差も確認しやすくなります。数字だけの入力を採用するなら、専用の入力欄で桁数と時・分の範囲を調べ、妥当な値だけを日時へ変換する処理を設けます。入力定型は入力の形をそろえる補助機能です。930、0930、2400、空欄などを試し、利用者の想定と一致するか確認しましょう。

開始日時と終了日時を年月日付きで保存し、DateDiffで分や秒の差を求めます。例えば10月15日23時30分から10月16日1時15分なら105分です。時刻だけで差を取ると負の値になるなど、日付の判断ができません。終了が未入力なら作業中として区別し、無条件に0時へ置き換えないようにします。さらに休憩控除、日別集計、端数処理は別のルールです。24時間超の合計は時刻書式へ押し込まず、分数などの数値で管理してください。

代表的なのは、入力欄が非連結、コントロールソースがTimeなどの計算式、またはレコード保存に失敗しているケースです。まず連結先のフィールド名と元クエリの更新可否を確認します。そのうえで他の必須項目、入力規則、編集ロックも調べてください。保存後にフォームを閉じて開き直し、テーブルにも値があるかを比べます。計算欄の現在時刻が表示されているだけなら、受付履歴は残りません。表示用の欄と記録用の欄を分けると判断しやすくなります。

VBAで連結欄に値を代入した時点では、通常は編集中のレコードに変更が入った状態です。レコード移動などで保存されますが、必須項目不足や入力規則違反があると保存できません。クリック時に確定したいなら、代入後にDirtyプロパティをFalseにする処理などを設けます。ただしそのレコードの他の変更も一緒に保存されます。保存成功と入力成功を区別し、エラー時には利用者へ理由を知らせてください。履歴を上書きする場合の確認も用意します。

設定変更の影響範囲を判断できない場合は

共有データや既存の計算式まで影響する場合は、症状・対象画面・期待する結果を整理してAccessの教科書へご相談ください。データの持ち方と表示・集計の設定を分けて確認すると、必要な改修範囲を検討しやすくなります。


関連記事

Accessのフォームとは

Accessのプロパティシートの使い方

Accessのコントロールソースとは

Accessのクエリとは

参考情報

Microsoft 日付と時刻の書式
https://support.microsoft.com/en-us/access/format-a-date-and-time-field

Microsoft フィールドとコントロールの既定値
https://support.microsoft.com/en-us/access/set-default-values-for-fields-or-controls

Microsoft 入力定型による入力形式の制御
https://support.microsoft.com/en-us/access/control-data-entry-formats-with-input-masks

Microsoft DateDiff関数
https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/datediff-function

Microsoft Now関数
https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/now-function

TOP