- ベストアンサー
アクセスのDMAXをVBAで記述したい
今は、マクロで値の代入を使い アイテム=[ID] 式=DMax("ID","テーブル名")+1 として連番の次の番号を振ろうとしています。 これと同じことをVBAでやるにはどのように 記述すれば良いのでしょうか。 宜しくお願い致します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
すみません。不都合な回答になっているので 単純に以下で試してみてみてください。 (頭がボーっとしていて、回答になっていませんでした。) Private Sub 名前_AfterUpdate() If Not IsNull(Me!名前) Then Me!ID = DMax("ID", "テーブル名") + 1 Else End Sub これだと、「ID」が主キーの場合、名前が空白の場合、 レコードを移動しようとするとAccessからエラーが出ます。 「インデックス、または主キーにはNull値を使用できません」 このようなエラーです。フォームを閉じない限りこのエラーは 出続きます。このエラーを利用するほうがあれこれ複雑な エラー処理をするよりはましかもしれません。 必要な追加処理、状況の把握のずれなどがありましたら 補足してください。
その他の回答 (4)
- piroin654
- ベストアンサー率75% (692/917)
すみません。No3の続きというか、No3の書き直しということで 少し変更してみます。 フォームの更新前処理で以下のように してみるとどうなりますか? Private Sub Form_BeforeUpdate(Cancel As Integer) If Not IsNull(Me!名前) Then Me!ID = DMax("ID", "テーブル2") + 1 Else If MsgBox("レコードを破棄しますか", vbYesNo) = vbYes Then Me.Undo Else Cancel = True End If End If End Sub
- piroin654
- ベストアンサー率75% (692/917)
少し、したいことが不明の点があるので、 先読みのような回答ですが。 いずれかのフィールドの更新後処理でするとします。 もし、「ID」が主キーの場合は、いずれかのフィールドに何らかの 数値、あるいは文字を入れるとそのレコードはDirty状態でも 主キーがNullだと、エラーがでるので、、レコードの確定を ないものとしたい場合はUndoを使ってレコードの確定を回避するようにします。 ただし、Accessのシステムからのエラーを回避することも必要になります。 たとえば、レコードで必ず必須のフィールドが「名前」というフィールドならば、 以下のように。 Private Sub 名前_BeforeUpdate(Cancel As Integer) 'Accessのエラーを回避 On Error Resume Next If Not IsNull(Me!名前) Then Me!ID = DMax("ID", "テーブル名") + 1 Else If MsgBox("名前が抜けています。レコードを破棄しますか", vbYesNo) = vbYes Then Me.Undo End If End If End Sub 何かまだ必要な処理がある、あるいは状況の把握がずれていたら 補足してください。
- piroin654
- ベストアンサー率75% (692/917)
No1です。 肝心なことを忘れていました。 このマクロについて、 (1) どのような場面で。 (2) どのように使用。 (3) 取得した値をどこにもっていく。 の3点について説明があれば、と思います。
- piroin654
- ベストアンサー率75% (692/917)
質問ですが。 (1) DMAX関数を他の方法でしたい。 (2) マクロをVBAに変更したい。 (3) DMAXもマクロも他の方法にしたい。 いすれでしょうか? また、質問のマクロで不自由をしていることがあるのでしょうか?
補足
フォームの起動時にIDの連番のデータがあるので最初はマクロで値の代入でDMAXを使っていたのですが、表示はうまくいくのですが、IDの部分にカーソルを持っていき文字を打ち込むと入ってしまうのでロックも同時にかけたいと思っています。そうするとマクロだけではおぎなえず(知らないだけ?)VBAでの記述の仕方が分かればと思い質問させていただきました。