• ベストアンサー

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

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

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

  • ベストアンサー
  • fly_moon
  • ベストアンサー率20% (213/1046)
回答No.1

こんにちは。マクロってVBAではないですか? そのコードの中で「0005」を数値に変換している部分があるんだと思います。それを数値にしないように書き換えるか、最後にFormat(数値,"0000")で体裁を整えるかだと思います。 >また、「6」ではなく「0006」でレコードの更新もしたいのですが、可能でしょうか もちろん可能ですが、ちょっと心配になってきました。何かの新規入力画面で、最初に連番を取っておいてそれで入力した内容を登録しようというものに感じました。1ユーザーの使用なら問題ありませんが、複数のユーザーで使用すると、確実に番号が飛び飛びになりますよ。そうすると、思ったよりかなり多くの桁数を想定しておかないとすぐに桁数が足りなくなります。通常、登録時に連番を振る方法を取ると思いますので、そういう場合だと表示されることはないと思います。 全部想定されていることかもしれませんし、全然見当はずれで余計なおせっかいな事かもしれませんね。失礼しました。

noname#50871
質問者

お礼

VBAではないのです。マクロなんです。 マクロ名やアクションを入力とか選択する画面でやってます。 その画面で「値の代入」を選択して、式を入力してます。 ここで最初はDMax関数のみ使用していたのですが、 アドバイスどおりFormat関数でくくってみたら「0006」と表示されました。 本当はVBAなどもう少し深いところまで勉強すればいいと思うのですが、 アクセス初心者なのに期限も決まっているため、付け焼刃状態なのです。 (すみません、どうでもいいことですね。) ともかく、うまくいきましたので ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

noname#140971
noname#140971
回答No.2

攻め方の方向性のみに限定しての回答ですが・・・。 <tabA> ID_____fld1___fld2 0001_____1__A 0002_____2__B [イミディエイト] ? NextID("tabA", "ID") 0003 ? NextID("Groups", "ID") 5 もちろん、列[ID]はテキスト型で長さ=4。 よって、列[ID]の最大値は'9999'です。(いいのかなー) ところで、主キーの次の値を取得するケースは一箇所じゃないでしょう。 ならば、NewID()とかNextID()なる関数を用意するのが常套手段ではないですか? NextID()は、イミディエイトウィンドウでのテストでも判るように主キー列が文字列か否かを判定しています。 このように、主キーが文字列なら文字列で取得する、数字なら数字で取得すれば解決すると思います。 ADOなんかでコードを記述すると、こういう関数も可能です。 もちろん、文字列を主キーとした場合、整形する長さを判定するために<既定値>を設定して置かねばなりません。 僅か、最初の1レコードだけのためですが・・・。 が、いずれにしろ、<既定値>='0000' ならば '0001' を戻すNextID()は可能です。 さて、肝心の<主キーが文字列なら文字列で取得する>の部分も・・・。 If Not .BOF Then   If .Fields(0).Type = 202 Then     N = Format(Val(.Fields(0)) + 1, String(Len(.Fields(0)), "0"))   Else     N = .Fields(0) + 1   End If End If [イミディエイト] ? FORMAT(VAL("00000000001")+1, "00000000000") 00000000002 VALで加算してから、FORAMT関数で整形しているということです。 同じことをやられたら良いと思います。

noname#50871
質問者

お礼

ご丁寧に説明いただいてありがとうございます。 最初に言っておくべきでしたが、 勉強不足のためまだVBAがよく理解できておりません。 もう少し勉強してから、再度参考にされていただきます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

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

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

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

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

  • Microsoft Access 2000

    2つのフォームで一方の値をもう一方のフォームに代入したいのです。 方法はコマンドボタンを押すことによって、AフォームからBフォームに2項目同時に同じレコードに代入したい。コマンドボタンに“値の代入マクロ”を設定します。 Aフォーム 代入したい項目のデータ型=2つともオートナンバー型(AN項目,AG項目)   レイアウト=2つともリストBOX(1列目がAN項目,AG項目) Bフォーム 代入されたい項目のデータ型=2つとも長整数型(BN項目,BG項目)   レイアウト=2つともテキストBOX 現状はAフォームの2つの項目のどちらか1つしか代入できません。 Aフォームの代入したい項目は新レコードではなく、既にデータが入力されているレコードのIDをBフォームの新レコードに代入したいのです。 コマンドボタンを押すとエラーは表示されず、フォームは正常に閉じます。しかし、テーブルを見るとどちらか一方のレコードにはデータが入力されていないのです。 代入されたいBフォームは、常に新レコードで主キーは設定していません。Bフォームに代入されるAN項目・AG項目の値は、その他のレコードの値と重複しています。 いきずまって困っているので、みなさんの力をお借りできたらと思って書き込みました。イメージが湧きにくいとは思いますが、よろしくお願いします。

  • ACCESSのDMAXについて

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

  • アクセス2003のカレンダー使用について教えてください。

    アクセス2003のカレンダー使用について教えてください。 選択クエリがレコードソースの帳票フォームがあります。日付を入力して、その日付のレコードのみ抽出するようにいているのですが、これをカレンダーの日付と連動させて、そのフォームを開いたら自動でその日付のレコードのみ抽出できるようにしたいです。マクロを使って(値代入)ためしてみたのですが、うまくできませんでした。カレンダーはメインフォーム上にあり、別フォームでは簡単に値代入できています。ただ、選択クエリのように、抽出条件のところには代入は無理なのでしょうか?どなたかよろしくお願いいたします。。。

  • ACCESS2000 抽出されたレコードのテキストボックスに値を一括で

    ACCESS2000 抽出されたレコードのテキストボックスに値を一括で代入したい 宜しくお願い致します。 テーブルには、商品名、金額、数量、出荷予定日、出荷確認の5つのフィールドが あり、当日に出荷する予定の商品をクエリで抽出し、該当するレコードをフォームに 表形式で表示させています。 出荷後、出荷確認のテキストボックスに”済み”と入れたいので、現在、フォーム の隅に、既定値を”済み”としたテキストボックスを作り、フォーム内のコマンド ボタンを1回押すごとに、マクロ(値の代入)を実行させ、出荷確認に”済み”を代入 させています。 しかし、この方法だと、抽出されたレコードが100件あると、100回押さないといけ ません。一括で代入させる方法を探しているのですが、見つかりません。素人故、 複雑な事は出来ませんので、簡単な方法がありましたら、ご教授ください。 また、一度代入したものを、一括で消す方法も合わせてご教授いただければ幸い です。 宜しくお願い致します。

  • ACCESS2007 DMaxについて

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

  • 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"にしたりしましたが、 請求番号はエラーが発生します。 原因がまったくわかりません。 よろしくお願いします!

  • ACCESSについてご質問です。

    バイト勤務管理表を作成しようとしています。メインフォームを「f_支給明細」,サブフォームを「f_支給明細サブ」としています(※メインフォームは,支給明細番号を1つのレコードとしています。)。 行いたいのは,サブフォームの「日付」の最新レコード(最新行)と,次候補最新の「日付」の値をピックアップしてメインフォームに表示させようとしています。 現在は,サブフォームのレコードソースを「t_支給明細サブ」として,「t_支給明細サブ」のフィールドに「日付」があり,メインフォームのコントロール名とコントロールソースをそれぞれ, 最新日付改 = Dmax("日付","t_支給明細サブ") 直前最新日付 = Dmax("日付","t_支給明細サブ","日付 < #" & 最新期日改 & "#") としています(※期日フィールドは,日付型)。 以上により,メインフォーム上に,日付を表示させることができたのですが,支給明細番号のレコードに関係なく,「t_支給明細サブ」の最新日付とその直前最新日付が表示されます(※例えば,支給明細レコードが「001」であっても「002」であっても,表示される日付は「2011/02/10」,「2011/02/18」であり同じ。)。 今回,教えたいただきたいのは,メインフォーム「f_支給明細」の支給明細番号ごとに,その画面上に表示されているサブフォームの最新日付等を表示させる方法です(※例えば,支給明細レコード「001」であれば,「2011/01/05」と「2011/02/10」,「002」であれば,「2011/02/05」と「2011/02/18」など。)。 知識不足のためにうまく説明ができてないかと思いますが,どなたか教えていただければ幸いです。

  • 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)出てきません、これは何か違いがあるのでしょうか? 教えてください、宜しくお願いします。

専門家に質問してみよう