MS Access Tips/Sample and VBA and Blog customize etc...

非連結のチェックボックスでレコードを選択する

帳票フォームでチェックボックスを配置して、チェックしたレコードのみ選択して印刷したいのですが、一つのレコードをチェックするとすべてのレコードが選択されてしまいます。

掲示板でたまにみかける質問です。
気持ちは分かりますが、非連結コントロールでの更新はすべてのレコードに反映されてしまいます。
一つのコントロールにプロパティ値は一つしかもてませんので。各レコード毎にプロパティ値を持つような設計にしたら大量のデータを扱うデータベースではメモリを圧迫してしまうのでしかたがない仕様でしょう。

で回答としては、テーブルに Yea/No型のフィールドを追加して、チェックボックスをそれと連結させましょう。となります。

しかし、その場限りの指定で、残しておく必用はない、フォームを閉じれば消えてしまってもいいというときには、そのためだけに、フィールドを追加するのも無駄のよう気がします。あるいは、外部データベースでテーブルの変更が出来ないという場合もあるでしょう。

そんなときに役立つ?、非連結チェックボックスでも、個別に選択できる方法を今回は紹介します。

非連結チェックボックスで選択

難易度:

サンプル作成

得意先リストを出すという前提で説明します。
帳票フォームのレコードソースの主キーフィールド 得意先コード

フォームヘッダーかフッターにテキストボックスを配置

プロパティ設定値
名前       txtChkList 
コントロールソース 
可視 はい 

詳細セクションにチェックボックスを配置します。

プロパティ設定値
名前       Chk1
コントロールソース         =InStr([txtChkList] & ",","," & [得意先コード] & ",")
可視 はい 

このチェックボックスの上に重なるようにコマンドボタンを配置します。
プロパティ設定値
名前       cmdChk
透明         はい 
タブストップ  いいえ

フォームヘッダーかフッターにコマンドボタンを配置します。
プロパティ設定値
名前    cmdプレビュー 

フォームのデザインビュー

それぞれのコマンドボタンのクリック時のイベントプロシージャを下記のように記述。

 

補足 txtChkList は表示させてますが、動作確認のためですので、確認できたら、可視 をいいえにしてください。また、代わりにフォームモジュールレベル変数に格納するようにしてもいいかと思います。

追記

「すべて選択」ボタンを追加する方法についての質問がありましたので、実装してみました。ついでに、「選択解除」ボタンを追加しました。また、上記の cmdプレビュー_Click に選択件数が0の場合のエラー処理も追加しました。

追記 2012/01/24

チェックしたレコードを削除するボタンを追加する方法についての質問がありましたので、サンプルコードを追加しておきます。

【サンプル1】フォームのレコードセットを利用して削除する方法

【サンプル2】txtChkListから条件式を生成して削除クエリのSQL文を実行する方法

追記 2016/07/26

1件のみチェックする方法についての質問がありましたので、サンプルコードを追加しておきます。

詳細セクションのチェックボックス Chk1 のコントロールソースを変更します。

プロパティ設定値
名前       Chk1
コントロールソース         =StrComp([txtChkList],[得意先コード])=0

テキストボックス txtChkList の規定値を下記のように設定します。

プロパティ設定値
名前       txtChkList
規定値         =0

透明ボタン cmdChk のクリック時


サンプルファイルが下記からダウンロードできます。
FrmNonconnetCheck_07.zip (Access 2007-2010 形式 - 38kb)
FrmNonconnetCheck.zip (Access 2002-2003 形式 - 32kb)
FrmNonconnetCheck_2k.zip (Access 2000 形式 - 29kb)

拍手する

32 Comments

hatena says..."「すべて選択」ボタンを追加"

非公開コメントで、「すべて選択」ボタンについての質問がありましたので、情報を追加しました。

2009.05.26 23:12 | URL | #5uE6dEgY [edit]
かわかみ says..."選択したレコードの削除について"

いつも貴ブログを拝見し非常に参考にさせていただいております。
古い記事への質問で大変恐縮なのですが、ご教示いただけますと幸いです。

上記の記事を参考にさせていただき私のデータベースにもチェックボックスを表示させることが出来ました。

そこで質問なのですが、選択した項目を削除するボタンを作成したいのですが、削除クエリを実行するときに選択の有無で抽出する方法が思い浮かびません。

もし良いアイディアがありましたら教えてください。
よろしくお願いいたします。

2012.01.24 15:39 | URL | #USufH/tE [edit]
hatena says..."re: 選択したレコードの削除について"

サンプルコードを記事に追記しておきましたので、ご参照ください。

2012.01.24 16:29 | URL | #5uE6dEgY [edit]
かわかみ says..."ありがとうございました"

さっそくご回答いただきありがとうございました!
パターン1の方で作成してみました。
パターン2の方も今後のために覚えておきたいと思います。
本当にありがとうございました。

2012.01.24 17:10 | URL | #- [edit]
ヤマダ says..."選択した非連結チエックボックスのみoff"

いつも、このブログを参考にさせて頂いております。
非連結のチエックボックスでレポートを出力する方法は、出来たのですが。
選択したチエックボックスのみまたは、全て初期状態に戻す場合の方法で悩んでおります。(レコードの削除はしたくありません)

非連結の場合では、無理なのでしょうか?。
ご教授願えれば、幸いです。


2014.02.19 11:41 | URL | #- [edit]
hatena says..."re:選択した非連結チエックボックスのみoff"

> 非連結のチエックボックスでレポートを出力する方法は、出来たのですが。
> 選択したチエックボックスのみまたは、全て初期状態に戻す場合の方法で悩んでおります。(レコードの削除はしたくありません)

記事の「追記」で、「すべて選択」ボタンと「選択解除」ボタンについて解説してますが、それではだめですか。

2014.02.19 11:49 | URL | #5uE6dEgY [edit]
yonerin says..."サブフォームとしての利用方法"

いつも拝見させて頂いております。
「非連結のチェックボックスでレコードを選択する」を参考に3つのフォームA,B,Cを作りました。作った3つのフォームをサブフォームとするフォームDを作り、そこからチェックを入れたレコードをレポートとして出力したいのですがどうすればよいでしょうか。
宜しくお願い致します。

2014.04.02 10:59 | URL | #- [edit]
igachan says..."チェックのみ印刷・・そのあとクリア"

Hatenaさん、お世話になっております。このVBAを参考にすると
 
「テーブルAのチェックボックスにチェックを入れたものを選択クエリBで抽出して一括で印刷をさせて、①印刷をしたデータにテーブルAに印刷日を記録して、②テーブルAのチェックを外したい 」

という動作は可能でしょうか?

2014.04.03 01:31 | URL | #- [edit]
hatena says..."re:サブフォームとしての利用方法"

> 「非連結のチェックボックスでレコードを選択する」を参考に3つのフォームA,B,Cを作りました。作った3つのフォームをサブフォームとするフォームDを作り、そこからチェックを入れたレコードをレポートとして出力したいのですがどうすればよいでしょうか。

3つのサブフォームのレコードソース、リンクフィールドの設定、
レポートのレコードソースの設定、
の具体的な情報をご提示ください。

2014.04.03 01:39 | URL | #5uE6dEgY [edit]
hatena says..."re:チェックのみ印刷・・そのあとクリア"

> 「テーブルAのチェックボックスにチェックを入れたものを選択クエリBで抽出して一括で印刷をさせて、①印刷をしたデータにテーブルAに印刷日を記録して、②テーブルAのチェックを外したい 」
>
> という動作は可能でしょうか?

可能です。

だだ、テーブルやクエリを直接操作するのではなく、
テーブルを元にフォームを作成して、
このページの方法を適用します。

印刷は、テーブルからレポートを作成して、このページのプレビューボタンのVBAを参考にしてレポートを印刷するボタンを作成してください。

印刷日を記録する方法は、下記のページの「印刷日時をテーブルに履歴として記録しておきたい。」の項目を参考にしてください。


レポートで印刷かプレビューか判断する - hatena chips
http://hatenachips.blog34.fc2.com/blog-entry-170.html

2014.04.03 01:52 | URL | #5uE6dEgY [edit]
igachan says..."re:チェックのみ印刷・・そのあとクリア"

お世話になっております。無事にプレビュー、すべて選択、選択解除、すべて動作の確認ができました。ありがとうございます。1つ思ったのですが、データの選択中に「選択解除」ボタンをクリックして削除されては困るので本当にチェックマークを外すだけの機能がほしいのですがどうしたらよいでしょうか?「すべて選択」の構文を変形すればできると思いいろいろとやってみたのですがダメでアクセスがフリーズしてしまいました。

2014.04.03 14:03 | URL | #- [edit]
igachan says..."re:re:チェックのみ印刷・・そのあとクリア"

> > 「テーブルAのチェックボックスにチェックを入れたものを選択クエリBで抽出して一括で印刷をさせて、①印刷をしたデータにテーブルAに印刷日を記録して、②テーブルAのチェックを外したい 」
> >
> > という動作は可能でしょうか?
>
> 可能です。
>
> だだ、テーブルやクエリを直接操作するのではなく、
> テーブルを元にフォームを作成して、
> このページの方法を適用します。
>
> 印刷は、テーブルからレポートを作成して、このページのプレビューボタンのVBAを参考にしてレポートを印刷するボタンを作成してください。
>
> 印刷日を記録する方法は、下記のページの「印刷日時をテーブルに履歴として記録しておきたい。」の項目を参考にしてください。
>
>
> レポートで印刷かプレビューか判断する - hatena chips
> http://hatenachips.blog34.fc2.com/blog-entry-170.html

おかげさまで日付を入力することはできました。ありがとうございます。

2014.04.03 16:01 | URL | #- [edit]
hatena says..."re:re:チェックのみ印刷・・そのあとクリア"

> お世話になっております。無事にプレビュー、すべて選択、選択解除、すべて動作の確認ができました。ありがとうございます。1つ思ったのですが、データの選択中に「選択解除」ボタンをクリックして削除されては困るので本当にチェックマークを外すだけの機能がほしいのですがどうしたらよいでしょうか?

ん?
記事の追記の「選択解除」ボタンは、チェックマークを外すだけで、削除はされませんが。

2014.04.03 16:49 | URL | #5uE6dEgY [edit]
igachan says...""

申し訳ありませんでした。削除部分の追記を書き込んでしまいました。

2014.04.03 18:30 | URL | #- [edit]
とぼ says..."プレビューをクリックするとエラーがでます。"

VBA初心者です。説明やサンプルを元に、作成したのですが、プレビューをクリックすると、3464 抽出条件でデータ型が一致しません。というエラー^がでてきます。得意先コードを企業CDに書き換えて作成しているのですが、元のコードがテキスト型で、それが、関係しているのでしょうか?調べたところ。どこかを’で囲めばよいのかな?と思うのですが、いろいろやってみましたが、答えがみつからず・・・。お知恵をお貸しいただければ幸いです。よろしくお願いします。

2014.06.05 13:51 | URL | #4ifQ3KdE [edit]
hatena says..."re:プレビューをクリックするとエラーがでます。"

ご推察通り、主キーがテキスト型ということが原因ですね。

    strFilter = "得意先コード In(" & Mid(Me.txtChkList, 2) & ")"

の部分を下記に修正してください。

    strFilter = "得意先コード In('" & Replace(Mid(txtChkList, 2),",","','") & "')"

得意先コードの部分は、実際のフィールド名に書き換えてください。

2014.06.05 14:21 | URL | #5uE6dEgY [edit]
とぼ says..."できました。ありがとうございました。"

かれこれ、3日間近く悩んでおりました。
理想どおりの結果になりました。
とても感謝、感謝です。
ありがとうございました!

2014.06.05 15:42 | URL | #- [edit]
zenzen says..."データ型が一致しません。"

以前に別の場所でこのトピックを紹介して頂いた者です。
やっととりかかれる状態になったので手を付けているのですが、
上手く行っていません。
パラメーターの入力ウィンドウ(と呼ぶのか不明ですが)が表示されたあと、データ型が一致しないエラーが出ています。
チェックしたデータを他のテーブルに追加する、という操作をしたいのですが・・。
現状動いていないINSERT文は以下の通りです。


INSERT INTO T_伝票明細 ( 伝票番号, 作番, 内容, 枝番, 客先注文番号, 品名, 数量, 単価, 備考, 作番ID ) SELECT T_伝票.伝票番号, T_販売管理.作番, T_販売管理.内容, T_販売管理.枝番, T_販売管理.客先注文番号, T_販売管理.品名, T_販売管理.数量, T_販売管理.単価, T_販売管理.備考, T_販売管理.作番ID FROM T_伝票, T_販売管理 WHERE (((T_伝票.伝票番号) = (DMax(T_伝票.伝票番号,T_伝票))) AND (([T_販売管理].[作番ID] = 17221 OR [T_販売管理].[作番ID] = 17220 OR [T_販売管理].[作番ID] = 17222)));

条件式の置き換え方がまずいのでしょうか。
そもそもパラメータの入力画面が出る時点で問題なのでしょうが・・。
アドバイス頂ければ幸いです。

2014.07.07 10:05 | URL | #- [edit]
hatena says..."re:データ型が一致しません。"

> 以前に別の場所でこのトピックを紹介して頂いた者です。
> やっととりかかれる状態になったので手を付けているのですが、
> 上手く行っていません。


このトピックとは特に関係なさそうですが、

> INSERT INTO T_伝票明細 ( 伝票番号, 作番, 内容, 枝番, 客先注文番号, 品名, 数量, 単価, 備考, 作番ID ) SELECT T_伝票.伝票番号, T_販売管理.作番, T_販売管理.内容, T_販売管理.枝番, T_販売管理.客先注文番号, T_販売管理.品名, T_販売管理.数量, T_販売管理.単価, T_販売管理.備考, T_販売管理.作番ID FROM T_伝票, T_販売管理 WHERE (((T_伝票.伝票番号) = (DMax(T_伝票.伝票番号,T_伝票))) AND (([T_販売管理].[作番ID] = 17221 OR [T_販売管理].[作番ID] = 17220 OR [T_販売管理].[作番ID] = 17222)));

とりあえず、明らかな間違いは、DMax関数の引数は文字列にしないとだめということですね。文字列にするには、" で囲みます。

DMax("伝票番号","T_伝票")

2014.07.07 10:25 | URL | #5uE6dEgY [edit]
zenzen says..."ありがとうございます。"

確かにこのトピックとは関連が無いです。済みません。
ご指摘頂いて思い出しましたが、
元々Dmax("伝票番号","T_伝票”)としていたのですが、
コンパイルエラーが出ていたので弄った挙句に引用符を外してしまっていました。二重に引用符を付けることで動作が改善されました。
お手数おかけしました。

2014.07.07 10:59 | URL | #- [edit]
rhapsody says..."削除前にメッセージを表示させたい"

サンプルコードが大変参考になり、助かります。
ありがとうございます。

レコードの削除ボタンを設置しようとしておりますが、
(【サンプル1】フォームのレコードセットを利用して削除する方法)
本当に削除を行うかメッセージを表示させ、
『はい』ならば実行(削除)、『いいえ』ならばなにもせずに戻る、
を実現させたいのです。お知恵を拝借できれば幸いです。
よろしくお願いいたします。

2014.08.13 16:19 | URL | #p71T3McU [edit]
hatena says..."re:削除前にメッセージを表示させたい"

下記のコードを挿入してください。

Private Sub cmd削除_Click()
  Dim Lst As Variant
  Dim i As Integer

   If MsgBox("チェックしたレコードを削除します。いいですか。", vbYesNo) = vbNo Then Exit Sub

  以下略

2014.08.13 16:33 | URL | #5uE6dEgY [edit]
ほいっと says..."削除ボタン実行後のエラー"

hatenaさん、
いつも参考になる情報を紹介していただきありがとうございます。いろいろ自分でも試し役立っています。感謝です。

ところで、今回のチェックボックスの削除ボタンでのエラーがありました、もしかすると、既にお気づきかと思いますが念のため

txtCheckList = ""
にしたあと、チェックボックスがグレーになり、それをクリックすると、エラーになりました。おそらくレコードソースが ""になったので、更新しないと反映されないのかなと思い、
cmdCheck.Requery
を試したら、元の白いチェックボックスになりました。

もし、私の対応方法よりも良いやり方がある場合、また、お知らせ下さい。


よろしくお願いします。

2014.11.17 12:15 | URL | #mQop/nM. [edit]
kiichi says..."Access2002にてこの方法を試したのですが"

丁度自分がやりたいことが載っていたので参考にさせていただきましたがどうも上手くいきません。

ソース上では
If Me.chk1 Then
の部分でエラーになり、
「アプリケーション定義またはオブジェクト定義のエラー」
「型が一致しません」
となります。

試しに上記のソースを消してチェックボックスを初期状態(NULL)でボタンを押したらどうなるかを試しましたがチェックボックスにチェックがつくことはありませんでした。

>得意先リストを出すという前提で説明します。

とありましたがひょっとしてForm_Loadでリストを表示していると駄目だとかそういったことがあるのでしょうか?

ご教授いただければ幸いです。
よろしくお願いいたします。

2016.01.17 22:25 | URL | #KOvRKSV2 [edit]
hatena says..."re:Access2002にてこの方法を試したのですが"

フォーム上に配置してあるチェックボックスの名前は chk1 になってますか。

2016.01.18 02:01 | URL | #5uE6dEgY [edit]
kiichi says...""

再度確認しましたがちゃんとchk1になっています

2016.01.18 21:16 | URL | #RCDcScmc [edit]
hatena says..."re:"

このページの通りに設定すればうまくいくはずですので、
もう一度、最初から記事を読んで同じになっているか確認してください。

それでうまくいかないようなら、下記の掲示板で再質問してください。
その時に現場のファイルから質問に関係あるオブジェクトのみ残したファイルをアップロードしてもらうといいですね。

hatena の Microsoft Access 掲示板
http://hatena-access.progoo.com/bbs/

2016.01.19 11:44 | URL | #5uE6dEgY [edit]
says..."承認待ちコメント"

このコメントは管理者の承認待ちです

2016.02.07 22:18 | | # [edit]
akiru says..."フィルターの設定をレポートに引き継ぐ方法についてご教授ください"

チェックボックスを使用して選択したレコードだけを印刷するためレポートに引き継ぐようにこのHPを見ながら設定しました。フォームは問題なく機能するようになったのですが、レポートはエラーがでて開くことができません。ちなみにレポートはフォームのフィルターを引き継ぐようレポートを開くときにイベントとして
  Me.Filter = Forms![F_4ライセンス印刷].Filter
  Me.FilterOn = True
としました。どうしたら正常にレポートを開くことができるようにできるのでしょうか?
 ご教授を賜るようお願いします。

2016.04.19 18:42 | URL | #n8h4Iztg [edit]
hatena says..."re:フィルターの設定をレポートに引き継ぐ方法についてご教授ください"

> チェックボックスを使用して選択したレコードだけを印刷するためレポートに引き継ぐようにこのHPを見ながら設定しました。フォームは問題なく機能するようになったのですが、レポートはエラーがでて開くことができません。

チェックボックスで選択したレコードだけを印刷するなら、このページのコードだけでいいはずです。
レポートの開くときのコードは不要ですので削除してください。

2016.04.20 02:55 | URL | #5uE6dEgY [edit]
ぽんた says..."非連結のチェックボックスでレコードを選択する方法について"

はじめまして。
「非連結のチェックボックスでレコードを選択する」方法、大変勉強になりました。
この方法では、複数選択が可能ですが、一つだけしか選択できないようにするには
どのようにしたらよいですか?また、チェックボックスの横に「印刷」ボタンを追加し、チェックボックスにチェックが入った行のみにボタンを表示し、そのほかは非表示(クリックできないようにする)方法はございますか?
ご教授いただければ幸いです。
よろしくお願いいたします。

2016.07.26 17:54 | URL | #X5XodAgg [edit]
hatena says..."一つだけしか選択できないようにする方法について"

ぽんたさん

記事の方に、「一つだけしか選択できないようにする」方法を追記しておきましたので、参照ください。

2016.07.26 20:02 | URL | #5uE6dEgY [edit]

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/28-daf95703
該当の記事は見つかりませんでした。