Access (VBA)

Access VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(その他 : Access 2021)
帳票フォームの複数レコードを選択して、その全値を取得したい
投稿日時: 23/06/06 17:37:38
投稿者: 滝沢

帳票フォームで下記のようなデータがあります。
みかん 10個
すいか 20個
めろん 30個
りんご 40個
 
行の左の□部分で、すいかとめろんの2行を選択して何かアクションをした時に
この2行の値をいっぺんに取得する方法はありますでしょうか?
選択する方法は上記の通りでなくても構いません。
 
よろしくお願い致します。

回答
投稿日時: 23/06/07 10:15:19
投稿者: Suzu

リレーショナルデータベース 的な考え方 をするなら
 
 各レコード毎に、チェックボックスを用意し、
 そのチェックボックス にチェックが入っている レコードを、
 SQLのWHERE句 を指定する事で取得する
があります。
 
ただし、この場合は、そのチェックボックスを
レコードソース側にフィールドとして用意する必要があります。
その為には
 ・ 元々のテーブルにフィールドを用意する
 ・ワークテーブルを使用する
 のどちらか を使用する必要があります。
 
その場合、テーブル・レコードソースの変更が必要になります
(でも、レコード上に記録するので、
 同フォーム上でフィルターを使い、更にユーザーに選択させる様な使い方
 別フォームとの連携を必要とする様な場合には有効)
 
 
それよりは、質問者さんが おっしゃる、
Access の GUIを利用し フォーム左側の□部分を使う方法 の方が コードは楽になります。
(帳票・データシートの 左側 の部分 は レコードセレクタ と言います。)
 (範囲内の連続選択ができるメリットと、レコードソースの変更が不要)
 
以下にそのままがありますね。
 
T'sWare
【範囲選択されたレコード内容を取得するには?】
https://tsware.jp/tips/tips_282.htm
 
 
そのレコードを取得し、表示する程度なら、レコードセレクタを使っても良いでしょう。
このあとの処理によって、レコードソースに、フィールドを用意する方法が良いのか検討しましょう。
(セレクタで選択しレコードに対し、チェックを入れる という複合方法もあるでしょう)

回答
投稿日時: 23/06/07 10:20:32
投稿者: sk

引用:
帳票フォーム

引用:
行の左の□部分

レコードセレクタのことをおっしゃっているとして、
 
引用:
すいかとめろんの2行を選択して何かアクションをした時
この2行の値をいっぺんに取得する方法はありますでしょうか?

・ここでの「アクション」とは具体的にどのような操作を想定しているのか。
 
・「値をいっぺんに取得」とは、そのフォームのレコードソースの
 どのフィールドを対象としており、具体的にどのような形で取得したいのか。
 (例えば "すいか" と "めろん" という 2 つの要素を持つ配列として取得するなど)
 
・「いっぺんに取得」した値(配列)を使って、最終的にどのような処理を
 実行しようとしているのか。
 
とりあえず、以上の点について明記されることをお奨めします。
 
基本的には、「カレントレコードの移動」や「レコードの範囲選択」に伴って
発生するイベントにおいて、そのフォームの SelTop プロパティと
SelHeight プロパティを参照し、それぞれの値をモジュールレベルの変数に
格納しておいた上、「何かアクションをした時」にその範囲が示すレコードを
順次参照するようなコードを記述することになるでしょう。

投稿日時: 23/06/07 17:42:46
投稿者: 滝沢

Suzu様
コメントありがとうございます。
利用者から「チェックボックスだと操作が面倒」との意見があり今回のご質問になりました。
参考URLありがとうございます。
試してみます。
 
sk様
コメントありがとうございます。
>・ここでの「アクション」とは具体的にどのような操作を想定しているのか。
ファンクションキー操作やボタンクリックです。
 
>・「値をいっぺんに取得」とは、そのフォームのレコードソースの
> どのフィールドを対象としており、具体的にどのような形で取得したいのか。
> (例えば "すいか" と "めろん" という 2 つの要素を持つ配列として取得するなど)
>・「いっぺんに取得」した値(配列)を使って、最終的にどのような処理を
> 実行しようとしているのか。
 次の画面(帳票フォーム)の「商品名」というフィールドに「すいか」「めろん」をセットして
2レコード追加をしたいです。
現状は「すいか」行でF12キーを押したら次画面に「すいか」のレコードが追加されるように
なっていますが、利用者から「複数行いっぺんにできないか」と要望が来たためです。
 
よろしくお願い致します。

回答
投稿日時: 23/06/08 00:15:31
投稿者: hatena
投稿者のウェブサイトに移動

選択範囲のフィールド値の取得はSuzuさんのリンク先にあります。
リンク先はF4キーで実行してますが、それをF12キーに変更すればいいでしょう。
 
RecordsetCloneを使ってレコード移動しながら値を取得していますので、
その時に、別フォームのRecordsetCloneにレコード追加していけばいいでしょう。
 
 

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    Dim i As Long
    Dim myRs As DAO.Recordset
    Dim toRs As DAO.Recordset
    If KeyCode = vbKeyF12 Then
        KeyCode = 0
        Set myRs = Me.RecordsetClone
        Set toRs = Forms!別フォーム名.RecordsetClone
        With myRs
            .AbsolutePosition = Me.SelTop - 1
            For i = 1 To Me.SelHeight
                toRs.AddNew
                toRs!商品名 = !商品名
                toRs.Update
                .MoveNext
            Next
            .Close
        End With
    End If
End Sub

回答
投稿日時: 23/06/08 10:41:46
投稿者: sk

滝沢 さんの引用:
次の画面(帳票フォーム)の「商品名」というフィールドに「すいか」「めろん」をセットして
2レコード追加をしたいです。

滝沢 さんの引用:
>・ここでの「アクション」とは具体的にどのような操作を想定しているのか。
ファンクションキー操作やボタンクリックです。

帳票フォーム上に表示されている複数件のレコードが範囲選択されている
状態から、同じフォーム上にあるコマンドボタンをクリックすれば、
コマンドボタンにフォーカスが移るのと同時にレコードの範囲選択が解除されます。
 
したがって、コマンドボタンの Click イベントが発生した時点では
フォームの SelHeight プロパティの値も 0 となっているため手遅れです。
 
どうしてもコマンドボタンの Click イベントにその処理を
実行したいのであれば、既に申し上げた通り以下の処理を
事前に実行しておく必要があるでしょう。
 
sk さんの引用:
基本的には、「カレントレコードの移動」や「レコードの範囲選択」に伴って
発生するイベントにおいて、そのフォームの SelTop プロパティと
SelHeight プロパティを参照し、それぞれの値をモジュールレベルの変数に格納

回答
投稿日時: 23/06/08 11:47:19
投稿者: hatena
投稿者のウェブサイトに移動

UIに関しては、コマンドボタンクリックでは選択解除されてしまうので、SKさんの回答の対策が必要になります。
 
自分が設計するなら、コマンドボタンクリックの代わりにラベルのクリックイベントで代用します。
ラベルのクリックならフォーカス移動しないので選択は解除されないので、ファンクションキーに割り当てたコードがそのまま使えます。
 
フォームヘッダーかフッターにラベルを配置しておいて、「選択レコードをコピー追加(F12)」というように処理内容が分かるようしておいて、それをクリックでもファンクションキーでも実行できるとユーザーに説明しておけばどうでしょう。

投稿日時: 23/07/14 13:19:37
投稿者: 滝沢

Suzu様、sk様、Hatena様
せっかくアドバイスをいただいているのに滞ってしまい申し訳ありません。
現在、本業務が停止してしまっており進めることができませんでした。
もう少しで復帰できる予定ですので改めて取り掛かります。
よろしくお願い致します。

トピックに返信