海外旅行から帰ってきたら、まず何を食べる?

ACCESS2000を使用しています。

[見積書番号][見積書作成日]などの項目があるテーブルから
クエリー→フォームと作成しました。

やりたいことは
フォームで[見積書番号]が入力されると[見積書作成日]
に自動的に"今日の日付"が入力されるようにしたいのです。
(できれば[見積書番号]が変更された場合も[見積書作成日]が変更されるように)

下記のコードを
フォームの[見積書作成日]の「更新前処理」に書きましたが
エラーは出ませんが、何の反応もありません。
どこが間違っているのでしょうか?
VBAはあまり詳しくないのでアドバイスお願いいたします。

Private Sub 見積書作成日_BeforeUpdate(Cancel As Integer)
If [見積書番号] <> Null Then
[見積書作成日] = Date
ElseIf [見積書番号] <> OldValue Then
[見積書作成日] = Date
Else

End If
End Sub

A 回答 (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
    • good
    • 0
この回答へのお礼

DexMachinaさん、ありがとうございました!
おかげさまでマクロボタンからの[見積書番号] の入力でも[見積書作成日]が表示されるようになりました。

ボタンによる見積書最新番号の入力はマクロやフォームを使って苦労して設定しましたが、VBAを使えばこんなに簡単にできるのですね。
でも私にはまだまだむずかしいです。

お礼日時:2007/06/18 11:41

> どこが間違っているのでしょうか?



・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のところに書いたのと同じようにマクロボタンで入力するとうまくいきませんでした。

補足日時:2007/06/14 17:04
    • good
    • 0

こんな感じですかね


※テキスト書きなので試していません

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()」と設定すると
はい、こちらの方は別に項目で使用しています。

補足日時:2007/06/14 17:00
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!