質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

3回答

10269閲覧

Access2010でサブフォームにレコードごとの行番号(連番)を振りたい

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2019/06/07 06:16

編集2019/06/07 06:58

##質問内容
伝票管理システムを作成している者です。

伝票入力フォームを作ったのですが、そのフォームにあるサブフォームにレコードごとに行番号を振りたいです。

条件としては、レコードを削除しても欠番にならないようになることです。

例)
1 aaa bbb ccc ddd
2 eee fff ggg hhh
3 iii jjj kkk lll
のレコードあるとして、2番のレコードを削除した場合、3番がひとつ繰り上がって
2番になる
といった感じです。

1 aaa bbb ccc ddd
2 iii jjj kkk lll

わかる方いましたら、教えてくださると幸いです。
ご回答、よろしくお願いします。

なお、不明な点があればコメントください。

##追記
・メインフォームの参照しているテーブル
<伝票テーブル(T_WSlip)>

フィールド名データ型備考
F_SlipCodeテキスト型伝票コード(主キー)
F_StaffCodeテキスト型担当者コード
F_CustomerCodeテキスト型顧客コード
F_ApplyCodeテキスト型適用コード
F_ProcessDate日付/時刻型処理日
F_ApplyValue長整数型割引した値

・サブフォームの参照しているテーブル
<伝票詳細テーブル(T_WSlipDetail)>

フィールド名データ型備考
F_SlipCodeテキスト型伝票コード(主キー)
F_LineNum長整数型行番号(主キー)
F_ProductCodeテキスト型商品コード
F_Cost通貨型単価
F_Qty長整数型数量

登録順に行番号を振っていきたいと考えています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2019/06/07 06:37

サブフォームに連結しているテーブル構造と一意キーおよび何順の連番にしたいかを追記して下さい
dit.

2019/06/07 07:24

ここの回答者でもあるhatenaさんのサイトにこんな記事があります。参考になりませんか? https://hatenachips.blog.fc2.com/blog-entry-58.html 追加情報である「その2」「その3」も今後役立つかもしれません。 サンプルファイルを見ると新規レコードに番号を振る方法も書いてあります。
退会済みユーザー

退会済みユーザー

2019/06/07 08:36

上と下のボタンの機能をなくしたの形を求めています
sazi

2019/06/07 09:04

@Yryuさん それはその機能を実装しなければ良いだけではないですか?
dit.

2019/06/07 09:32

saziさん、過去質問見たつもりでしたがコメントまできちんと読んでませんでした。確かにありましたね。 Yryuさん、全てコピーしろと言っているわけではなく、考え方を参考にしてほしいという意味で書きました。 どの部分が何をしているのか確認してみてください。 課題で作成しているとの事だったと思いますが、あなたがどこまでわかっていて、どこまで調べて、どこまでできているかこの質問内容からはわかりません。 丸投げにならないように「ここまではできた」が見えるようにしてください。
hatena19

2019/06/07 10:11

「上と下のボタンの機能をなくしたの形」 dit.さんの紹介していただいたページのサンプルで、上下ボタンのクリック時のコードとコントロール自体を削除するだけで、ご希望の動作になります。いちどご確認ください。それでだめなら、どこが希望と違うか具体的に提示してください。
退会済みユーザー

退会済みユーザー

2019/06/10 00:27

返信が遅くなってしまって申し訳ございません。 dit.さん、コメントありがとうございます。 >全てコピーしろと言っているわけではなくー もちろん重々承知はしております。自分なりに様々なサイトや提示してくださったサイトも確認し考えてはみたのですが、勉強と能力不足の私には、全てを理解するにはい至りませんでした。図々しいことはわかっていますが、 今後とも私にご知恵をお貸しいただければ幸いです。
guest

回答3

0

ベストアンサー

質問内容を実現するのに必要なこと。

  1. サブフォームは、F_LineNum(行番号)で昇順に並べ替えを設定しておく。

  2. 新規追加時

更新前処理イベント(Form_BeforeUpdate)で、新規レコードの時、F_LineNumに CurrentRecor(レコード番号)を代入

  1. レコード削除時

削除後確認イベント(Form_AfterDelConfirm)で、RecordsetClone を利用してカレントレコードから最終レコードまで移動してF_LineNumを連番に更新

下記のコードをサブフォームのモジュールに記述

vba

1Option Compare Database 2Option Explicit 3 4Private Sub Form_AfterDelConfirm(Status As Integer) 5 If Status <> acDeleteOK Then Exit Sub '削除を取り消したら何もしない 6 If Me.NewRecord Then Exit Sub '新規レコードの場合も何もしない 7 With Me.RecordsetClone 8 .Bookmark = Me.Bookmark 'フォームのカレントレコードへ移動 9 Do Until .EOF 'レコードセットの最後まで 10 .Edit 11 !F_LineNum = .AbsolutePosition + 1 '行番号更新 12 .Update 13 .MoveNext 14 Loop 15 End With 16End Sub 17 18Private Sub Form_BeforeUpdate(Cancel As Integer) 19 If Me.NewRecord Then Me.F_LineNum = Me.CurrentRecord 20End Sub

下記のページにサンプルがあります。

帳票サブフォームで行番号フィールドの連番を維持する - hatena chips

投稿2019/06/07 14:13

編集2019/06/07 14:34
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/10 00:29

ご回答ありがとうございます。 上記のコードを試してみたのですが、2行目のレコードが出てこないのですがどうすればいいでしょうか
hatena19

2019/06/10 01:24

サブフォームで新規レコードを入力しても1レコードしか表示されないのですか。 サブフォームは帳票フォームまたはデータシートビューになってますか。 あるいは、「追加の許可」が「いいえ」になっているとか。 「データ入力用」が「はい」になっているとか。 どちらにしても、提示したコードは関係ないです。フォームの設定の問題だと思いますので、それを確認してください。
退会済みユーザー

退会済みユーザー

2019/06/10 02:16

設定に間違いがありました。すみません。 その結果、無事問題が解決いたしました。 ありがとうございました。
guest

0

「並び順」などという行番号を表示する順番を管理するだけのフィールドを用意し、レコードを削除したときには、「並び順」フィールドを再採番するようにすればいいのではないでしょうか?

1 aaa bbb ccc ddd 「並び順フィールドは 1」
2 eee fff ggg hhh 「並び順フィールドは 2」
3 iii jjj kkk lll 「並び順フィールドは 3」

2番目のレコードを削除したときには、次のようなプログラムを走らせます

Sub 並び順振り直し() Dim rs As DAO.Recordset Dim i As Long On Error GoTo Err_Renumber Set rs = Me.RecordsetClone If rs.RecordCount > 0 Then With rs .MoveFirst i=0 '初期化 Do Until rs.EOF i = i + 1 .Edit ![並び順] = i .Update .MoveNext Loop End With End If   Me.Requery Err_Renumber: rs.Close End Sub コード

投稿2019/06/07 13:06

編集2019/06/07 13:52
u_zu

総合スコア50

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2019/06/07 13:19 編集

並びが崩れる事は少ないかもしれませんが、order by されていないので、並びは完全には保証されていないのではありませんか? そもそも、RecordsetCloneは読み取り専用です。
u_zu

2019/06/07 13:32

レコードソースはorder byされているクエリーを想定しておりました。 RecordsetCloneで、私の環境では問題なく動作しますが。。。 ※あと、Err_Renumberの上に Me.requeryを入れないといけませんでしたね。
sazi

2019/06/07 14:47 編集

>RecordsetCloneで、私の環境では問題なく動作しますが RecordsetClone直接じゃなくて、setしてるから大丈夫なんですかね? 読み取り専用という事でそういった事は試した事はなかったのです。すみません。 読み取り専用はプロパティでした・・・
u_zu

2019/06/07 13:40

いえいえ、今後ともよろしくお願いします。
sazi

2019/06/07 13:42

コードはマークダウンした方がいいですよ。
u_zu

2019/06/07 14:21

hatenaさん ありがとうございます。すごいサイトですね!
guest

0

T_WSlipDetailのF_LineNumをオートナンバーに変更します。
新たに行番号のコントロールを追加しそのコントロールソースに以下を設定します
F_LineNumのコントロール(下記ではtxt_LineNumとしています)は非表示にします。

=IIf(IsNull([txt_LineNum]),Null,DCount("*","T_WSlipDetail","F_LineNum <=" & [txt_LineNum]))

※F_LineNumをオートナンバーに変更することで、意味合い的にT_WSlipDetailの主キーはF_LineNumになります。
明細全体での一意キーとなり、F_SlipCodeで伝票事にブロック化されます。
但し、ワークであり表示している伝票に関するデータのみだと思いますので、正式なデータに登録する際には考慮が必要です。

投稿2019/06/07 07:33

編集2019/06/07 08:18
sazi

総合スコア25184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/07 07:44

回答ありがとうございます。 まず、行番号のところに#エラーと出てしまいます。 それと、2行目が表示されないです。
sazi

2019/06/07 08:05

新規行も加味した内容に変更しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問