• ベストアンサー
  • 困ってます

ACCESSで今日の日付を自動入力したい

ACCESS2000を使用しています。 [見積書番号][見積書作成日]などの項目があるテーブルから クエリー→フォームと作成しました。 やりたいことは フォームで[見積書番号]が入力されると[見積書作成日] に自動的に"今日の日付"が入力されるようにしたいのです。 (できれば[見積書番号]が変更された場合も[見積書作成日]が変更されるように) 下記のコードを フォームの[見積書作成日]の「更新前処理」に書きましたが エラーは出ませんが、何の反応もありません。 どこが間違っているのでしょうか? VBAはあまり詳しくないのでアドバイスお願いいたします。 Private Sub 見積書作成日_BeforeUpdate(Cancel As Integer) If [見積書番号] <> Null Then [見積書作成日] = Date ElseIf [見積書番号] <> OldValue Then [見積書作成日] = Date Else End If End Sub

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数808
  • ありがとう数1

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

  • ベストアンサー
  • 回答No.3

> 「見積書番号は必須です」が出てきて消えず、ちょっと大変でした。 失礼しました(汗) 見積書番号を空欄にしても特にMsgBoxを出さなくて構わないのでしたら、 以下のようになります; Private Sub 見積書番号_BeforeUpdate(Cancel As Integer) If IsNull([見積書番号]) = False Then  '前回のTrueから変更  '以下、前回「Else」以降に記述したものと同じコード  If IsNull([見積書番号].OldValue) = True Then   [見積書作成日] = Date  ElseIf [見積書番号] <> [見積書番号].OldValue Then   If MsgBox("見積書作成日も変更しますか?", vbOKCancel, "確認") = vbOK Then    [見積書作成日] = Date   End If  End If End If End Sub > マクロボタンで入力するとうまくいきませんでした。 マクロ(VBA含む)で値を更新した場合は、更新前/更新後イベントは発生しないので、 強制的に呼び出してやる必要があります。 コマンドボタンのコードもVBAかと思いますので、そちらのコードで値の代入を行った 後に「Call 見積書番号_BeforeUpdate(False)」を追加して下さい。 (引数への「False」指定は必須です) コマンドボタンで入力を行った場合にも、見積書作成日が入力されると思います。 こんな感じです; Private Sub 新規ID入力_Click()  '確認メッセージでOKを選択すると見積書番号を入力  If MsgBox("新規の見積書番号を入力します。", vbOKCancel, "確認") = vbCancel Then Exit Sub  [見積書番号] = Nz(DMax("[見積書番号]", "見積書"), 0) + 1  '見積書番号の更新前イベントを呼び出します  Call 見積書番号_BeforeUpdate(False) End Sub

共感・感謝の気持ちを伝えよう!

質問者からのお礼

DexMachinaさん、ありがとうございました! おかげさまでマクロボタンからの[見積書番号] の入力でも[見積書作成日]が表示されるようになりました。 ボタンによる見積書最新番号の入力はマクロやフォームを使って苦労して設定しましたが、VBAを使えばこんなに簡単にできるのですね。 でも私にはまだまだむずかしいです。

その他の回答 (2)

  • 回答No.2

> どこが間違っているのでしょうか? ・Nullかどうかの判定には、No.1の方の回答にもあるように「IsNull関数」を使用します。  ご質問のように「○○<>Null」にすると、○○がNull以外であってもTrueではなく  Nullが返されるため、条件が満たされないことになり、ご質問のように処理もされず  エラーも出ないことになります。 ・「見積書番号の入力・編集時に今日の日付を入力」なら、イベントの設置先は  「見積書作成日_BeforeUpdate」ではなく「見積書番号_~」です。  (個人的には更新後イベント(AfterUpdate)への設置をお薦め) ・「OldValue」でコントロールの更新前の値を取得するなら、「○○.OldValue」とする  必要があります。(「OldValue」だと、変数扱いされます)  なお、OldValueの値はレコード保存しないと更新されないため、見積書番号を編集  後、保存しないまま再度上書きすると、予想外の結果になる場合があります。  (可能なら、更新後イベントでのレコード保存をお薦め)  (タイプミスしたものなどが変数扱いされるのを防ぐには、コード最上部にある   「Option Compare Database」の次に「Option Explicit」と記述しておきます。   また、新規作成時に自動でこの一文を追加させるには、VBE画面のメニューで   「ツール(T)→オプション(O)」を選択し、「編集」タブの「変数の宣言を強制する」の   チェックをオンにしておきます) ・「If ~ ElseIf ~」の構文が、多分やりたいことの通りになっていないと思います。  (現状のコードが仮に動いたとして、ElseIfが実行されるのは「入力済の番号を   削除(Null)にした場合」になるかと・・・) 以下、修正をかけたコードです(見積書番号が必須と想定); Option Compare Database Option Explicit Private Sub 見積書番号_BeforeUpdate(Cancel As Integer) If IsNull([見積書番号]) = True Then  '見積書番号が削除された場合に更新できなくします。  '(MsgBoxでOKクリック後、Escキーを押すと元の値に戻ります)  MsgBox "見積書番号は必須です。"  Cancel = True Else  '見積書番号が入力された場合  If IsNull([見積書番号].OldValue) = True Then   '新規入力(=OldValueが空)時は今日の日付を即入力   [見積書作成日] = Date  ElseIf [見積書番号] <> [見積書番号].OldValue Then   '別の番号で上書きした場合は更新するか確認   If MsgBox("見積書作成日も変更しますか?", vbOKCancel, "確認") = vbOK Then    [見積書作成日] = Date   End If  End If End If End Sub

共感・感謝の気持ちを伝えよう!

質問者からの補足

DexMachinaさん、ご丁寧にありがとうございました。 >Nullかどうかの判定には「IsNull関数」を使用します。 >イベントの設置先は「見積書番号_~」です。 はい。勉強になりました。ありがとうございました。 教えていただいたコードを入れてみましたが、"お試し"で入れた「見積書番号」を消そうとすると 「見積書番号は必須です」が出てきて消えず、ちょっと大変でした。 あとはやはりAlexSunsのところに書いたのと同じようにマクロボタンで入力するとうまくいきませんでした。

  • 回答No.1

こんな感じですかね ※テキスト書きなので試していません Private m_見積書番号 As Variant Private Sub 見積書番号_GotFocus()   m_見積書番号 = Nz([見積書番号], vbNullString) End Sub Private Sub 見積書番号_AfterUpdate()   If Not IsNull([見積書番号]) Then     If IsNull([見積書作成日]) Then       [見積書作成日] = Date     Else       If Nz([見積書番号], vbNullString) <> m_見積書番号 Then         [見積書作成日] = Date       End If     End If   End If End Sub あと便利な機能として、 「見積書作成日」のプロパティ→「データ」→「規定値」 規定値プロパティに「=Date()」と設定すると今日の日付がデフォルト表示されます

共感・感謝の気持ちを伝えよう!

質問者からの補足

AlexSunsさん、さっそくの回答ありがとうございました。 教えていただいたとおりコードを書きましたがなかなかうまくいかず悩んでいましたがやっと原因がわかりました。 実は「見積書番号」は手入力ではなく、「通し番号の一番新しい番号+1」をマクロボタン(値の代入)を作って入力させるようにしているのです。 このボタンを使うと今までどおり無反応でしたが手入力で「見積書番号」を入れると希望どおり今日の日付が「見積書作成日」に入るようになりました。 この点はもうしょうがないのでしょうか? それから Private m_発出番号 As Variant というのは必要なのでしょうか?どこに書いたらいいのかわからずコンパイルエラーが出るのではずしたのですが、特に問題なく動いてるような気がしてますが・・・ > 規定値プロパティに「=Date()」と設定すると はい、こちらの方は別に項目で使用しています。

関連するQ&A

  • ACCESSのフォーム

    ACCESSのフォームでデータを入力しています。 既に入力したデータを誤って上書きしないように、更新前処理で下記のコードを入れました。 Private Sub 単価_BeforeUpdate(Cancel As Integer) If MsgBox("変更を保存しますか?", vbYesNo) = vbNo Then Me.Undo End If End Sub 入力済のデータを上書きする時はこの方法で良いのですが、新規に入力する時にも同じように確認メッセージが出てしまいます。 新規入力の時には確認メッセージを出さない方法があったら教えて下さい。 よろしくお願いします。

  • エクセル ダブルクリックで処理日の入力

    お世話になります。 先般、お教え頂きました別のダブルクリックイベントプロシージャと 下記の当日の日付を入力するという処理を同じシート上で行いたいのですが、VBエディターにどのように記述したら良いかわかりません。 当方、かなりの初心者です。 よろしくご教授くださいませ。 【新しく加えたい処理】 Option Explicit Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Intersect(Target, Range("b4:C999")) Is Nothing Then Exit Sub If ActiveCell = "" Then ActiveCell = Date Cancel = True End If End Sub 【もともと使っている処理】 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Not Intersect(Target, Range("h1:h999")) Is Nothing Then With Target If .Value = "" Then .Value = "有" ElseIf .Value = "有" Then .Value = "無" ElseIf .Value = "無" Then .Value = "" End If End With ElseIf Not Intersect(Target, Range("i1:i999")) Is Nothing Then With Target If .Value = "" Then .Value = "要" ElseIf .Value = "要" Then .Value = "不要" ElseIf .Value = "不要" Then .Value = "" End If End With End If End Sub よろしくお願いします。

  • access フォームについて

    access2003にて登録フォームを作成しています。 このフォーム内に入力したデータを登録ボタンを押し、「登録しますか」のメッセージに 「いいえ」とすれば保存せずにこのフォームを閉じる。 「キャンセル」とすれば保存せずにフォームに戻る。 「はい」とすれば保存して閉じたいです。 しかし、以下の式を実行すると 「いいえ」はバッチリ希望通りに動くのですが、 「キャンセル」をすると保存されてフォームに戻り、 「はい」とすると保存されずにフォームが閉じられてしまいます。 何がまずいのでしょうか・・・。 ----- Private Sub Form_BeforeUpdate(Cancel As Integer) Dim Ret As Integer Ret = MsgBox("登録しますか?" & vbCrLf & " " & vbCrLf & "「いいえ」を選択すると保存せず閉じます", vbYesNoCancel) '「いいえ」を選択したら、保存せずに閉じる If Ret = vbNo Then DoCmd.Close acForm, "振返りデータ", acSaveNo '「キャンセル」を選択したら、保存せずにフォームに戻る Else If Ret = vbCancel Then Else DoCmd.Close acForm, "振返りデータ", acSaveYes End If End If End Sub

  • Access 更新キャンセルするには?

    Access2000で作成しています。 フォーム上でデータを書き換え後、更新をしない場合はどうしたらよいのでしょうか? 【希望する流れ】  1.データを変更  2.「更新」ボタンクリック     「データの更新をします。よろしいですか?」のメッセージ   (1)更新する場合:データを更新     「データが更新されました」のメッセージ   (2)更新しない場合:データを変更前に戻す     「データの更新がキャンセルされました」のメッセージ  3.フォームを閉じる  4.別のフォームを開く この動作をフォーム上にある「更新」ボタンのクリック時イベントにすることはできますか? とりあえず、現在は以下のようなものが作ってあります。 「VBA」  Private Sub Form_BeforeUpdate(Cancel As Integer)  '更新前確認   If MsgBox("更新します。よろしいですか?", vbYesNo, "更新確認") = vbNo Then   Cancel = True   Me.Undo   End If  End Sub 「更新」ボタンクリック時(こちらはマクロです)  ・フォームを閉じる  ・別のフォームを開く 今の状況では、更新する場合は問題ないのですが、更新しない場合、 「このレコードを保存することができません。  レコードを保存する時にエラーが発生しました。  ・・・・・・・・・・・」 というメッセージが出てきてしまいます。 どのようにVBAを作ればよいでしょうか? 説明不足の場合、補足いたします。よろしくお願いします。

  • ACCESSの重複チェックについて

    顧客データをACCESS2003にて作成しています。 フォームにてVBAを用いて重複チェックをしているのですが、件数が多いせいかチェックに時間が掛かっております。(入力済件数は10万は超えております。) テーブル(T_顧客管理)よりチェック出来るようにしており、チェックのフィールドは「住所」にしております。 Private Sub 住所_BeforeUpdate(Cancel As Integer) If DCount("住所", "T_顧客管理", _ "住所='" & Me!住所 & "'") > 0 Then Beep MsgBox "既存のデータと同じ住所が入力されました! " & _ "別の値を入力してください。", _ vbOKOnly + vbExclamation, "重複エラー" Cancel = True Me.Undo End If End Sub 上記の式を入れておりますが、別の方法(式)にて上記と同じ内容にてチェック出来る式があれば教えていただきたいと思いますので、宜しくお願い致します。

  • access タブコントロールの選択

    フォームAを選択したらAction1,フォームBを選択したらAction2, というモジュールをつくったのですが、そのフォームをタブに入れることにしたため isOpenが使えなくなってしまいました。 タブAを選択していたら、Action1,タブBを選択していたら、Action2, というモジュールに書きかえるにはどうしたらいいですか? ----------------------- Function GetValue() If IsOpen("F_C_2_☆新規作成_パターン1") Then GetValue = Forms![F_C_2_☆新規作成_パターン1]![見積番号] ElseIf IsOpen("F_C_3_☆新規作成_パターン2") Then GetValue = Forms![F_C_3_☆新規作成_パターン2]![見積番号] End If End Function

  • 日付の自動表示がうまくできません。

    VBAを使って、EXCELで日付を自動表示するマクロを作ったのですが、うまく動作しません。 設定の条件は、(対象の行は6~31行目で) D列に入力があった場合、G列に日付を表示、 M列に入力があった場合、N列に日付と時間を表示 です。 Private Sub Worksheet_Change(ByVal Target As Range) Dim r As Integer, c As Integer 'r 行番号 'C 列番号 r = Target.Row c = Target.Column If Target.Count > 1 Then Exit Sub If c <> 13 Or r < 6 Or r > 31 Then End If Cells(r, c) <> "" Then If c = 13 Then Cells(r, c + 1) = Format(Now, "m/d hh:mm") Else Cells(r, c + 1) = "" End If If Target.Count > 1 Then Exit Sub If c <> 4 Or r < 6 Or r > 31 Then End If Cells(r, c) <> "" Then If c = 4 Then Cells(r, c + 3) = Format(Now, "m/d hh:mm") Else Cells(r, c + 3) = "" End If End Sub 作っているうちに、どこがおかしいのかわからなくなってしまいました。 助けて頂ければと思います。

  • ダブルクリックで自動入力

    初心者です。教えて下さい。 一つのBOOKに二つのSheetがあります。 Sheet”データ”のA列に番号が入力してあり、そのセルをダブルクリックすると Sheet”印刷”の(A18)にダブルクリックした番号が入力され、 2回目からは前に入力したセルの一つ下に入力されるようにしたいのですが・・ 下記を自分で作ってみましたが、何度やっても(A18)にしか自動入力されません。 どのようにしたら最終行の下に入力されるようになるのでしょうか? 色々調べてみましたが分かりませんでした・・・宜しくお願い致します。 Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) If Target.Count > 1 Then Exit Sub If Target.Column <> 1 Then Exit Sub Cancel = True With Worksheets("印刷") MyRange = Range("A18").End(xlUp).Offset(1).Address .Range(MyRange).Value = Target.Value Application.Goto .Range(MyRange) End With End Sub

  • 日付型のテキストボックスに数値を入れて日付にしたい

    アクセスのフォームの上にテキストボックスがあり、 書式はyyyy/mm/dd(aaa)になっています。 日付型の値を入力した際は問題ないのですが 例えば、20130720と入力したら、 このフィールドに入力した値が正しくありません。 例えば、数値型のフィールドに文字列を入力しました。 となります。 なので、 Private Sub 日付_BeforeUpdate(Cancel As Integer) If Len(Me.ActiveControl.Value) = 8 Then Me.ActiveControl.Value = Format(Me.ActiveControl.Value, "yyyy/mm/dd") End If End Sub としてみたのですが、 更新前処理イベントが発動する前に、 「このフィールドに入力した値が正しくありません。 例えば、数値型のフィールドに文字列を入力しました。」 のエラーが出てしまうようです。 20130720の形の日付を入れても自動で日付型に変換するの方法はありますか?

  • ACCESS重複のチェック

    ACCESSで重複チェックをしたいと思います。 現在は電話番号テーブルだけしかありません。 電話番号のテーブルを主キーを使って重複している場合エラーメッセージを出すというものです。保存ボタンもありません。 Private Sub text電話番号_BeforeUpdate(Cancel As Integer) If IsNumeric(text電話番号) = False Then '数字チェック。 MsgBox "電話番号は数字で入力して下さい。", vbCritical Cancel = True ' 処理を取り消します。 Me.Undo End If Dim strmsg As String strmsg = "重複しています" If Not IsNull(DLookup("[電話番号]", "ダブリチェックテーブル", "[電話番号] = [text電話番号]")) Then MsgBox strmsg, 16, "ダブリチェック" Cancel = True '処理を取り消します。 Me.Undo '元に戻します。 Else Cancel = False '処理を続行します。 End If End Sub これに、企業名と出発日という項目を増やしたいと思います。 ですが、何万とある電話番号を一気に入力して調べているので、一回一回企業名と出発日を入れていると生産性が落ちます。 ですので、企業名と出発日は最初の入力だけで次のレコードに移動してを継続させたいのです。そして電話番号以外にカーソルを行かないようにしたいです。 何か良い方法があればご教授お願いします。 ちなみにいろいろ自分なりに試したのですが、重複してエラーを出した場合に企業名にカーソルが飛んだししてうまくいきませんでした。