• ベストアンサー

アクセスのDMAXをVBAで記述したい

今は、マクロで値の代入を使い アイテム=[ID] 式=DMax("ID","テーブル名")+1 として連番の次の番号を振ろうとしています。 これと同じことをVBAでやるにはどのように 記述すれば良いのでしょうか。 宜しくお願い致します。

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

すみません。不都合な回答になっているので 単純に以下で試してみてみてください。 (頭がボーっとしていて、回答になっていませんでした。) Private Sub 名前_AfterUpdate()   If Not IsNull(Me!名前) Then     Me!ID = DMax("ID", "テーブル名") + 1   Else End Sub これだと、「ID」が主キーの場合、名前が空白の場合、 レコードを移動しようとするとAccessからエラーが出ます。 「インデックス、または主キーにはNull値を使用できません」 このようなエラーです。フォームを閉じない限りこのエラーは 出続きます。このエラーを利用するほうがあれこれ複雑な エラー処理をするよりはましかもしれません。 必要な追加処理、状況の把握のずれなどがありましたら 補足してください。

その他の回答 (4)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.5

すみません。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)
回答No.3

少し、したいことが不明の点があるので、 先読みのような回答ですが。 いずれかのフィールドの更新後処理でするとします。 もし、「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)
回答No.2

No1です。 肝心なことを忘れていました。 このマクロについて、 (1) どのような場面で。 (2) どのように使用。 (3) 取得した値をどこにもっていく。 の3点について説明があれば、と思います。

chi_ko6262
質問者

補足

フォームの起動時にIDの連番のデータがあるので最初はマクロで値の代入でDMAXを使っていたのですが、表示はうまくいくのですが、IDの部分にカーソルを持っていき文字を打ち込むと入ってしまうのでロックも同時にかけたいと思っています。そうするとマクロだけではおぎなえず(知らないだけ?)VBAでの記述の仕方が分かればと思い質問させていただきました。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

質問ですが。 (1) DMAX関数を他の方法でしたい。 (2) マクロをVBAに変更したい。 (3) DMAXもマクロも他の方法にしたい。 いすれでしょうか? また、質問のマクロで不自由をしていることがあるのでしょうか?

関連するQ&A

  • サブフォームをブランクで開きたい(値の代入)

    現在、サブフォームを開く時に値の代入の後、DMax関数で+1をして最後のレコードに+1したIDをマクロで行っていますが、VBAでできないでしょうか? 1.サブフォームを開く Cmd Open フォーム名 2.値の代入で(””)をいれフォームをクリア 3.値の代入でID=DMax"テーブル”+1 良い知恵があれば教えて頂けないでしょうか マクロにあまり頼りたくないので宜しくお願い致します。

  • ACCESSのDMAXについて

    ACCESSでの、クエリーの書き方での質問です。 やりたいことは、テーブル中のデータから、最大値を求めて、+1して、レコードを追加したいのです。 商品番号、商品名、番号というテーブルから、商品番号と商品名が一致した中から、 最大の個数を求めるDMAX関数の書き方をどのようにしたらよろしいでしょうか? イメージ的には、 商品番号 商品名 番号 00001   鉛筆    2 00001   鉛筆    3 00001   鉛筆    1 00002   鉛筆    4 となっていた場合、商品番号に「00001」、商品名に「鉛筆」を与えたとき、答えの番号「3」を求めます。 イベントプロシージャではなく、クエリーの画面のフィールド式です。 追加クエリーで、その求めた「3」に+1して、番号を「4」にして新しいレコードを書き込む・・・ なんていうことは可能でしょうか。 VBAでやるのは、なんとなくわかるのですが、クエリーの画面での書き方がわかりません。 (それとも出来ないものなのでしょうか?)

  • AccessのVBAでの日付の計算の記述のしかた

    AccessのVBAで日付の計算をしようとしています。 DateAdd("m",6,Date()) と入力するとコンパイルエラーになります。 どこが間違っているでしょうか。 マクロウィンドウで値の代入とかやっていたときは、これでできていた気がします。 VBAだと記述の仕方が変わるんでしょうか。 実際は、「6」とか「Date()」のところに フィールド名を入れたいのですが、それって可能でしょうか。 ものすごく初歩的な質問だとおもいますが、 回答よろしくお願いします。

  • access dmaxで#error

    ずぶの素人で、一からデータベースを作らねばならず、職場にわかる人間もいず、参考書とグーグルを駆使しながらコピペ、改変で頑張って作っています。 質問はテキストボックス内の式ビルダです。 請求日を管理していて、直近の請求日と、その一つ前の請求日をフォームに表示させたいと思っています。 顧客はIDにて管理していて、請求日テーブルに顧客ID、請求日の2つのフィールドを作り、どんどん追加していく仕組みにしています。 フォーム上に表示されているIDを条件にテーブルから抽出しています。 直近の請求日を抽出する式 =DMax("請求日","T請求日","id=" & [ID]) 二番目の請求日を抽出する式 =DMax("請求日","T請求日","請求日 < #" & DMax("請求日","T請求日","id=" & [ID]) & "# and id=" & [ID]) こちらをフォーム上のテキストボックスの式にそれぞれ入れています ここで、全く請求していない顧客の場合、直近の請求日は空白となるのですが、二番目の請求日に#errorが出てしまいます。 検索してもiifとisnullを使った回避策しか出てこなく、これを式に組み入れも解決しませんでした。 もともとの式もネット上にあったソースを改変し作っていますので、間違っているかもしれません。 今のところ、請求日が入っている顧客に関しては問題なく表示しています。 何卒ご指導お願い致します。

  • AccessのDMax関数使用後のテキストの表示

    Accessで項目の表示がうまくいきません。 もともとテキスト型の項目で、例えば「0005」というデータがあります。 それがフォーム(1)ではそのまま「0005」と表示されます。 それにマクロでDMax関数を使用して1足し込み、値の代入をし、フォーム(2)で表示すると、 「6」と表示されます。 「0006」と表示させたいのですが、どうすればいいでしょうか。 また、「6」ではなく「0006」でレコードの更新もしたいのですが、可能でしょうか。 (要は、その都度最新の番号を取得して、その番号でレコードの更新もしようとしているのですが。) おわかりの方、回答よろしくお願いします。

  • ACCESSで、DMax関数の条件の書き方

    ACCESS2002を使用しています。 自動的に連番を採番するコードを書きましたが、DMax関数でうまく最大値を取得できません。 条件式がうまく書けていないと思うのですが、どうぞお知恵をお貸しください。 テーブル[t_受注]にあるフィールド[受注コード]は、「yyyymm000」のように9桁表示です。 「yyyymm」の部分は現在の年月から取得し、「000」の部分は年月ごとに001~連番を採番しています。 しかし年月が変わるとうまく最大値を取得できず、次のように連番が採番されてしまいました。 [受注コード] 200705001 200705002 200705003 200705004 200706001 200706005(本当は200706002と自動採番したいのです) 最大値(MaxID)取得するコードはこのように書いております。 よろしくお願いします。 ------------------------------------------------------------------------------------------- Dim NowYearMonth As String Dim MaxYearMonth As String Dim MaxID As String NowYearMonth = Format(Date, "yyyymm") MaxYearMonth = Nz(DMax("Mid$([受注コード],1,6)", "t_受注"), "") MaxID = Nz(DMax("Mid$([受注コード],7,3)", "t_受注"), "NowYearMonth=MaxYearMonth") -------------------------------------------------------------------------------------------

  • ACCESS2007 DMaxについて

    WinVistaでACCESS2007を使っております。 顧客との取引履歴のデータベースを少しずつ作っております。 現在のデータベース構成は簡単に書きますと、 「顧客T」 ・顧客ID ・顧客名 ・ ・ ・ ・最終取引日 「取引T」 ・取引ID ・顧客ID(顧客Tの顧客IDとリレーション) ・取引日 ・取引内容 という感じです。 顧客Tをソースに「顧客フォーム」を作り、そのフォーム内にサブフォームで 取引履歴として「取引履歴サブフォーム」。「取引日」「取引内容」のみ表示して 入力しております。 やりたいことは、フォームを開いた際に、サブフォーム内の取引日の中で 最新の日付をメインフォームの「最終取引日」フィールドに入力して、データ を更新していきたいです。 非連結のフィールドを作って表示だけすればいいのかもしれませんが、 現状データとして格納していきたいです。 VBAでメインのフォーム「開くとき」にDMaxで最大の日付を拾えばいいかと思い 試してみましたが、エラーが出てしまいます。 いろいろ試してみましたが、記述はこんな感じです。 Me.最終取引日=DMax("日付",Me.取引履歴サブフォーム) としてみました。 どなたかお力を貸してください。

  • access 自動採番 「10-AA-0001」にするには。

    宜しくお願いします。 仕様環境:access(2002-2007) 自動で番号を割り振る機能を作っています。 (以前に似た質問をしたのですが、前より理解度が上がったので、ご了承くださいm(__)m) ・・・ まずテストDBなので、テーブルは「案件」一つだけです。 フォームも簡易的な単票形式で簡単なものです。 番号は他のテキストボックスに何か挿入する前の 「挿入前」のイベントを遣っています。 そこで、ご相談です、 まず自動採番で「AA-0001」というものが作れました。 また別フォームに移動し、他のテキストボックスを入力しようとすると 「AA-0002」になりました、以降も~0003、~0004となり成功しました。 そこで更に付け加えたいと思っています。 それは、 「2010-AA-0001」にしたいと思っています。 ご覧の通り、「2010」は「年」です。 更には完成系として「10-AA-0001」と言う風に「年」にあたる、2010の「10」だけ、 抜き出したいと思っており、来年には自動的に2011の「11」にしたいと思っております。 date関数なのかなー、とは何となく思っているのですが、いろいろ工夫してみたのですが、 うまくいきません。 これはマクロでは無理でしょうか? フォームをVBAに変換したものとマクロを記載させて頂きます。 よろしくお願いします。 '------------------------------------------------------------ ' Form_BeforeInsert ' '------------------------------------------------------------ Private Sub Form_BeforeInsert(Cancel As Integer) On Error GoTo Form_BeforeInsert_Err If (DCount("見積り番号", "案件") = 0) Then 見積り番号 = "AA-0001" Exit Sub End If 見積り番号 = Format(DMax("Right(見積り番号,4)", "案件") + 1, "AA-" & "0000") Form_BeforeInsert_Exit: Exit Sub Form_BeforeInsert_Err: MsgBox Error$ Resume Form_BeforeInsert_Exit End Sub ・・・・ マクロの場合     条件                     アクション ---------------------------------------------------------- 1行目 DCount("見積り番号","案件")=0   値の代入    アイテム: [見積り番号]    式:    "AA-0001" ---------------------------------------------------------- 2行目 ...                      マクロの中止 ---------------------------------------------------------- 3行目                       値の代入    アイテム: [見積り番号]     式:    Format(DMax("Right(見積り番号,4)","案件")+1,"AA-" & "0000") ---------------------------------------------------------- ・・・・    こんな感じです、 (単体のテーブルを作り、他のテーブルと組み合わせるつもりです) また余談ですが、DMAX関数とDBMAX関数の違いがわかりません、 調べても(google)出てきません、これは何か違いがあるのでしょうか? 教えてください、宜しくお願いします。

  • アクセス2000で番号をふりたいです。

    アクセス2000の質問です。よろしくお願いします。 VBAが初めてなので、本を見ながらやってるんですけど なかなか理解できずに困ってます。 今、フォームで番号をふりたいんですけど、連番で 2007001でもH19001でもいいんですが、年&3桁の番号にしたいです。 現状はテーブルが「sheet5」、フォームの番号を出すテキストボックス の所が「連番」にしてあります。ボタン式にしました。 んで自分で考えて打ち込んだのが Private Sub コマンド77_Click() If "連番" / 1000 Is Date Then Me!連番 = DMax("連番", "sheet5") + 1 Else Me!連番 = Format(Date * 1000, "yyyy" & "001") End If End Sub こんな感じでいれたのですが、さっぱり動きません。 きっと見てる方は笑ってると思いますが、私の実力じゃ こんなのしか出来ません。 同じような質問もあったのですが、理解不能でした。 詳しい方、教えてください。

  • access 請求番号の自動採番

    まったくわかりません! よろしくお願いします。 仕様環境 WinXP  access2002 顧客管理のシステムを作っています。 テーブル 顧客テーブル(主キーは顧客番号 テキスト型) 請求テーブル(主キーは請求番号 テキスト型) 明細テーブル(主キーは明細番号でオートナンバー ダミーみたいな感じで使っています。) そしてリレーションシップで顧客テーブル(1)→(多)請求テーブル(1)→(多)明細テーブルになっています。 顧客情報を入力するフォームを作りました。 主キーは顧客番号(テキスト型,入力モードON,インデックス いいえ)で 他のテキストボックス(例えば名前)に何かしら文字を入力すると自動で顧客番号を採番してくれます。 例:0001 0002 0003~ そしてそのフォームから請求書作成フォームに飛ぶように 「請求書作成ボタン」を作り、顧客情報も一緒にひっぱっていってくれる 請求書作成フォームを作りました。(入力したばかりの情報も最新の情報で更新してくれます。) ・・請求書作成フォームはサブフォームを使い3つのテーブルからなっています。・・ 親フォーム:顧客テーブルから。 子フォーム:請求テーブルから。 孫フォーム:明細テーブルから。 主キーは請求番号で(テキスト型,入力モードON,インデックス はい(重複なし)) 他のテキストボックス(例えば請求日)に何かしら入力すると自動で請求番号を採番してくれます。 例:A0001 そこで問題なのですが、顧客情報は入力する度、次々自動で採番してくれるんですが、 請求番号は一番最初のレコードの”A0001”だけ採番してくれて、 新しいレコードで請求書を作ろうとテキストボックスに文字を入力すると「型が一致しません」というエラーが出ます。 ○ エラー内容 アクションエラーの実行 条件 true アクション名 値の代入 引数 [請求番号],Format(DMax("請求番号","請求マスタ")+1,"A0001") マクロは・・(参考書を参考にしています、マクロ名:自動採番マクロ) ------------------------------------------------- 条件 : DCount("請求番号","請求テーブル")=0 アクション : 値の代入 アイテム  : [請求番号] 式     :"A0001" ------------------------------------------------- 条件    : ... アクション : マクロの中止 ------------------------------------------------- アクション : 値の代入 アイテム  : [請求番号] 式     : Format(DMax("請求番号","請求テーブル")+1,"A0001") ------------------------------------------------- となっています。 念のため、主キーの入力モードを切り替えたり、式の"A0001"を単純に"1"にしたりしましたが、 請求番号はエラーが発生します。 原因がまったくわかりません。 よろしくお願いします!