チェックボックスのEnabled = False仕方

タグの編集
投稿者 DB開発中  (社会人) 投稿日時 2011/4/9 11:13:37
あるフォームのテーブルでレコードごとにA・B・Cの3つのテキストボックスとX・Y・Zのチェックボックスがありまして

B・Cのテキストボックスがブランクだったら、Y・ZのチェックボックスをEnabled = False
Cのテキストボックスがブランクだったら、ZのチェックボックスをEnabled = False
この2つのパターンがあります。どうしたらいいのですか。教えてください。やっぱりDO~LoopのRS.EOFですか。僕が考えるプログラムはこれです。まちがっていますか。


      Private Sub Form_Open(Cancel As Integer)

       Set DB = DBEngine.Workspaces(0).Databases(0)
       Set RS = DB.OpenRecordset("テーブル名", dbOpenDynaset)
        
        Set a2 = RS.Fields("B")
        Set a3 = RS.Fields("C")
        Set s2 = RS.Fields("Y")
        Set s3 = RS.Fields("Z")

   RS.Movefaset
     Do until RS.eof
        If a2="" and a3="" then
        S2. Enabled = False
        S3. Enabled = False
       RS.movenexst
Else
     If If a2<>"" and a3="" then
     S3. Enabled = False
     RS.movenexst
End if
End if

Db.close
投稿者 しるふぃん  (社会人) 投稿日時 2011/4/9 11:54:08
今ひとつ内容がわかりません。

あるフォームを開く際にDBを読み込み、DBのレコードごとにフィールドを判断。
その判断結果を元にフォームのチェックボックスを編集することですか?
投稿者 DB開発中  (社会人) 投稿日時 2011/4/9 16:13:51
はい。そうです。その方法を教えてください
投稿者 もちだ  (社会人) 投稿日時 2011/4/9 16:41:35
なんとなくやりたいことは判るのですが、質問の前にご自分でテスト実行されてはいかがでしょうか。
流石に動かないでしょうし、回答側も判断に苦しむでしょう。
・Doに対応するLoopが無い
・IfIfってなんぞや
・環境が不明

判断するところのコードはこんな感じでしょうけど。
If a2="" and a3="" then
        S2. Enabled = False
        S3. Enabled = False
Elseif a2<>"" and a3="" then
        S2. Enabled = True
        S3. Enabled = False
End if

レコード一つ読む毎にこれを判断しているのなら、わざわざDo~Loopを使う必要は無いのでは?


(これってそもそもDBからデータ引っ張ってこれてるのかなぁ?)
投稿者 しるふぃん  (社会人) 投稿日時 2011/4/9 17:16:22
コードにするならば、もちださんの方法やSelect 文を利用する方法もありますね。

ただ、1つ疑問が。

レコードを1件ずつ読むごとに判断し、チェックボックスを編集しているということであれば
レコードが複数あれば、同じチェックボックスを何回も編集することになりませんか?
そもそもその辺の処理というか、仕様がわからないのでこれ以上はなんとも・・・・。
投稿者 DB開発中  (社会人) 投稿日時 2011/4/9 17:32:47
もちださんの方法で、レコードが約40件ほどあります。そのレコードを全部判断したいです。
同じチェックボックスを何回も編集することになります。それ以外の手はありますか
投稿者 しるふぃん  (社会人) 投稿日時 2011/4/9 17:42:43
再度確認です。
実際の画面(フォーム)ですが、どのように作られていますか?

データレコードが40件ほどということは、当然今後も増えるということですか?
また、件数が固定しているならば、固定している数分フォーム上にチェックボックスがあるということですか?

もし、するのであれば・・・。
1件ずつレコードを読みながら判断し、レコードの内容+判断した結果をListview等にセットして
フォーム上で見せることも可能ですが。



投稿者 (削除されました)  () 投稿日時 2011/4/9 18:15:18
(削除されました)
投稿者 DB開発中  (社会人) 投稿日時 2011/4/9 18:20:40
もちろん増えていきます。
チェックボックスもそれに比例して増えていきます
フォームは表で作っています
しるふぃんさんのいうている意味がもう1つ分かりにくいです。もうちょっとわかりやすく教えてください 
投稿者 るきお  (社会人) 投稿日時 2011/4/10 10:02:33
ひょっとしてAccess 2000でしょうか?
投稿者 DB開発中  (社会人) 投稿日時 2011/4/10 12:22:47
access 2010です。お力をお貸しくださいお願いします
投稿者 しるふぃん  (社会人) 投稿日時 2011/4/11 16:42:26
出来れば開発環境は最初に明記してほしいです。
推測での返答は時間がかかるだけですし、お互いにずれたまま話を進めるとややこしくなるので。

ActiveXコントロールの「Listviewコントロール」を使用すればというのが、前回の回答でした。

あと、チェックボックスを使うかどうかですが、今回はあえて普通のテキスト項目に"True"か"False"
で入れています。

サンプル
    Set WS = DBEngine.Workspaces(0)
    Set DB = WS.Databases(0)
    Set TB1 = DB.OpenRecordset("テーブル名", DB_OPEN_TABLE)
    If Not TB1.EOF Then
        TB1.MoveFirst
        Do Until TB1.EOF
            Dim itm As ListItem
            'セットしたいDBの項目 
            Set itm = Me!ListView0.ListItems.Add(, , TB1!セットしたい項目)
            itm.SubItems(1) = TB1!セットしたい項目
            If a2="" and a3="" then
                itm.SubItems(2) = "False"
                itm.SubItems(3) = "False"
           Elseif a2<>"" and a3="" then
                itm.SubItems(2) = "True"
                itm.SubItems(3) = "False"
           End if
           TB1.MoveNext
        Loop
    End If
    TB1.Close: TB2.Close: QDef.Close: DB.Close

※あくまでもサンプルです。このままでは動きません。
  使用方法も含めて一度「ListView」をぐぐってみて調べてみてください。
投稿者 DB開発中  (社会人) 投稿日時 2011/4/11 17:40:26
すいません。以後気を付けます。
コードの方はありがとうございます。あとは自分で手を加えたいと思います。ありがとうございました
投稿者 (削除されました)  () 投稿日時 2011/4/12 20:48:59
(削除されました)
投稿者 DB開発中  (社会人) 投稿日時 2011/4/12 20:50:36
しるふぃんさんさんのコードをチェックボックスに変えようと思ったらエラーが出ます。どうしてでしょうか。教えてください 
投稿者 DB開発中  (社会人) 投稿日時 2011/4/12 20:57:25
エラーの内容は、デバックできません
itm.SubItems(2) .chacbox.enabled=falseを打ち込んだらエラーが出ます。使い方を間違っていますか。それと、TB1!セットしたい項目はフォームですか。フォーム名で上のエラーが出ていますか
投稿者 しるふぃん  (社会人) 投稿日時 2011/4/13 08:48:04
Dim itm As ListItemは、ListViewの1行をあらわす変数です。

この前のサンプルはテーブルを読み込み、EOFになるまで順次読み込んでいく。
読み込む都度判断を行いながら、ListViewの1行にデータを編集していく流れですね。
(例:エクスプローラーを開くと、右側のウィンドウがListviewにあたります。)

順に説明すると、TB1はRecordsetとして定義してあるものです。
(Dim TB1 As Recordset)
なので、TB1!セットしたい項目というのは、読み込むテーブルのフィールド名になります。

あと、ListItemのSubItemsプロパティ配下にCheckboxはないため、エラーになります。


なぜエラーかという前に「ListView」について調べてみましたか?
http://www.tsware.jp/study/vol10/comctl_07.htm
にもあるように、まずListItemオブジェクトとは何かを理解してください。
※1列目がListItemオブジェクトのキーとなり、2列目以降はそれにぶら下がるデータ
「SubItemsプロパティ」として管理されます。

調べてみるとわかると思いますが、SubItemsプロパティの中にはcheckboxはない為です。


それと前回にも書きましたが、ご自分ではご理解されている処理の概要を人に伝えることをもう少し丁寧にしたほうがいいですよ。
もちろん、その前にもう一度図に書くなり整理することも大事です。

私が理解している処理の概要は・・・。
まず、フォームが1つある。
そのフォームを開く際にテーブルを読み込み、データ1件1件判断しつつその結果をフォームに表示していくというものですよね。
なぜListviewを使うかというと、先日来の質問にもありましたが、テーブルに入っているデータが未知だということと、その未知の件数分フォームにテキストボックスやチェックボックスのコントロールを複数貼り付けていくのは見づらいだけだと判断したからです。

投稿者 とおりすがり  (社会人) 投稿日時 2011/4/13 11:57:33
単票フォーム上に、あるテーブルをレコードソースとした帳票フォームのサブフォームを置いて、
サブフォーム内のテキストボックスに各レコードの内容を表示、
その内容に応じてチェックボックスを表示したい

ってだけだったりしてね。
投稿者 DB開発中  (社会人) 投稿日時 2011/4/16 12:21:52
このチェックボックスの使い方はメールを送るアドレス指定するチェックボックスです。1人3つのテキストボックスにメールアドレスを入れています。メールアドレス2つの人もいれば3つの人もいますので、この方法使いたかったです。
投稿者 shu  (社会人) 投稿日時 2011/4/16 14:50:04
アクセスの帳票フォームとかデータシートビューの話だとすると
行毎(レコード毎)にコントロールの状態(プロパティ値)を変えることは
出来なかったかと思います。レコード移動時にでも状態をみて変更すると
よいのではないでしょうか?最近のは条件付き書式があるようなのでそれを
使うともしかすると出来るかもしれないです。
投稿者 DB開発中  (社会人) 投稿日時 2011/4/16 18:10:33
条件付き書式もできないみたいです。ほかに何かいい方法ありませんか。おねがいします
投稿者 shu  (社会人) 投稿日時 2011/4/16 21:47:07
アクセスの良いところはかなり制限のある状態を我慢するならフォームの作成が楽である
ということですが、その制限を超えるととたんにむずかしくなったりアクセスだけでは不可能に
なったりしてしまいます。簡単に出来ないフォームをアクセスで作成するよりはDBだけアクセスにして
フォームの作成はVB(6とか.Net)にしてしまわれた方がいろいろやりたいことは出来ると思います。
もしお客さんとかがアクセスで全部作ってという要望を出されているのでしたらアクセスではそこまで
出来ないことを説明した方が良いと思います。
投稿者 DB開発中  (社会人) 投稿日時 2011/4/17 10:55:35
ありがとうございます。accessではそこまでできないのですね。これですっきりしました。
投稿者 るきお  (社会人) 投稿日時 2011/4/17 11:22:34
こんにちは。

DB開発中さんがすっきりされたようなので、蛇足になってしまうかもしれませんが、


今回の一連のご質問ではDB開発中さんが、プログラムをどう作っているか十分な情報を出しておらず、アドバイスされる方々も有効なことを言いたくても言えない状況です。
しるふぃんさん
>今ひとつ内容がわかりません。
もちださん
>なんとなくやりたいことは判るのですが
しるふぃんさん
>実際の画面(フォーム)ですが、どのように作られていますか?

>ひょっとしてAccess 2000でしょうか? 
しるふぃんさん
>処理の概要を人に伝えることをもう少し丁寧にしたほうがいいですよ。


多分、DB開発中さんもどんな情報を出せばよいかわからない状態なのだろうかと思っています。
VBであれば、最悪でもすべてのソースコードをコピー&貼り付けすればなんとなく状況はわかるのですが、Accessの場合、フォームを作るところからどうやって作ったとか、重要なフォームのプロパティや、サブフォームの有無、コントロールのデータ連結などの情報がないとまともな話ができないです。
(私のAccessの知識はAccess2003時代のものですが…)

が、だからと言ってこういった情報をもらさず書き込もうとするときっと膨大な量になってしまうでしょう。
こういう場合は、質問者の方で工夫が必要です。
掲示板ではなく、身近にいる人に聞ければ一番いいんですけどね。
投稿者 Accessユーザー  (社会人) 投稿日時 2011/4/22 22:16:01
なんだかものすごく今更で申し訳ないんですが、いちおう。
 
条件付き書式を使えばレコードの値にあわせて表示を変更できます。
有効・無効も条件付書式で設定できます。
 
ただし、チェックボックスには条件付き書式を設定できません。
ですので、テキストボックスをチェックボックスに見せかけて使用します。
 
<参考>
 
Access Club
No36573.チェックボックスに条件付書式を設定したい
http://www.accessclub.jp/bbs3/0103/superbeg36573.html
 
hatena chips
チェックボックスのサイズを大きくする
http://hatenachips.blog34.fc2.com/blog-entry-37.html
 
もうできませんて説明しちゃったかなぁ…。
投稿者 とおりすがり  (社会人) 投稿日時 2011/4/23 16:35:50
条件文とか難しいことしなくても、
一度どこかのワークテーブルに落とし込んで、
そのときにメールアドレスの状態に従って、フラグを更新した上で、
そのワークテーブルをソースとしたサブフォーム作って表示すればいいだけじゃない?
あとは、各メールアドレスのテキストボックスのExitで、
現在行のフラグを更新する関数呼べばいいわけで。

せっかくAccessなんだからワークテーブル使えば楽にできる気が。
なんか、みなさん難しく考えすぎ?なのか、私がズレてる??のか。
投稿者 しるふぃん  (社会人) 投稿日時 2011/4/25 11:03:33
確かに難しく考えすぎている部分はあるかもしれませんねぇ・・・。

まあ結局のところどう見せるかでプログラムは変わるわけですし、人の癖というかやり方それぞれあるのでこれしか答えがない!ってのもおかしな話ですし。

自分自身長年プログラミングをやっていると変に凝り固まっているのがよくわかる(苦笑)
投稿者 shu  (社会人) 投稿日時 2011/4/27 13:57:53
> なんか、みなさん難しく考えすぎ?なのか、私がズレてる??のか。
レコード単位でEnabledとかVisibleの値を変えるのはAccessでは出来ないと思ってます。
(私が知らないだけかもしれませんが)そこで条件付き書式(条件文ではありません)では
どうかという案を出してみました。