• ベストアンサー

Access2002でクエリで抽出され表示されたフォームに連番を振りたい

タイトルのようなことをしたいのですが、わかりやすいやり方はないでしょうか?

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

  • ベストアンサー
回答No.4

クエリ自体が更新できないレコードソースであれば、このままではできませんね。 ちょっと難しくなりますが、クエリと同じフィールドと、フォーム連番フィールドを持つ新しいテーブルを作成しておいて、フォームのデータをその新しいテーブルに書き込み、フォームのレコードソースを新しいテーブルに置き換える処理では、どうでしょうか?(新しいフォームを開くことでも結構ですけど) 処理の流れとしては、 (1)新しいテーブルの初期化 (2)データの転送処理 (3)レコードソースを新しいテーブルにする。(Me.RecordSource = "新しいテーブル名") (4)フォームの再表示(Me.Requery) となります。 参考に(1)新しいテーブルの初期化と(2)データの転送処理モジュールの例を記載しておきます。 Public Sub テーブル初期化処理(strテーブル As String) Dim rst As New ADODB.Recordset Set rst = New ADODB.Recordset rst.Open strテーブル, CurrentProject.Connection, adOpenKeyset, adLockOptimistic Do Until rst.EOF rst.Delete rst.MoveNext Loop rst.Close Set rst = Nothing End Sub Public Sub データ転送処理(strテーブル As String) Dim rst As New ADODB.Recordset Set rst = New ADODB.Recordset rst.Open strテーブル, CurrentProject.Connection, adOpenKeyset, adLockOptimistic Dim レコード数 As Integer Dim i As Integer レコード数 = DCount("フォーム連番", "クエリ1") DoCmd.GoToRecord , , acFirst For i = 1 To レコード数 rst.AddNew rst![フォーム連番] = i rst![項目1] = Me![項目1] rst![項目2] = Me![項目2] rst.Update DoCmd.GoToRecord , , acNext Next i rst.Close Set rst = Nothing End Sub なお、はじめからフォームのレコードソースをこのような更新できるレコードソース(ワークテーブル?)にしておく手もありますね。 ご参考になれば幸いです。m(__)m

その他の回答 (3)

回答No.3

(1)まずVBAのコードの一部が間違ってました。(^^ゞ For i = 1 To レコード数 + 1 は、 For i = 1 To レコード数 です。 (修正前ですと、新規レコードに移動してしまい、エラーとなります。) (2)このフォームのレコード自体が更新できないようになっている場合(元になっているクエリのレコード自体が更新できないようになっている場合)には、エラーとなります。 No.2の回答で、(2)あるいは(3)まで作成していたとして、”フォーム連番”に数値を入力して、レコードが保存できるか確認してください。 さしつかえなければ、作成したクエリのSQL文がどうなっているかわかれば、回答しやすいんですけど。・・・

tomokazu2001
質問者

お礼

朝早くからの回答ありがとうございます。 No3の回答のようにやってみたのですが、やっぱりできません。 できればSQLを公開して解決したいのですが、開発中のソフトであるため 公開はできないです。申し訳ございません。

回答No.2

レポートの場合は、No.1の方の方法で簡単にできますが、 残念ながらフォームで作成したテキストボックスでは、[集計実行]できませんね。 フォームで行おうとすると、自分であれば下記のようにします。(表形式のフォームを既に作成済みの前提です。) (1)クエリの元になっているテーブルにフィールドを追加(例えば”フォーム連番”(データの型は数値型) (2)クエリに”フォーム連番”の表示を追加 (3)フォームにテキストボックスを追加して、そのテキストボックスの名前を”フォーム連番”、レコードソースを”フォーム連番”とする。 (4)VBAで処理を追加。例えば下記は、連番セットというコマンドボタンを作成し、これをクリックすることで、連番を入力するものです。 Private Sub 連番セット_Click() On Error GoTo Err_連番セット_Click Dim レコード数 As Integer Dim i As Integer レコード数 = DCount("フォーム連番", "クエリの名前") DoCmd.GoToRecord , , acFirst For i = 1 To レコード数 + 1 Me.フォーム連番 = i DoCmd.GoToRecord , , acNext Next i Exit_連番セット_Click: Exit Sub Err_連番セット_Click: MsgBox Err.Description Resume Exit_連番セット_Click End Sub ご参考になれば幸いです。m(__)m

tomokazu2001
質問者

補足

回答ありがとうございます。 試してみたところ、 「このレコードセットは更新できません」 とでるのですが、どうすれば回避できるでしょうか? おしえていただけるとありがたいです。

回答No.1

質問内容は、クエリで抽出したデータをフォームで表示する際に、連番をつけたい。 という捕らえ方でいいのでしょうか?(違っていたらごめんなさい) フォームのつくり方によるのですが、表形式のフォームだったらできますよ。 たとえば、詳細セクションに連番がふりたい場合。 1・非連結コントロール(テキストボックス)を詳細セクションあたりにつくります。つくると「ラベル○○」と言う文字の入った「ラベル」部分と、白い箱で非連結と言う文字の入った「テキストボックス」部分ができます。 2・ラベル部分をページヘッダセクションに移動して、「番号」とか名前を変えます。 3・テキストボックス(詳細セクション内にある)をダブルクリックして、プロパティを出します。 4・データタブをクリックし、[コントロールソース]に半角文字で、=1と入力し、[集計実行]を全体にします。 5・非連結のテキストボックス(今は、=1の文字がある)の書式をきれいに整えます。 6・ビューを切り替えると、連番で表示されると思います。 的外れでないといいのですが。

関連するQ&A

専門家に質問してみよう