人気マンガがだれでも無料♪電子コミック読み放題!!

【テーブル名】T_株券管理
【フォーム名】F_株主入力
【フィールド名】株主ID(テキスト型)(主キー)
フォームに入力する際にオートナンバーを使用せずに、
レコードが切り替わると「株主ID」が「00001」「00002」「00003」・・・・というように1づつ発番されるようにしたく、AccessVBAの本を読んだり、ネットでDmax等調べているのですが、必要な情報が探せずに困っています。

本当はオートナンバーでIDを振っても良いのですが、レコードの削除等行った時に歯抜けになってしまうので、うる覚えで申し訳ないのですが・・・確か、フォームのテキストボックスのプロパティ、コードビルダでVBを「レコードが移動した際に」→「株主IDが0の場合に”00001”を、0でない場合には既存の数値に+1した数値をテーブルT_株券管理の”株主ID”に入力する。」といった感じの記述がしてあったと思います。VB初心者なので、説明が上手くできずにすみません。
このような記述方法はありますでしょうか?

A 回答 (2件)

フォーム:F_株主入力の[株主ID(テキスト型)(主キー)]のプロパティの既定値に



= format(Cint(Nz(DMax("株主ID", "T_株券管理"),"0")) + 1,"00000")
※DMax関数は条件に該当するものがなかった場合、Null値を返します。

これでいかがでしょうか・・・(動作確認していませんが恐らく動く)

前の方おっしゃるように歯抜けは管理できません。
・あくまでも現IDの最大値にプラス1して発番すること
・初回のみ、「00001」が入るようにすること
に特化しています。
    • good
    • 0
この回答へのお礼

ありがとうございます。
「歯抜け」という表現が間違っていました。

Private Sub Form_BeforeInsert(Cancel As Integer)
Me.株主ID = Format(CLng(Nz(DMax("株主ID", "T_株券管理"))) + 1, "00000")
End Sub

で解決致しました

お礼日時:2007/08/20 11:02

オートナンバーの再現は、



[id]のプロパティの既定値に、

=DMax("ID","請求書")+1

と書けば済みます。

所謂、採番テーブルを用いない一番簡単な方法です。

が、この場合、歯抜けは管理できません。
もちろん、採番テーブル方式も同じです。

<歯抜け管理は至難のワザ>

ところで、歯抜け管理は採番テーブル方式よりもややこしいですね。
仮に、連鎖削除をしていないゴミレコードがあった場合の対応です。
歯抜けを復活すれば、当然にリンク先のゴミも復活します。

また、現実問題は、歯抜けを検索する GetNewID() を作成しないといけません。

=GetNewID("ID","請求書")

歯抜けがあれば、そこを埋める値を返し、そうでなければ最大値+1を返す関数です。
この関数の方が、NewID()よりもややこしいですよ。
    • good
    • 0
この回答へのお礼

ありがとうございます。IDを「00001」「00002」「00003」・・・・というようにしたかったのですが、=DMax("ID","請求書")+1でしばらく対応してみます。

お礼日時:2007/08/13 09:24

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QAccessで自前の自動採番処理で採番テーブルを

Accessで自前の自動採番処理で採番テーブルを作り、その採番テーブルに格納してある最後の主キーのNO.を取得して、それに1加算したものを、新規レコードの主キーの自動採番処理結果として設定するやり方を考えていますが、その場合に

1) 複数レコードにエクセルなどから複数行データをコピーして貼り付けた場合には、採番がうまくいくのでしょうか?行かない場合には、その対処策はありますでしょうか。

2) 一行、または、複数行を削除した場合には、採番は既に登録済みの最後のNo.から自動採番するようになると思いますが、通常のアクセスのシステムでは、このような挙動で宜しいのでしょうか?

ご回答のほうよろしくお願いします。

Aベストアンサー

#1 の回答は番号フィールドにNull がある複数のレコードが存在する場合の
サンプルです。
※最後に採番テーブルの番号の値を変更するのが抜けてました。
rs.close:set rs =nothing の前に
currentdb.execute("update 採番テーブル set 番号 =" & maxnum)
を追加してください。

1レコードずつ手入力で行っている場合はまた別の話になります。
フォームのレコード移動時イベントに
if me.newrecord then
me!フォームの番号コントロール名 = Nz(DMax("番号", "採番テーブル"), 0) +1
・・・とかになりますが
採番テーブルの方の番号を更新するタイミングは更新前処理に行えば
良いでしょう。

が、もしかしてマルチユーザー環境で・・・と考えているのなら
全部忘れてください。ハードルがぐっと上がりますので確かな回答は出来ません。
こちらが参考になるかと思いますけど。。。
[VB] DAO でユーザー定義カウンターを実装する方法
http://support2.microsoft.com/default.aspx?scid=kb;ja;191253

私からは以上です。

#1 の回答は番号フィールドにNull がある複数のレコードが存在する場合の
サンプルです。
※最後に採番テーブルの番号の値を変更するのが抜けてました。
rs.close:set rs =nothing の前に
currentdb.execute("update 採番テーブル set 番号 =" & maxnum)
を追加してください。

1レコードずつ手入力で行っている場合はまた別の話になります。
フォームのレコード移動時イベントに
if me.newrecord then
me!フォームの番号コントロール名 = Nz(DMax("番号", "採番テーブル"), 0) +1
・・・とかになりますが
採番テ...続きを読む

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QAccess DCountでの連番について

DCountで連番を追加したいのですが演算対象条件の記述方法が良く分かりません。
調査用品別販売データクエリの商品コードフィールドに対して連番を振りたいです。
商品コード、連番
00110 1
00110 2
00120 1
00120 2
上記のようにしたいのですが
式1: DCount("商品コード","調査用品別販売データ","商品コード=" & [調査用品別販売データ]![商品コード])
これではエラーが出てしまいます。

Aベストアンサー

商品コードと同じようにしてやればいいのです

連番:式1: DCount("*","調査用品別販売データ","商品コード='" & [商品コード] & "' and ID <='" & ID & "'")

QAccessのフォーム上にレコード数とレコード番号の表示

Accessでクエリを元に表示するフォーム上で、テキストボックス等に関数を使って、レコード数とレコード番号を表示する方法がありましたら教えてください。

フォームの書式設定で「移動ボタン」の表示をすれば目的の事は出来るのですが、表示の大きさが調整できない為、とても見難いのです。

以上よろしくお願いします。

Aベストアンサー

レコード番号のコントロールソースを
=[CurrentRecord]
レコード数のコントロールソースを
=Count("*")-[NewRecord]
としてみてください。

QACCESSのフォーム上に連番番号を表示したい

お世話になります
フォームは単票型でなく、表型です↓

1 aaaa1 bbbb1 cccc1
2 aaaa2 bbbb2 cccc2
3 aaaa3 bbbb3 cccc3

aaaa1等、右側はテーブルからデータを表示しています
この、左の1,2,3、は単なる、表示で関連付けるデータは
ありません

この単なる1,2,3、はどのようにだすのですか
よろしくお願いします

Aベストアンサー

レコードセットの各レコードに連続番号をつける方法
http://support.microsoft.com/kb/410756/ja

QACCESSでクエリで選択した行番号をつけたい

選択結果に1~順に番号をつけたいのですが、過去ログを見ると 番号: DCount("*","データ","[NO]<=" & [NO])とすればいいと書かれてありました。これはNOが昇順になっている場合にしか1~順になりません。
NOはユニークですが、他のフィールドで昇順にしたい場合はどうすればいいのですか?
例)
NO フリガナ
312 タナカ
322 イトウ
333 マツダ
・・・・
番号 フリガナ(昇順)
2 イトウ
1 タナカ
3 マツダ
となってしまうのです。
ACCESS2002

どうぞよろしくお願いします。

Aベストアンサー

 ん~多分、

番号: DCount("*","テーブル名","[フリガナ]&[NO]<='" & [フリガナ] & [NO] & "'")

でいけると思いますが、だめだったら、

番号: DCount("*","テーブル名","[フリガナ]<'" & [フリガナ] & "' OR ([フリガナ]='" & [フリガナ] & "' AND [NO] <= " & [NO] & ")")

かな?

Qアクセエスのレコードの更新をVBAでするには?

アクセスで、一覧表のフォームにボタンを取りつけています。レコードの内容を変更したら、ペンの形のマークが現れますね。これは変更中ということですが、そこでボタンを押しても変更は確定されないから、更新確定させたいのです。

それで、DoCmd.Requery を最初の行に入れてみたら、元の一覧表は最初のレコードに飛んでしまう。

元の一覧表の位置を動かさないために、Ctrl+Enter キーを押して更新確定させたような状態をVBAで実現する方法あるのでしょうか?

よろしくお願いします。

Aベストアンサー

No1 です。
今回の場合には
Docmd.RunCommand acCmdSaveRecord の方が良かったですね
文字通りレコードを保存します。
Requery に引きづられてしまいました (^_^;)

Recalc、Refresh、Requery の使い分けは下記が参考にはなりますか?
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QACCESS IIF関数 複数条件の設定について

 選択クエリにおいて、あるフィールド「 X」 のレコード数値が
 
  0<[X]<=50   であれば A 
  50<[X]<=100  であれば B 
  100<[X]<=150  であれば C

 と表記させるフィールド「Y」を追加したいと考えています。
 この場合、Yのフィールド設定で指定する数式についてご教授願います。

 一応、
  IIf(0<[X]<=50,"A","") Or IIf(50<[X]<=100,"B","") Or IIf(100<[X]<=150,"C","")

  としましたが、実行すると、Yの列がすべて「-1」と表記されてしまいます。

 何卒よろしくお願いいたします。

Aベストアンサー

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A", [X]<=100, "B", [X]<=150, "C", True, "")


なお、数学あるいは一般生活では確かに「0<[X]<=50」という表記をしますが、
Accessの関数などではこれだと正しい結果が得られません。
正しく認識させるためには、等号・不等号を挟んだ式は、「左辺」と「右辺」の
2つの要素からなる形にする必要があります。
(「0<[X]<=50」は「[X]>0 And [X]>=50」と分割してやる、と)

但し、今回のご質問のような『連続した範囲』であれば、前(左)で既出となる
式の要素で「[X]<=0」が「真(=-1)」とならなかった時点で、「[X]>0」が保証
されますので、上記のように、「[X]>0」を省略して「[X]<=50」だけを条件として
指定すればOk、ということになります。
(「0<[X]<=50」の次が「80<[X]<120」などのように、「50~80」が欠けた
 場合は、省略ができない、と)


【参考】
「0<[X]<=50」は、このままだと「0 < ([X]<=50)」という式と解釈されます。
この場合、「[X]<=50」は、「真(=-1)」か「偽(=0)」か「Null」のいずれかに
なります。
何にせよ、「0<[X]<=50」全体として「正(=-1)」となることがないため、
ご質問の式では、IIF関数は常に第3引数に指定された値「""」を返す
ことになります。

この結果、式全体としては「"" Or "" Or ""」という形となり、「0かNull」
以外なので、「真(=-1)」という値が返された、ということです。

なお、Nullについては、以前、他の方の質問につけた回答も、併せて参考までに:
http://oshiete.goo.ne.jp/qa/4850675.html

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A"...続きを読む

QACCESSでフォームを使って、テーブルを参照、データ入力、データ更新をしたいのです

フォームを使って、テーブルを参照、データ入力、データ更新をしたいのです。

売上テーブル

 ID   商品コード  日付    金額 
 1    G1     20080101  532153
 2    G1     20080101  564281
 3    G1     20080301  538123
 4    J4     20080301  124531
 5    J4     20080302  125483

ID:オートナンバー 商品コード:数値型 日付:数値型 金額:数値型

これを使い、
フォームではまず

レコードナンバーを入力画面
       ↓
レコード番号を入れると、そのレコードのデーターが画面に表示され、
その画面で修正可能
       ↓
 保存 ボタンで保存

という流れです。

レコードナンバーはIDを使おうと思っています。

データの量が莫大な為、コンポボックスなどは使えません。

できるだけ、VBAなどは使わずに作りたいです。

よろしくお願い致します。

フォームを使って、テーブルを参照、データ入力、データ更新をしたいのです。

売上テーブル

 ID   商品コード  日付    金額 
 1    G1     20080101  532153
 2    G1     20080101  564281
 3    G1     20080301  538123
 4    J4     20080301  124531
 5    J4     20080302  125483

ID:オートナンバー 商品コード:数値型 日付:数値型 金額:数値型

これを使い、
フォームではまず

レコードナンバーを入...続きを読む

Aベストアンサー

まずそのテーブルを基にしてフォームを作成します。
そのフォームのヘッダー部分にテキストボックスを配置後、一旦
上書き保存。
フォームのレコードソースを
SELECT *
FROM テーブル名 WHERE ID=[Forms]![フォーム名]![テキストボックス名]
とします。
次にテキストボックスの更新後処理に
Me.Requery
とすれば完成です。
フォームを開いてテキストボックスにID入力後エンターしてください。

保存に関しては、コマンドボタン作成後クリック時イベントに
DoCmd.RunCommand acCmdSaveRecord
とすれば良いでしょう。

この手のモノは検索すれば相当数ヒットするので、そちらを参考にされるのもよろしいかと。

QACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ

ACCESSで空白のデーターをクエリで判定/識別する方法を教えてください。
EXCELでは空白を""で判定/識別表していますがACCESSではどうなるのでしょうか。

下の例はフィールドに試験番号があればその番号を、空白なら”欠席”と表示しようとしています。
IIf(([試験番号]="空白の場合何を入れる?"),[試験番号],"欠席")

Aベストアンサー

もうひとつの書き方は
式1: IIf([試験番号] Is Not Null,[試験番号],"欠席")
第2、第3引数の、質問の順序にあわせるとこうなる。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング