[[20130124100045]] 『チェックボックスをチェックした項目のみ表示』(しょう) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『チェックボックスをチェックした項目のみ表示』(しょう)

 すみません、過去の質問を検索し、調べましたが、自分のやりたいことかわからなかったので、
 質問させていただきます。(OSはXP、Excel2003使用)
 例えば・・・

   A
 1 □調査
 2 □分解
 3 □手入れ
 4 □組立て

 とSheet1にありまして(□はチェックボックス)、分解(A2)と組立て(A4)にチェックを
 入れたとして、Sheet2に

   A
 1 分解
 2 組立て

 とチェックした項目のみ表示させたいのですが・・・可能でしょうか?
 過去の質問と同様のがありましたら、「これを見ろ」とご指摘ください。


 それぞれのチェックボックスにチェックが入っているかいないかの判定はセルと値をリンクさせておくことで
 判定できるけど、そのキャプションは関数では取得できないのでは?
(詳しくないので、もしかしたら、こうしたらできる!とおしかりを受けるかもしれないけど)

 どこかに、各チェックボックスのキャプションと同じものを、その順番通りに記述したリストを準備しておけば
 関数エキスパートさんだったら、できると思うけど。

 (ぶらっと)

 フォームのチェックボックスならぶらっとさんがおっしゃっているように
 セルと値をリンクさせることができるので、それを利用します。
 A1セルにあるチェックボックスをCtrlキーを押しながらクリック→数式バーに =B1
 A2セルにあるチェックボックスをCtrlキーを押しながらクリック→数式バーに =B2
 と上記作業を繰り返して、Sheet2のA1セルに
 =IF(COUNTIF(Sheet1!B$1:B$4,TRUE)<ROW(A1),"",TRIM(INDEX(Sheet1!A$1:A$4,SMALL(IF(Sheet1!B$1:B$4=TRUE,ROW(A$1:A$4)),ROW(A1)))))
 Ctrl + Shift + Enter で確定
 下にフィルコピー

 チェックを入れるとB列にTRUE、はずすとFALSEと表示されるので、それで判断します。

 (se_9)

 Sub test()
    Dim OBJ As Object
    Dim iR As Long

    With Sheets("Sheet2")
        .Columns("A").ClearContents
        For Each OBJ In Shapes
            If OLEObjects(OBJ.Name).Object.Value = True Then
                iR = iR + 1
                .Cells(iR, "A").Value = OLEObjects(OBJ.Name).Object.Caption
            End If
        Next
    End With
End Sub

(???)


 皆さん、ご意見ありがとうございます。

 se_9さん、数式バーには「=EMBED("Forms.CheckBox.1","")」が表示されてます。そのバーに「=B1」を
 入れるとチェックボックスが空白になってしまいます・・・。

 ???さん、このマクロを入れればいいのですか?すみませんSheet2には表示されないのですが・・・

 (しょう)


 ActiveXのチェックボックスでもプロパティのLinkedCellでセルの指定が可能。
 だけど、こちらをつかうなら、処理もVBAでやればいいかと。

 ところで、(???)さんのコード、ActiveXのチェックボックスを相手にしていると思われるけど
 コードとしては、これでいいのかな? コンパイルレベルのエラーにならない?
 やるなら、たぶん以下。

 Sub Test2()
    Dim OBJ As Object
    Dim iR As Long

    With Sheets("Sheet2")
        .Columns("A").ClearContents
        For Each OBJ In Sheets("Sheet1").OLEObjects
            If OBJ.Object.Value = True Then
                iR = iR + 1
                .Cells(iR, "A").Value = OBJ.Object.Caption
            End If
        Next
    End With

 End Sub

 ただし、Each OBJ で取得するオブジェクトは、必ずしも、シートの上にあるものから抽出されるのではなく
 そのシート上に配置された順番で抽出されるので、かりに、後からチェックボックスを追加して、それを
 シートの一番上にもってきても、抽出の順番は後になってしまう。
 なので、少し工夫が必要かな?

 (ぶらっと)

 かならず、上から順番にチェックボックスを配置したということを前提にできればもう少し簡単な記述も
 できるかと思うけど、以下は、上から順番に配置してあるチェックボックスの名前を、その順番で記述して処理。

 チェックボックスを配置したシートのシートモジュール(シートタブを右クリックしてコードの表示を選んででてくる場所)に
 以下を貼り付けて。

 Sub Sample()
    Dim ckBox As Variant
    Dim i As Long

    Sheets("Sheet2").Columns("A").ClearContents

    For Each ckBox In Array("CheckBox1", "CheckBox2", "CheckBox3", "CheckBox4")
        With Me.OLEObjects(ckBox).Object
            If .Value Then
                i = i + 1
                Sheets("Sheet2").Cells(i, "A").Value = .Caption
            End If
        End With
    Next

 End Sub

 Private Sub CheckBox1_Click()
    Sample
 End Sub

 Private Sub CheckBox2_Click()
    Sample
 End Sub

 Private Sub CheckBox3_Click()
    Sample
 End Sub

 Private Sub CheckBox4_Click()
    Sample
 End Sub

 (ぶらっと)

 (ぶらっと)さん、すみません、Sheet2は何もしなくていいのですか?
 特にSheet2には表示されないのですが、やり方がまずいのですかね。

 (しょう)

 >Sheet2は何もしなくていいのですか?

 Sheet2のセルへの書き込みは、アップしたコードの中で行っている。
 Sheet1のチェックボックスにチェックを付けたり外したりした瞬間に Sheet2に、その時点での状況から
 チェックがついたキャプションを書きこんでいるんだけど??

 追記

 >数式バーには「=EMBED("Forms.CheckBox.1","")」が表示されてます

 この説明から、チェックボックスはActiveXコントロールだと理解しているんだけど
 それは大丈夫?

 (ぶらっと)

 何度もすみません。
 はい、デザインモードにし、チェックボックスをワンクリックすると、
 「=EMBED("Forms.CheckBox.1","")」が表示されます。

 あっ、推測なのですが、僕が使用しているチェックボックス(ActiveXコントロール?)は
 オートシェイプみたいに自由に移動できるやつなのですが・・・これが悪さしているのでしょうか?
 だからセルA1に情報はなく、セルA1の上にチェックボックスがあるイメージですかね。

 (しょう)

 う〜ん・・・・と・・・

 まず、試してくれているのは後でアップしたシートモジュール版のコードだよね?
 (最初にアップした Test2 は、(???)さんのコードに対する意見ということで無視してね)

 で、コメントしたように、配置する順番でインデックスがふられるので、インデックスは相手にせず
 あくまで、上から順番に、その名前を

 For Each ckBox In Array("CheckBox1", "CheckBox2", "CheckBox3", "CheckBox4")

 これで指定してもらっている。これは大丈夫?

 (ぶらっと)

 はい、各チェックボックスのプロパティを見ると上から順にオブジェクト名が
 「CheckBox1」「CheckBox2」「CheckBox3」「CheckBox4」となっています。

 (しょう)

 まず、VBE画面で 表示->イミディエイトウィンドウ で、下のほうに イミディエイトウィンドウ を表示。
 で、そのウィンドウの中に
 ?Application.EnableEvents といれてエンター。
 その下の行に True または Fasle がでる。
 もし、False がでたら、その下の行に
 Application.EnableEvents = True  といれてエンター。

 これで、もう一度、Sheet1でチェックボックスを選んでくれる?

 で、もし、 ?Application.EnableEvents といれてエンターで、True とでたとしたら、

  Private Sub CheckBox1_Click()
    Sample
  End Sub

 この Samle と記述してある行にブレークポイントを設定してから、Sheet1の CheckBox1 のチェックを変更してくれる?
 ブレークポイントは、この Sample の行をクリックして F9 を押すことで設定(あるいは設定解除)ができる。

 ここが黄色くなって止まるはずなので。
 とまったら、その後、F8 を押しながらステップ実行していって、どんな順番でコードが実行されるか確認お願い。

 (ぶらっと)

 先ほどは的外れな回答失礼しました。
 ところでこちらで試してみたところ、ぶらっとさんのコード(Sub Sampleから始まるコード)でうまくいきました。
 標準モジュールにコードを貼り付けたり、チェックボックスが配置されているのはSheet1なのにSheet2のところに
 コードを貼り付けているということはありませんよね?

 (se_9)

 ほんとうに手間を掛けさせてしまい申し訳ありません。

 まず、「True」となりました。
 Sampleの行が赤茶色になり、左側に●ある状態です。
 F8を押すとSampleの上の「Private Sub CheckBox1_Click()」が黄色になり、
 次に「Sample」→ 一番上の「Sub Sample()」→「Sheets("Sheet2").Columns("A").ClearContents」
 の後に「実行時エラー'9': インデックスが有効範囲にありません」
 と出ました。

 どうですか?

 (しょう)


 se_9さん、「VBAProject(ファイル名)」の下の「Microsoft Excel Objects」のフォルダの下の
 Sheet1に入力されています。

 (しょう)

 >「実行時エラー'9': インデックスが有効範囲にありません」

 "Sheet2" というシートはちゃんとある?

 追記

 もしかしてVBE画面の左上のプロジェクトエクスプローラに
 Sheet2(○○○○) となっているということは?

 この ○○○○ がシート名なので、もし、こうなっているなら
、2か所ある Sheets("Sheet2") を Sheets("○○○○") に変更してね。

 (ぶらっと)


 あっ、出ました!
 1回ファイルを保存して閉じ、もう一度開きなおし(マクロは有効に)たところ、
 Sheet2に出ました。

 ありがとうございます。まさに思い通りのやり方です。
 (ぶらっと)さん、(se_9)さん、(???)さん、ほんとうにありがとうございます。

 (しょう)

 でも、たまにチェックしてもSheet2に表示されない時がありますが、
 どのようなことが考えられますか?

 (しょう)

 チェックボックス4の
 Private Sub CheckBox4_Click()
    Sample
 End Sub

 「Sample」が抜けていたので、表示されない時があったみたいです。すみません。

 (しょう)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.