Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


986 / 13645 ツリー ←次へ | 前へ→

【77005】コンボボックスとチェックボックスの連動に関する質問 mohimohi 15/5/5(火) 0:04 質問[未読]
【77006】Re:コンボボックスとチェックボックスの連... β 15/5/5(火) 6:42 発言[未読]
【77009】Re:コンボボックスとチェックボックスの連... mohimohi 15/5/5(火) 11:36 回答[未読]
【77012】Re:コンボボックスとチェックボックスの連... β 15/5/5(火) 13:50 発言[未読]
【77014】Re:コンボボックスとチェックボックスの連... mohimohi 15/5/5(火) 18:56 回答[未読]
【77016】Re:コンボボックスとチェックボックスの連... β 15/5/5(火) 19:27 発言[未読]
【77017】Re:コンボボックスとチェックボックスの連... mohimohi 15/5/5(火) 19:59 回答[未読]
【77018】Re:コンボボックスとチェックボックスの連... β 15/5/5(火) 20:19 発言[未読]
【77020】Re:コンボボックスとチェックボックスの連... mohimohi 15/5/5(火) 21:46 お礼[未読]
【77021】Re:コンボボックスとチェックボックスの連... β 15/5/6(水) 7:46 発言[未読]
【77040】Re:コンボボックスとチェックボックスの連... mohimohi 15/5/9(土) 20:40 質問[未読]
【77045】Re:コンボボックスとチェックボックスの連... β 15/5/10(日) 6:21 発言[未読]
【77048】Re:コンボボックスとチェックボックスの連... mohimohi 15/5/10(日) 11:35 発言[未読]
【77051】Re:コンボボックスとチェックボックスの連... β 15/5/10(日) 14:10 発言[未読]
【77052】Re:コンボボックスとチェックボックスの連... mohimohi 15/5/10(日) 14:54 発言[未読]
【77053】Re:コンボボックスとチェックボックスの連... β 15/5/10(日) 15:25 発言[未読]
【77054】Re:コンボボックスとチェックボックスの連... mohimohi 15/5/10(日) 17:07 お礼[未読]
【77055】Re:コンボボックスとチェックボックスの連... β 15/5/10(日) 17:33 発言[未読]
【77056】Re:コンボボックスとチェックボックスの連... mohimohi 15/5/10(日) 18:04 お礼[未読]
【77060】Re:コンボボックスとチェックボックスの連... mohimohi 15/5/11(月) 23:27 発言[未読]
【77061】Re:コンボボックスとチェックボックスの連... β 15/5/12(火) 10:08 発言[未読]
【77064】Re:コンボボックスとチェックボックスの連... β 15/5/12(火) 19:10 発言[未読]
【77065】Re:コンボボックスとチェックボックスの連... β 15/5/12(火) 19:14 発言[未読]
【77066】Re:コンボボックスとチェックボックスの連... β 15/5/12(火) 19:54 発言[未読]
【77073】Re:コンボボックスとチェックボックスの連... mohimohi 15/5/13(水) 8:13 お礼[未読]
【77074】Re:コンボボックスとチェックボックスの連... β 15/5/13(水) 9:14 発言[未読]
【77075】Re:コンボボックスとチェックボックスの連... β 15/5/13(水) 15:51 発言[未読]
【77076】Re:コンボボックスとチェックボックスの連... mohimohi 15/5/13(水) 23:08 お礼[未読]
【77077】Re:コンボボックスとチェックボックスの連... β 15/5/14(木) 1:19 発言[未読]
【77078】Re:コンボボックスとチェックボックスの連... mohimohi 15/5/14(木) 5:44 発言[未読]
【77022】Re:コンボボックスとチェックボックスの連... β 15/5/6(水) 21:56 発言[未読]
【77023】Re:コンボボックスとチェックボックスの連... mohimohi 15/5/6(水) 22:17 お礼[未読]
【77013】Re:コンボボックスとチェックボックスの連... β 15/5/5(火) 13:56 発言[未読]
【77007】Re:コンボボックスとチェックボックスの連... γ 15/5/5(火) 10:04 発言[未読]
【77010】Re:コンボボックスとチェックボックスの連... mohimohi 15/5/5(火) 11:43 回答[未読]
【77011】Re:コンボボックスとチェックボックスの連... γ 15/5/5(火) 13:44 発言[未読]
【77015】Re:コンボボックスとチェックボックスの連... mohimohi 15/5/5(火) 19:17 お礼[未読]
【77019】Re:コンボボックスとチェックボックスの連... γ 15/5/5(火) 20:59 発言[未読]

【77005】コンボボックスとチェックボックスの連動...
質問  mohimohi  - 15/5/5(火) 0:04 -

引用なし
パスワード
   コンボボックスとチェックボックスの連動に関する質問です。
つたない説明ですがよろしくお願いします。

まずはじめに、コンボボックスを利用して、氏名、性別、年齢、住みまでの連動(絞り)は以下のようにしてできました。

Private Sub ComboBox1_Chenge()

Dim comboValue As String
comboValue = ComboBox1.Value
ComboBox2.Clear

Dim i As Interger

i = 2

Do
cellvalue = Cells(i,2).Value
If cellValue = "" Then

Exit Do
If FindItem(comboBox2,cellvalue) = False Then
ComboBox2.AddItem (cellvalue)

End If
End If
i = i +1

Loop
End Sub
を住まで同様に作成。

そのあと、チェックボックスを利用して、家族構成を活性、非活性として表したいのですが、方法がわかりません。
(※チェックボックスは、父、母、祖父、祖母、兄、姉、妹、弟の8種類が設置してあるとします)

例:[コンボボックス]:鈴木→女→14→群馬→[チェックボックス]活性:父、母、祖母(この時、チェックボックス非活性は、祖父、兄、姉、妹です。)
行ループかなと考えておりますが、できません…

ご教授よろしくお願いします。

【77006】Re:コンボボックスとチェックボックスの...
発言  β  - 15/5/5(火) 6:42 -

引用なし
パスワード
   ▼mohimohi さん:

おはようございます

2点、教えてください。

1.浅学につき、「活性」「非活性」という定義そのものがピンときません。
  どこかで「活性有権者」とか「非活性有権者」といった古戸場を聞いた記憶もありますが
  その意味もよくわかりません。

  ここでいう「活性」「非活性」の、mohimohi さんとしての定義を教えてください。

2.チェックボックスを利用して、家族構成を活性、非活性として表したい

  この意味は、

  チェックボックスは、活性用、非活性用、それぞれ8個あり、
  1.の定義によって絞り込まれた、該当のものを自動チェック?
  あるいは、該当のものだけを表示、そうでないものは非表示にする?

  そういったことでしょうか?

【77007】Re:コンボボックスとチェックボックスの...
発言  γ  - 15/5/5(火) 10:04 -

引用なし
パスワード
   βさんと同様の感想を持ちました。意味不明ですね。

まずチェックボックスにチェックに関する回答からすると、
・チェックボックスのチェックをするには、
 CheckBox1.Value = True
・チェックをはずすには
 CheckBox1.Value = False
とします。 以上。

これだけだとなんなので。

そもそも、コンボボックスとチェックボックスの連動ってどういうことですか?

それぞれのシートとの連動ということですね。

> 例:[コンボボックス]:鈴木→女→14→群馬→[チェックボックス]活性:父、母、祖母(この時、チェックボックス非活性は、祖父、兄、姉、妹です。)
> 行ループかなと考えておりますが、できません…

質問1)
活性:父、母、祖母 はどうやって、どこにある情報をもとに設定するのですか?
すくなくともシートのどこにどんな形式で情報を持っているかくらい
示さないと。

質問2)
ケアレスミスだろうが、弟はチェックしない状態にするということですか?
(その場合は、 CheckBox1.Value = Null で実現はできますが。)

質問3)
 いったんすべてのチェックボックスをFalseにしてから、
 家族構成を満たすcheckboxにTrueを設定するという普通の考え方では
 いけないのですか?

------------------
なお、示されたコードはまったく参考になりません。
スペルミスが散見されますし(Chenge,Interger)
変数宣言も不十分。
また、
If FindItem(comboBox2,cellvalue) = False Then
  ComboBox2.AddItem (cellvalue)
End If
は絶対にそこを通ることはありません。

実際に動いているコードをコピーペーストしてください。

【77009】Re:コンボボックスとチェックボックスの...
回答  mohimohi  - 15/5/5(火) 11:36 -

引用なし
パスワード
   ▼β さん:

お返事いただき感謝いたします。
不十分な説明、申し訳ないです。

>1.ここでいう「活性」「非活性」の、mohimohi さんとしての定義を教えてください。
⇒「活性」:チェックボックス押下可
 「非活性」:チェックボックス押下不可
という意味です。

>2.チェックボックスを利用して、家族構成を活性、非活性として表したい
⇒チェックボックスは、8個あり、1.の定義によって絞り込まれた、該当のものを自動で、押下可、不可に表示したいのです。

ht tp://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12144985737
上記の画像の表及びコンボボックス、チェックボックスをイメージしていただけるとありがたいです。

また、現在作成中のコードを以下に貼ります。
よろしくお願い致します。

-----------

'イメージ画にはありませんが、コマンドボタン1を押してから処理をスタート(クリア)するとします
Private Sub CommandButton1_Click()

Dim i As Integer
Dim cellvalue As String

i = 2

ComboBox1.Clear
Do
cellvalue = Cells(i, 1).Value
If cellvalue = "" Then
Exit Do
End If

If FindItem(ComboBox1, cellvalue) = False Then
ComboBox1.AddItem (cellvalue)
End If

i = i + 1
Loop
End Sub


Private Sub ComboBox1_Change()

Dim comboValue As String
comboValue = ComboBox1.Value
ComboBox2.Clear

Dim i As Integer

i = 2

Do
cellvalue = Cells(i, 2).Value
If cellvalue = "" Then

Exit Do
End If

If Cells(i, 1).Value = comboValue Then

If FindItem(ComboBox2, cellvalue) = False Then
ComboBox2.AddItem (cellvalue)
End If

End If
i = i + 1

Loop
End Sub


Private Sub ComboBox2_Change()


Dim i As Integer
Dim cellValue1 As String
Dim cellValue2 As String
Dim cellValue3 As String

i = 2
ComboBox3.Clear

Dim comboValue1 As String
Dim comboValue2 As String

comboValue1 = ComboBox1.Value
comboValue2 = ComboBox2.Value

Do

cellValue1 = Cells(i, 1).Value
cellValue2 = Cells(i, 2).Value
cellValue3 = Cells(i, 3).Value

If cellValue1 = "" Then
Exit Do
End If

If comboValue1 = cellValue1 And comboValue2 = cellValue2 Then

If FindItem(ComboBox3, cellValue3) = False Then
ComboBox3.AddItem (cellValue3)

End If
End If
i = i + 1

Loop
End Sub


Private Sub ComboBox3_Change()
Dim i As Integer
Dim cellValue1 As String
Dim cellValue2 As String
Dim cellValue3 As String
Dim cellValue4 As String

i = 2
ComboBox4.Clear

Dim comboValue1 As String
Dim comboValue2 As String
Dim comboValue3 As String

comboValue1 = ComboBox1.Value
comboValue2 = ComboBox2.Value
comboValue3 = ComboBox3.Value

Do

cellValue1 = Cells(i, 1).Value
cellValue2 = Cells(i, 2).Value
cellValue3 = Cells(i, 3).Value
cellValue4 = Cells(i, 4).Value

If cellValue1 = "" Then
Exit Do
End If

If comboValue2 = cellValue2 And comboValue3 = cellValue3 Then

If FindItem(ComboBox4, cellValue4) = False Then
ComboBox4.AddItem (cellValue4)

End If
End If
i = i + 1

Loop
End Sub
Private Sub ComboBox4_Change()
Dim i As Integer
Dim cellValue1 As String
Dim cellValue2 As String
Dim cellValue3 As String
Dim cellValue4 As String
Dim cellValue5 As String

i = 2

Dim comboValue1 As String
Dim comboValue2 As String
Dim comboValue3 As String
Dim comboValue4 As String

comboValue1 = ComboBox1.Value
comboValue2 = ComboBox2.Value
comboValue3 = ComboBox3.Value
comboValue4 = ComboBox4.Value

Do

cellValue1 = Cells(i, 1).Value
cellValue2 = Cells(i, 2).Value
cellValue3 = Cells(i, 3).Value
cellValue4 = Cells(i, 4).Value

If cellValue1 = "" Then
Exit Do
End If

If comboValue2 = cellValue2 And comboValue3 = cellValue3 Then

If FindItem(ComboBox4, cellValue4) = False Then
ComboBox4.AddItem (cellValue4)

End If
End If
i = i + 1

Loop
End Sub


Private Function FindItem(ByRef combo As ComboBox, ByVal item As String)
Dim i As Integer

For i = 0 To combo.ListCount - 1
If combo.List(i) = item Then
FindItem = True
Exit Function
End If

Next
FindItem = False
End Function

【77010】Re:コンボボックスとチェックボックスの...
回答  mohimohi  - 15/5/5(火) 11:43 -

引用なし
パスワード
   ▼γ さん:
お返事ありがとうございます。
某サイトで質問したのですが回答が得られなくて。。。
私自身に問題があるみたいですね。反省します。

>質問1)
>質問2)
⇒htt p://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12144985737
上記に画像が貼ってあるので、イメージしていただけるとありがたいです。

>質問3)
> いったんすべてのチェックボックスをFalseにしてから、
> 家族構成を満たすcheckboxにTrueを設定するという普通の考え方では
> いけないのですか?
⇒その考えはしているのですが、自分でソースコードを組めなくて。。(涙)
以下に実際動いているコードを載せます。


'イメージ画にはありませんが、コマンドボタン1を押してから処理をスタート(クリア)するとします
Private Sub CommandButton1_Click()

Dim i As Integer
Dim cellvalue As String

i = 2

ComboBox1.Clear
Do
cellvalue = Cells(i, 1).Value
If cellvalue = "" Then
Exit Do
End If

If FindItem(ComboBox1, cellvalue) = False Then
ComboBox1.AddItem (cellvalue)
End If

i = i + 1
Loop
End Sub


Private Sub ComboBox1_Change()

Dim comboValue As String
comboValue = ComboBox1.Value
ComboBox2.Clear

Dim i As Integer

i = 2

Do
cellvalue = Cells(i, 2).Value
If cellvalue = "" Then

Exit Do
End If

If Cells(i, 1).Value = comboValue Then

If FindItem(ComboBox2, cellvalue) = False Then
ComboBox2.AddItem (cellvalue)
End If

End If
i = i + 1

Loop
End Sub


Private Sub ComboBox2_Change()


Dim i As Integer
Dim cellValue1 As String
Dim cellValue2 As String
Dim cellValue3 As String

i = 2
ComboBox3.Clear

Dim comboValue1 As String
Dim comboValue2 As String

comboValue1 = ComboBox1.Value
comboValue2 = ComboBox2.Value

Do

cellValue1 = Cells(i, 1).Value
cellValue2 = Cells(i, 2).Value
cellValue3 = Cells(i, 3).Value

If cellValue1 = "" Then
Exit Do
End If

If comboValue1 = cellValue1 And comboValue2 = cellValue2 Then

If FindItem(ComboBox3, cellValue3) = False Then
ComboBox3.AddItem (cellValue3)

End If
End If
i = i + 1

Loop
End Sub


Private Sub ComboBox3_Change()
Dim i As Integer
Dim cellValue1 As String
Dim cellValue2 As String
Dim cellValue3 As String
Dim cellValue4 As String

i = 2
ComboBox4.Clear

Dim comboValue1 As String
Dim comboValue2 As String
Dim comboValue3 As String

comboValue1 = ComboBox1.Value
comboValue2 = ComboBox2.Value
comboValue3 = ComboBox3.Value

Do

cellValue1 = Cells(i, 1).Value
cellValue2 = Cells(i, 2).Value
cellValue3 = Cells(i, 3).Value
cellValue4 = Cells(i, 4).Value

If cellValue1 = "" Then
Exit Do
End If

If comboValue2 = cellValue2 And comboValue3 = cellValue3 Then

If FindItem(ComboBox4, cellValue4) = False Then
ComboBox4.AddItem (cellValue4)

End If
End If
i = i + 1

Loop
End Sub
Private Sub ComboBox4_Change()
Dim i As Integer
Dim cellValue1 As String
Dim cellValue2 As String
Dim cellValue3 As String
Dim cellValue4 As String
Dim cellValue5 As String

i = 2

Dim comboValue1 As String
Dim comboValue2 As String
Dim comboValue3 As String
Dim comboValue4 As String

comboValue1 = ComboBox1.Value
comboValue2 = ComboBox2.Value
comboValue3 = ComboBox3.Value
comboValue4 = ComboBox4.Value

Do

cellValue1 = Cells(i, 1).Value
cellValue2 = Cells(i, 2).Value
cellValue3 = Cells(i, 3).Value
cellValue4 = Cells(i, 4).Value

If cellValue1 = "" Then
Exit Do
End If

If comboValue2 = cellValue2 And comboValue3 = cellValue3 Then

If FindItem(ComboBox4, cellValue4) = False Then
ComboBox4.AddItem (cellValue4)

End If
End If
i = i + 1

Loop
End Sub


Private Function FindItem(ByRef combo As ComboBox, ByVal item As String)
Dim i As Integer

For i = 0 To combo.ListCount - 1
If combo.List(i) = item Then
FindItem = True
Exit Function
End If

Next
FindItem = False
End Function

【77011】Re:コンボボックスとチェックボックスの...
発言  γ  - 15/5/5(火) 13:44 -

引用なし
パスワード
   i 行目のデータをもとにチェックボックスを設定する部分だけ、
参考コードを示します。

Function setCheckbox(i As Integer)
  Dim ckbx As Long
  Dim lastCol As Long
  Dim k As Long
  
  'チェックボックスをいったんOffにする
  For ckbx = 1 To 8
    Me.OLEObjects("CheckBox" & ckbx).Object.Value = False
  Next
  
  '家族構成の最終列
  lastCol = Cells(i, Columns.Count).End(xlToLeft).Column
  
  '各チェックボックスのセット
  For k = 5 To lastCol
    Select Case Cells(i, k).Value
    Case "父": CheckBox1.Value = True
    Case "母": CheckBox2.Value = True
    Case "祖父": CheckBox3.Value = True
    Case "祖母": CheckBox4.Value = True
    Case "兄": CheckBox5.Value = True
    Case "姉": CheckBox6.Value = True
    Case "弟": CheckBox7.Value = True
    Case "妹": CheckBox8.Value = True
    End Select
  Next
End Function

なお、私には、コンボボックスにする意味も
もっといえば、コントロールにする意義もよくわかりません。

マクロの勉強材料ということなら、
まずインデントをしっかりつけることから始めてください。

【77012】Re:コンボボックスとチェックボックスの...
発言  β  - 15/5/5(火) 13:50 -

引用なし
パスワード
   ▼mohimohi さん:

>⇒「活性」:チェックボックス押下可
> 「非活性」:チェックボックス押下不可
>という意味です。

あぁ、そういう意味でしたか。
ある意味、テクニカルタームとしては正解?
チェックボックス等のコントロールには
Enable というプロパティがあります。ここがFalse なら画面で表示しておられるように薄い色になって選択できなくなります。
もう1つ、Locked というプロパティもあります。これが True なら 選択できなくなります。
ただし、この場合、色はかわりません。

ご希望の状態は Enableでしょうね。だから「活性」「非活性」?
あまり、このような日本語での表現はしませんね。


ところで、シート上のリストですけど、この処理をしながら増減していくのでしょうか?
それであれば、コンボボックスに、その時の状態でのリストを格納必要ですが
そうでなければ、毎回、コンボボックスのリストを更改するのは無駄ですよね?

【77013】Re:コンボボックスとチェックボックスの...
発言  β  - 15/5/5(火) 13:56 -

引用なし
パスワード
   ▼mohimohi さん:

γさんと同じく、コンボボックスの利用という点では、いささか???です。
もし、コンボボックスを使うとしたら、
・地域で絞り込む
・性別で絞り込む
・年齢で絞り込む
こうして、絞り込まれた氏名を最後に選択する。
これら3つはmohimohiさんの要件次第で、必須かもしれませんし、任意選択かもしれません。

こういった構えでしょうね。

【77014】Re:コンボボックスとチェックボックスの...
回答  mohimohi  - 15/5/5(火) 18:56 -

引用なし
パスワード
   ▼β さん:

>γさんと同じく、コンボボックスの利用という点では、いささか???です。
>もし、コンボボックスを使うとしたら、
>・地域で絞り込む
>・性別で絞り込む
>・年齢で絞り込む
>こうして、絞り込まれた氏名を最後に選択する。
>これら3つはmohimohiさんの要件次第で、必須かもしれませんし、任意選択かもし>れません。
⇒私の例が悪く、申し訳ないです。正直例は何でも良いのです。。。
コンボボックスを利用して条件を絞ります。その中で、チェックボックスを条件に応じて自動でチェック可、不可に表示させたいのです。(画像の表通りにしたいのです)
コンボボックスで「鈴木」を選択したら、次のコンボボックスでは「女」しか表示されず、「14」、「群馬」といったように、画像の表の条件に応じて選択を決定させたいのです。そして、画像の表にある通り、チェックボックスの押下可能は、父、母、祖母になり、押下不可は、祖父、兄、姉、妹になっている状態を希望します。。。
食べ物の種類等で例に表したほうが良かったですね。。。申し訳ないです。

>Enable というプロパティがあります。ここがFalse なら画面で表示しておられるように薄い色になって選択できなくなります。
⇒これだと、コンボボックスの条件に応じて自動でチェックボックス押下可、不可にできませんよね?

>ご希望の状態は Enableでしょうね。だから「活性」「非活性」?
>あまり、このような日本語での表現はしませんね。
⇒以後気をつけます。ご指導ありがとうございます。

重ね重ね申し訳ございませんが、よろしくお願いいたします。

【77015】Re:コンボボックスとチェックボックスの...
お礼  mohimohi  - 15/5/5(火) 19:17 -

引用なし
パスワード
   ▼γ さん:
ありがとうございます!!!!!
このソースコードをもとに勉強させていただきます。

>なお、私には、コンボボックスにする意味も
>もっといえば、コントロールにする意義もよくわかりません。
⇒正直例は、なんでもよかったのです。逆に混乱させてしまい、すみません。。。
コンボボックスを利用して条件を絞り、その中で、チェックボックスを条件に応じて自動でチェック可、不可に表示させたかったのです。
食べ物の種類等で例に表したほうが良かったですね。。。申し訳ないです。
 
 a     b      c         チェックボックス
1肉   牛肉   松坂牛         ステーキ
2果物  いちご  あまおう        いちごみるく
3果物  マンゴー 太陽のマンゴー     マンゴーパフェ

コンボボックスで、果物を選択→いちご、マンゴーの選択が表示される→いちごを選択→あまおうのみ表示→あまおうを選択(※この時、チェックボックスの押下可能はいちごみるくのみ)
のようなことを伝えたかったのです。。。(涙)

>マクロの勉強材料ということなら、
>まずインデントをしっかりつけることから始めてください。
⇒お手数おかけして、申し訳ないです。感謝致します。

【77016】Re:コンボボックスとチェックボックスの...
発言  β  - 15/5/5(火) 19:27 -

引用なし
パスワード
   ▼mohimohi さん:

>⇒私の例が悪く、申し訳ないです。正直例は何でも良いのです。。。
>コンボボックスを利用して条件を絞ります。その中で、チェックボックスを条件に応じて自動でチェック可、不可に表示させたいのです。(画像の表通りにしたいのです)

いやぁ、そういうことではなく。
たとえばチェックボックスに反映させるタイミングはいつですか?
(いつだと想定していますか?)
4つの条件で絞り込みますよね。で、4つの条件で絞り込んだものが複数あるかもしれませんよね。
その場合は、どれを対象にするんですか?

>
>⇒これだと、コンボボックスの条件に応じて自動でチェックボックス押下可、不可にできませんよね?

あちらの画面イメージが、薄いいろになっていたので、そうしたいのかなぁと。
もちろん、選択条件によって、存在するものだけのチェックボックスがEnable=Trueになるように
そこは、コードで制御するんですよ。
しかし、↑でコメントしたように、どの行のデータに対して実行するのかが??

●この構えであれば、A列がメインの情報だとして、他の3つで絞り込んだものを
 A列用のコンボボックス(アップされたコードでは ComboBpox1) にセットして
 このComboBox1から選択したものを、チェックボックスに反映させるということじゃないんですか?

【77017】Re:コンボボックスとチェックボックスの...
回答  mohimohi  - 15/5/5(火) 19:59 -

引用なし
パスワード
   ▼β さん:

>たとえばチェックボックスに反映させるタイミングはいつですか?
>(いつだと想定していますか?)
>4つの条件で絞り込みますよね。で、4つの条件で絞り込んだものが複数あるかもしれませんよね。
>その場合は、どれを対象にするんですか?
⇨複数選択は初めのうちに存在し、いくつか条件を絞っていくうちに、最終的には1つに絞れています。この1つに絞れた段階でチェックボックスに反映させたいです。
例を変えさせていただだきます。
a     b      c         チェックボックス
1肉   牛肉   松坂牛         ステーキ
2果物  いちご  あまおう        いちごみるく
3果物  マンゴー 太陽のマンゴー     マンゴーパフェ

コンボボックスで、果物を選択→いちご、マンゴーの選択が表示される→いちごを選択→あまおうのみ表示→あまおうを選択(※この時、チェックボックスの押下可能はいちごみるくのみ)

>あちらの画面イメージが、薄いいろになっていたので、そうしたいのかなぁと。
>もちろん、選択条件によって、存在するものだけのチェックボックスがEnable=Trueになるように
>そこは、コードで制御するんですよ。
>しかし、↑でコメントしたように、どの行のデータに対して実行するのかが??
>●この構えであれば、A列がメインの情報だとして、他の3つで絞り込んだものを
> A列用のコンボボックス(アップされたコードでは ComboBpox1) にセットして
> このComboBox1から選択したものを、チェックボックスに反映させるということじゃないんですか?
⇨条件に応じて押下可、不可を表現したくてやりました。あ、御察しの通りです。
それができなくて..... 涙

【77018】Re:コンボボックスとチェックボックスの...
発言  β  - 15/5/5(火) 20:19 -

引用なし
パスワード
   ▼mohimohi さん:

>複数選択は初めのうちに存在し、いくつか条件を絞っていくうちに、最終的には1つに絞れています。この1つに絞れた段階でチェックボックスに反映させたいです。

ということは、A,B,C,D列(ComboBox1,2,3,4 に対応)が同じものは存在しないということですか?
もし、存在すれば、どうしますか?(そういうデータはつくらないということじゃなく、もしあれば)

まぁ、そういったことも考慮したとして、

・ComboBox1〜ComboBox3 は重複を排除したリスト。
・ComboBox4 は重複しているものも、リストに含める。で、列数を2つにしておいて
 表示は1列のみ。隠れている2列目に行番号をセット。
・最終的にチェックボックスに反映させるのは ComboBox4が選ばれたとき。
 選ばれた行は、隠れている列の成功から判断。

こんな流れですかね。

それと、ComboBoxですから、初期値設定としては、直接入力も可能ですね。
直接入力時のChangeイベントの扱い、これはすごく厄介ですよ。
Styleプロパティで直接入力できないようにしてあれば心配はないですが、そうでなければ
ListIndex をチェックする必要もでてきますね。

【77019】Re:コンボボックスとチェックボックスの...
発言  γ  - 15/5/5(火) 20:59 -

引用なし
パスワード
   ▼mohimohi さん:
>>なお、私には、コンボボックスにする意味も
>>もっといえば、コントロールにする意義もよくわかりません。
>⇒正直例は、なんでもよかったのです。逆に混乱させてしまい、すみません。。。

いや、私は具体的な例が理解できないなどと申していない。
作ろうとしている機能が不明だと申し上げた。
混乱もしていない。

>コンボボックスを利用して条件を絞り、その中で、チェックボックスを条件に応じて自動でチェック可、不可に表示させたかったのです。
>食べ物の種類等で例に表したほうが良かったですね。。。申し訳ないです。
> 
> a     b      c         チェックボックス
>1肉   牛肉   松坂牛         ステーキ
>2果物  いちご  あまおう        いちごみるく
>3果物  マンゴー 太陽のマンゴー     マンゴーパフェ
>
>コンボボックスで、果物を選択→いちご、マンゴーの選択が表示される→いちごを選択→あまおうのみ表示→あまおうを選択(※この時、チェックボックスの押下可能はいちごみるくのみ)
>のようなことを伝えたかったのです。。。(涙)

まあ、あなたが考えるのをサポートしようと思っただけで。
コード作成の主体はあなたなので、私は別に困りもしません。
同情される覚えはありません。

私のコードは、別にコンボボックスとチェックボックスの連動なんか
していません。
各行単位のデータと、チェックボックスの連動はしていますがね。
コンボボックスなんぞ少しも出てきていないでしょ?

>>マクロの勉強材料ということなら、
>>まずインデントをしっかりつけることから始めてください。
>⇒お手数おかけして、申し訳ないです。感謝致します。

いや、こちらは何の関係もない。
ボタン一つで整形できるツールがあるので、
少しも手数は掛かっていない。

インデントがデタラメというのは、
言ってみれば、最高点100点のテストなり仕事で、
最初からマイナス100点のハンディを負っているというようなもので、
質問者さんのスキルが上がらないだけなので、誰も困りません。
インデントの重要性が理解できないようで、少し同情はするが。

【77020】Re:コンボボックスとチェックボックスの...
お礼  mohimohi  - 15/5/5(火) 21:46 -

引用なし
パスワード
   ▼β さん:
>ということは、A,B,C,D列(ComboBox1,2,3,4 に対応)が同じものは存在しないということですか?
→存在しません。

>直接入力時のChangeイベントの扱い、これはすごく厄介ですよ。
>Styleプロパティで直接入力できないようにしてあれば心配はないですが、そうでなければ
>ListIndex をチェックする必要もでてきますね。
→正直、上記の内容はわからないので、調べて参考にさせていただきます。
つたない説明にも関わらず、丁寧にご指導いただき、本当にありがとうございます。希望のソースコードを組めないかもしれませんが、やってみます。

【77021】Re:コンボボックスとチェックボックスの...
発言  β  - 15/5/6(水) 7:46 -

引用なし
パスワード
   ▼mohimohi さん:

一例として。
作業シートとして "Sheet2" を使います。
抽出そのものは、あオートフィルターや重複の削除といったエクセル標準機能を使っています。

書きなぐったので、同じような処理コードが何回も出てきます。
このあたりは整理して共通サブルーティン化もできるところでしょう。

Option Explicit

Dim rfA As Range
Dim rfX As Range

Private Sub CommandButton1_Click()
  Dim WS As Worksheet
  Dim x As Long
  
  Set WS = Sheets("Sheet2")
  ComboBox2.Clear
  ComboBox3.Clear
  ComboBox4.Clear
  ComboBox1.Value = ""
  ComboBox2.Value = ""
  ComboBox3.Value = ""
  ComboBox4.Value = ""
  
  WS.UsedRange.Clear
  WS.AutoFilterMode = False
  Range("A1").CurrentRegion.Columns("A:D").Copy WS.Range("A1")
  WS.Range("E1").Value = 1
  WS.Range("A1").CurrentRegion.Columns("E").DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, Step:=1, Trend:=False
  WS.Range("A1").AutoFilter
  Set rfA = WS.AutoFilter.Range
  Set rfX = WS.Cells(rfA.Rows.Count + 2, "A")
  WS.Range("A1").CurrentRegion.Columns("A").Copy WS.Range("G1")
  WS.Range("G1").CurrentRegion.RemoveDuplicates Columns:=1, Header:=xlYes
  With WS.Range("G1").CurrentRegion
    ComboBox1.List = .Offset(1).Resize(.Count - 1).Value
  End With
    For x = 1 To 8
    OLEObjects("CheckBox" & x).Object.Value = False
    OLEObjects("CheckBox" & x).Object.Enabled = False
  Next

End Sub

Private Sub ComboBox1_Change()

  If ComboBox1.ListIndex < 0 Then Exit Sub
  
  ComboBox2.Clear
  ComboBox3.Clear
  ComboBox4.Clear
  ComboBox2.Value = ""
  ComboBox3.Value = ""
  ComboBox4.Value = ""
  
  rfA.AutoFilter Field:=1, Criteria1:=ComboBox1.Value
  If rfA.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count = 1 Then Exit Sub
  rfX.CurrentRegion.Clear
  Intersect(rfA, rfA.Offset(1)).Copy rfX
  rfX.CurrentRegion.RemoveDuplicates Columns:=2, Header:=xlNo
  With rfX.CurrentRegion.Columns("B")
    ComboBox2.List = .Value
  End With
  
End Sub

Private Sub ComboBox2_Change()

  If ComboBox2.ListIndex < 0 Then Exit Sub
  
  ComboBox3.Clear
  ComboBox4.Clear
  ComboBox3.Value = ""
  ComboBox4.Value = ""
  
  rfA.AutoFilter Field:=1, Criteria1:=ComboBox1.Value
  rfA.AutoFilter Field:=2, Criteria1:=ComboBox2.Value
  If rfA.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count = 1 Then Exit Sub
  rfX.CurrentRegion.Clear
  Intersect(rfA, rfA.Offset(1)).Copy rfX
  rfX.CurrentRegion.RemoveDuplicates Columns:=3, Header:=xlNo
  With rfX.CurrentRegion.Columns("C")
    ComboBox3.List = .Value
  End With
  
End Sub

Private Sub ComboBox3_Change()

  If ComboBox3.ListIndex < 0 Then Exit Sub
  
  ComboBox4.Clear
  ComboBox4.Value = ""
  
  rfA.AutoFilter Field:=1, Criteria1:=ComboBox1.Value
  rfA.AutoFilter Field:=2, Criteria1:=ComboBox2.Value
  rfA.AutoFilter Field:=3, Criteria1:=ComboBox3.Value
  If rfA.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count = 1 Then Exit Sub
  rfX.CurrentRegion.Clear
  Intersect(rfA, rfA.Offset(1)).Copy rfX
  With rfX.CurrentRegion.Columns("D:E")
    ComboBox4.List = .Value
  End With
  
End Sub

Private Sub ComboBox4_Change()
  Dim i As Long
  Dim j As Long
  Dim z As Long
  Dim x As Long
  
  If ComboBox4.ListIndex < 0 Then Exit Sub
  
  For x = 1 To 8
    OLEObjects("CheckBox" & x).Object.Value = False
    OLEObjects("CheckBox" & x).Object.Enabled = False
  Next
  i = ComboBox4.List(ComboBox4.ListIndex, 1)
  z = Cells(i, Columns.Count).End(xlToLeft).Column
  For j = 5 To z
    x = 0
    Select Case Cells(i, j).Value
      Case "祖父"
        x = 3
      Case "祖母"
        x = 4
      Case "父"
        x = 1
      Case "母"
        x = 2
      Case "兄"
        x = 5
      Case "姉"
        x = 6
      Case "弟"
        x = 7
      Case "妹"
        x = 8
    End Select
    
    If x > 0 Then
      OLEObjects("CheckBox" & x).Object.Value = True
      OLEObjects("CheckBox" & x).Object.Enabled = True
    End If
  Next
  
End Sub

【77022】Re:コンボボックスとチェックボックスの...
発言  β  - 15/5/6(水) 21:56 -

引用なし
パスワード
   ▼mohimohi さん:

アップしたコードでは、項目名をコンスタントでチェック(祖父とか父とか)し
かつ、祖父なら CheckBox● と決めつけしています。
実際にはこれでいいのかもしれませんが、E列からI列に記入する項目名がかわれば
コードも変える必要がでてきます。
また、チェックボックスの数に増減があれば、コードを変更する必要がでてきます。

以下は、そのような時、コードを変えず、E列からI列に記入する項目名と
チェックボックスのキャプションを同じにしておけば、自動判定しますし、
チェックボックスの増減も任意です。

アップ済みコードと全く同じプロシジャもありますが、フルセット掲載します。

Option Explicit

Dim rfA As Range
Dim rfX As Range
Dim dic As Object

Private Sub CommandButton1_Click()
  Dim WS As Worksheet
  Dim x As Long
  Dim ckb As OLEObject
  
  Set WS = Sheets("Sheet2")
  ComboBox2.Clear
  ComboBox3.Clear
  ComboBox4.Clear
  ComboBox1.Value = ""
  ComboBox2.Value = ""
  ComboBox3.Value = ""
  ComboBox4.Value = ""
  
  WS.UsedRange.Clear
  WS.AutoFilterMode = False
  Range("A1").CurrentRegion.Columns("A:D").Copy WS.Range("A1")
  WS.Range("E1").Value = 1
  WS.Range("A1").CurrentRegion.Columns("E").DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, Step:=1, Trend:=False
  WS.Range("A1").AutoFilter
  Set rfA = WS.AutoFilter.Range
  Set rfX = WS.Cells(rfA.Rows.Count + 2, "A")
  WS.Range("A1").CurrentRegion.Columns("A").Copy WS.Range("G1")
  WS.Range("G1").CurrentRegion.RemoveDuplicates Columns:=1, Header:=xlYes
  With WS.Range("G1").CurrentRegion
    ComboBox1.List = .Offset(1).Resize(.Count - 1).Value
  End With
    For x = 1 To 8
    OLEObjects("CheckBox" & x).Object.Value = False
    OLEObjects("CheckBox" & x).Object.Enabled = False
  Next

  If dic Is Nothing Then
    Set dic = CreateObject("Scripting.Dictionary")
    For Each ckb In OLEObjects
      If TypeName(ckb.Object) = "CheckBox" Then dic(ckb.Object.Caption) = ckb.Name
    Next
  End If
  
End Sub

Private Sub ComboBox1_Change()

  If ComboBox1.ListIndex < 0 Then Exit Sub
  
  ComboBox2.Clear
  ComboBox3.Clear
  ComboBox4.Clear
  ComboBox2.Value = ""
  ComboBox3.Value = ""
  ComboBox4.Value = ""
  
  rfA.AutoFilter Field:=1, Criteria1:=ComboBox1.Value
  If rfA.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count = 1 Then Exit Sub
  rfX.CurrentRegion.Clear
  Intersect(rfA, rfA.Offset(1)).Copy rfX
  rfX.CurrentRegion.RemoveDuplicates Columns:=2, Header:=xlNo
  With rfX.CurrentRegion.Columns("B")
    ComboBox2.List = .Value
  End With
  
End Sub

Private Sub ComboBox2_Change()

  If ComboBox2.ListIndex < 0 Then Exit Sub
  
  ComboBox3.Clear
  ComboBox4.Clear
  ComboBox3.Value = ""
  ComboBox4.Value = ""
  
  rfA.AutoFilter Field:=1, Criteria1:=ComboBox1.Value
  rfA.AutoFilter Field:=2, Criteria1:=ComboBox2.Value
  If rfA.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count = 1 Then Exit Sub
  rfX.CurrentRegion.Clear
  Intersect(rfA, rfA.Offset(1)).Copy rfX
  rfX.CurrentRegion.RemoveDuplicates Columns:=3, Header:=xlNo
  With rfX.CurrentRegion.Columns("C")
    ComboBox3.List = .Value
  End With
  
End Sub

Private Sub ComboBox3_Change()

  If ComboBox3.ListIndex < 0 Then Exit Sub
  
  ComboBox4.Clear
  ComboBox4.Value = ""
  
  rfA.AutoFilter Field:=1, Criteria1:=ComboBox1.Value
  rfA.AutoFilter Field:=2, Criteria1:=ComboBox2.Value
  rfA.AutoFilter Field:=3, Criteria1:=ComboBox3.Value
  If rfA.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count = 1 Then Exit Sub
  rfX.CurrentRegion.Clear
  Intersect(rfA, rfA.Offset(1)).Copy rfX
  With rfX.CurrentRegion.Columns("D:E")
    ComboBox4.List = .Value
  End With
  
End Sub

Private Sub ComboBox4_Change()
  Dim i As Long
  Dim j As Long
  Dim z As Long
  Dim ckName As String
  Dim k As Variant
  
  If ComboBox4.ListIndex < 0 Then Exit Sub
  
  For Each k In dic
    With OLEObjects(dic(k)).Object
      .Value = False
      .Enabled = False
    End With
  Next
  i = ComboBox4.List(ComboBox4.ListIndex, 1)
  z = Cells(i, Columns.Count).End(xlToLeft).Column
  For j = 5 To z
    If dic.exists(Cells(i, j).Value) Then
      With OLEObjects(dic(Cells(i, j).Value)).Object
        .Value = True
        .Enabled = True
      End With
    End If
  Next
  
End Sub

【77023】Re:コンボボックスとチェックボックスの...
お礼  mohimohi  - 15/5/6(水) 22:17 -

引用なし
パスワード
   ▼β さん:
お世話になっております。
お返事遅くなってしまい、大変申し訳ございません。
そして、こんなにも御丁寧なお返事、本当に本当に感謝しています。
現在ちゃんと見れない状況ですので、週末改めてご連絡させていただきます。
その際、ご指導いただくことがあるかもしれませんが、よろしくお願い致します。
ありがとうございます。

【77040】Re:コンボボックスとチェックボックスの...
質問  mohimohi  - 15/5/9(土) 20:40 -

引用なし
パスワード
   ▼β さん:

お世話になっております。
初歩的な質問かと思いますが、ご教授のほど宜しくお願い致します。

βさんのソースコードを使用して、ツールを作成しております。
>作業シートとして "Sheet2" を使います。
>抽出そのものは、オートフィルターや重複の削除といったエクセル標準機能を使っています。
⇒Sheet2に表を示して、コンボボックスやチェックボックスはSheet1に示しました。そして、コマンドボタンを押下したところ、sheet2の表は全て消え、A1にフィルターが表示され(中身は空白)、E1に1のみが表示されました。

また、

Private Sub CommandButton1_Click()
  Dim WS As Worksheet
  Dim x As Long
  Dim ckb As OLEObject
 
   Set WS = Sheets("Sheet2")
  ComboBox2.Clear
  ComboBox3.Clear
  ComboBox4.Clear
  ComboBox1.Value = ""
  ComboBox2.Value = ""
  ComboBox3.Value = ""
  ComboBox4.Value = ""
 
   WS.UsedRange.Clear
  WS.AutoFilterMode = False
  Range("A1").CurrentRegion.Columns("A:D").Copy WS.Range("A1")
  WS.Range("E1").Value = 1
  WS.Range("A1").CurrentRegion.Columns("E").DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, Step:=1, Trend:=False
  WS.Range("A1").EntireColumn.AutoFilter
  Set rfA = WS.AutoFilter.Range
  Set rfX = WS.Cells(rfA.Rows.Count + 2, "A")
  WS.Range("A1").CurrentRegion.Columns("A").Copy WS.Range("G1")
 ★ WS.Range("G1").CurrentRegion.RemoveDuplicates Columns:=1,Header:=xlYes

★の部分で、エラーが表示され、デバックしたところ「アプリケーション定義またはオブジェクト定義のエラーです」と表示されました。
どこが悪いのでしょうか。。。インターネット、参考書と並行して調べておりますがわかりません><

ご教授の程、宜しくお願い致します

【77045】Re:コンボボックスとチェックボックスの...
発言  β  - 15/5/10(日) 6:21 -

引用なし
パスワード
   ▼mohimohi さん:

誤解を与えたかもしれません。
もともとのシートは、変更しません。
そこにリストがあって、チェックボックスやコマンドボタンもあるんですよね。
作業で使う Sheet2 は、からっぽでよろしいですよ。
目障りなら非表示シートにしておいてもOK(というより非表示シートにしておいたほうがいいです)

【77048】Re:コンボボックスとチェックボックスの...
発言  mohimohi  - 15/5/10(日) 11:35 -

引用なし
パスワード
   ▼β さん:

>もともとのシートは、変更しません。
>そこにリストがあって、チェックボックスやコマンドボタンもあるんですよね。
>作業で使う Sheet2 は、からっぽでよろしいですよ。
>目障りなら非表示シートにしておいてもOK(というより非表示シートにしておいたほうがいいです)
⇒そうなんですね!
すぐに直して実行したところ、8つのチェックボックスは押下不可になり、コンボボックス1には氏名が表示されました!(非表示シートも動いていました)希望のものに近づけた感じがして、感動しております!!!
しかし、性別、年齢、住については何も表示されません。

また、
Private Sub ComboBox1_Change()

  If ComboBox1.ListIndex < 0 Then Exit Sub
 
   ComboBox2.Clear
  ComboBox3.Clear
  ComboBox4.Clear
  ComboBox2.Value = ""
  ComboBox3.Value = ""
  ComboBox4.Value = ""
 
   rfA.AutoFilter Field:=1, Criteria1:=ComboBox1.Value
  If rfA.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count = 1 Then Exit Sub
  rfX.CurrentRegion.Clear
  Intersect(rfA, rfA.Offset(1)).Copy rfX
  rfX.CurrentRegion.RemoveDuplicates Columns:=2, Header:=xlNo
  With rfX.CurrentRegion.Columns("B")
    ★ComboBox2.List = .Value
  End With
 
End Sub

★ComboBox2.List = .Valueの部分でエラーになり、「実行時エラー381
Listプロパティを設定できません。プロパティの配列のインデックスが無効です」とメッセージが出ます。

ComboBox1.Value="田中"のとき、ComboBox1.ListIndex=0
ComboBox1.Value="山田"のとき、ComboBox1.ListIndex=1
ComboBox1.Value="鈴木"のとき、ComboBox1.ListIndex=2
でした。何か関係はありますか?よろしくお願いいたします。

【77051】Re:コンボボックスとチェックボックスの...
発言  β  - 15/5/10(日) 14:10 -

引用なし
パスワード
   ▼mohimohi さん:

>しかし、性別、年齢、住については何も表示されません。

もともとのそちらのコードもそうなっていたと思いますが、私がアップしたコードは

・CommandButton1 クリックでは ComboBox1 のリストのみをセット。
 ComboBox2〜ComboBox4 は空白
・ComboBox1 で何かを選択すれば、それに紐付くリストを ComboBox2 にセット
・ComboBox2 で何かを選択すれば、それに紐付くリストを ComboBox3 にセット
・ComboBox3 で何かを選択すれば、それに紐付くリストを ComboBox4 にセット
・ComboBox4 で何かを選択すれば、そのデータに基づいて、CheckBox に反映

このようになっています。つまり、どんどん絞り込んでいくというものです。

何も表示されないというのは、ComboBox1 で選択しても ComboBox2 のリストが空白だということですか?

>★ComboBox2.List = .Valueの部分でエラーになり、「実行時エラー381
>Listプロパティを設定できません。プロパティの配列のインデックスが無効です」とメッセージが出ます。

各ComboBox へは配列から直接リストをセットしています。(もともとの、そちらのコードもそうでした)
こうするためには、そのComboBox の ListFillRage には、なにも設定していないことが条件ですが
そこはいかがですか?もし、プロパティで設定があるなら、消してください。

もし、ListFillRage には何も設定していないということであれば・・・悩みます。
エラーになった時、SHeet2 の状態はどうなっていましたか?

【77052】Re:コンボボックスとチェックボックスの...
発言  mohimohi  - 15/5/10(日) 14:54 -

引用なし
パスワード
   ▼β さん:

>何も表示されないというのは、ComboBox1 で選択しても ComboBox2 のリストが空白だということですか?
⇒はい。その通りです。ComboBox1で氏名を選択すると、
★ComboBox2.List = .Valueの部分でエラーになり、「実行時エラー381 Listプロパティを設定できません。プロパティの配列のインデックスが無効です」とメッセージが出ます。
ComboBox2、3、4は、プルダウンで選択項目も表示されません。。。

>こうするためには、そのComboBox の ListFillRage には、なにも設定していないことが条件ですが
>そこはいかがですか?もし、プロパティで設定があるなら、消してください。
⇒各ComboBoxのプロパティのListFillRageには何も設定されていませんでした。;; 空白でした。。。。

>エラーになった時、SHeet2 の状態はどうなっていましたか?


■CommandButton押下時のSheet2
(1行目はF1,G1を除いて全てフィルタ付)
 A   B   C   D    E   F   G
1氏名 性別  年齢  住み         氏名
2田中 女   12   東京   2      田中
3山田 男    6  神奈川  3       山田
4山田 男   29   東京   4      鈴木
5鈴木 女   14   群馬   5


■ComboBox1選択時のSheet2(田中の場合)

 A   B   C   D    E   F   G
1氏名 性別  年齢  住み        氏名
2田中 女   12   東京   2     田中
6     
7田中 女   12   東京   2     


■ComboBox1選択時のSheet2(山田の場合)

 A   B   C   D    E   F   G
1氏名 性別  年齢  住み        氏名
3山田 男    6  神奈川  3       山田
4山田 男   29   東京   4      鈴木←このように表示されます
6
7山田 男    6  神奈川  3


■ComboBox1選択時のSheet2(鈴木の場合)

 A   B   C   D    E   F   G
1氏名 性別  年齢  住み         氏名
5鈴木 女   14   群馬   5        ←何も表示されませんでした
6
7鈴木 女   14   群馬   5

どの氏名を選んでも、同じエラーが表示されます。
何度も申し訳ございませんが、よろしくお願い致します。

【77053】Re:コンボボックスとチェックボックスの...
発言  β  - 15/5/10(日) 15:25 -

引用なし
パスワード
   ▼mohimohi さん:

申し訳ありません。ミスでした。
該当のものが1件の時、エラーになります。
なお、エラーでとまった時点ではComboBox2以下にはセットできていませんので
そこは空白になっています。これは忘れていただいてOKです。

ComboBox1_Change、ComboBox2_Change、ComboBox3_Change を入れ替えてください。
他はそのままでOKです。

Private Sub ComboBox1_Change()

  If ComboBox1.ListIndex < 0 Then Exit Sub
  
  ComboBox2.Clear
  ComboBox3.Clear
  ComboBox4.Clear
  ComboBox2.Value = ""
  ComboBox3.Value = ""
  ComboBox4.Value = ""
  
  rfA.AutoFilter Field:=1, Criteria1:=ComboBox1.Value
  If rfA.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count = 1 Then Exit Sub
  rfX.CurrentRegion.Clear
  Intersect(rfA, rfA.Offset(1)).Copy rfX
  rfX.CurrentRegion.RemoveDuplicates Columns:=2, Header:=xlNo
  With rfX.CurrentRegion.Columns("B")
    If .Rows.Count = 1 Then
      ComboBox2.AddItem .Value
    Else
      ComboBox2.List = .Value
    End If
  End With
  
End Sub

Private Sub ComboBox2_Change()

  If ComboBox2.ListIndex < 0 Then Exit Sub
  
  ComboBox3.Clear
  ComboBox4.Clear
  ComboBox3.Value = ""
  ComboBox4.Value = ""
  
  rfA.AutoFilter Field:=1, Criteria1:=ComboBox1.Value
  rfA.AutoFilter Field:=2, Criteria1:=ComboBox2.Value
  If rfA.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count = 1 Then Exit Sub
  rfX.CurrentRegion.Clear
  Intersect(rfA, rfA.Offset(1)).Copy rfX
  rfX.CurrentRegion.RemoveDuplicates Columns:=3, Header:=xlNo
  With rfX.CurrentRegion.Columns("C")
    If .Rows.Count = 1 Then
      ComboBox3.AddItem .Value
    Else
      ComboBox3.List = .Value
    End If
  End With
  
End Sub

Private Sub ComboBox3_Change()

  If ComboBox3.ListIndex < 0 Then Exit Sub
  
  ComboBox4.Clear
  ComboBox4.Value = ""
  
  rfA.AutoFilter Field:=1, Criteria1:=ComboBox1.Value
  rfA.AutoFilter Field:=2, Criteria1:=ComboBox2.Value
  rfA.AutoFilter Field:=3, Criteria1:=ComboBox3.Value
  If rfA.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count = 1 Then Exit Sub
  rfX.CurrentRegion.Clear
  Intersect(rfA, rfA.Offset(1)).Copy rfX
  With rfX.CurrentRegion.Columns("D:E")
    ComboBox4.List = .Value
  End With
  
End Sub
>▼β さん:
>
>>何も表示されないというのは、ComboBox1 で選択しても ComboBox2 のリストが空白だということですか?
>⇒はい。その通りです。ComboBox1で氏名を選択すると、
>★ComboBox2.List = .Valueの部分でエラーになり、「実行時エラー381 Listプロパティを設定できません。プロパティの配列のインデックスが無効です」とメッセージが出ます。
>ComboBox2、3、4は、プルダウンで選択項目も表示されません。。。
>
>>こうするためには、そのComboBox の ListFillRage には、なにも設定していないことが条件ですが
>>そこはいかがですか?もし、プロパティで設定があるなら、消してください。
>⇒各ComboBoxのプロパティのListFillRageには何も設定されていませんでした。;; 空白でした。。。。
>
>>エラーになった時、SHeet2 の状態はどうなっていましたか?
>⇒
>
>■CommandButton押下時のSheet2
>(1行目はF1,G1を除いて全てフィルタ付)
> A   B   C   D    E   F   G
>1氏名 性別  年齢  住み         氏名
>2田中 女   12   東京   2      田中
>3山田 男    6  神奈川  3       山田
>4山田 男   29   東京   4      鈴木
>5鈴木 女   14   群馬   5
>
>
>■ComboBox1選択時のSheet2(田中の場合)
>
> A   B   C   D    E   F   G
>1氏名 性別  年齢  住み        氏名
>2田中 女   12   東京   2     田中
>6     
>7田中 女   12   東京   2     
>
>
>■ComboBox1選択時のSheet2(山田の場合)
>
> A   B   C   D    E   F   G
>1氏名 性別  年齢  住み        氏名
>3山田 男    6  神奈川  3       山田
>4山田 男   29   東京   4      鈴木←このように表示されます
>6
>7山田 男    6  神奈川  3
>
>
>■ComboBox1選択時のSheet2(鈴木の場合)
>
> A   B   C   D    E   F   G
>1氏名 性別  年齢  住み         氏名
>5鈴木 女   14   群馬   5        ←何も表示されませんでした
>6
>7鈴木 女   14   群馬   5
>
>どの氏名を選んでも、同じエラーが表示されます。
>何度も申し訳ございませんが、よろしくお願い致します。

【77054】Re:コンボボックスとチェックボックスの...
お礼  mohimohi  - 15/5/10(日) 17:07 -

引用なし
パスワード
   ▼β さん:

とんでもないです!
βさんには本当に本当に感謝しております。
いつも丁寧にご指導してくださって本当にありがとうございます。。。。><

そして、見事に希望通り動きました!!!涙

 また質問で申し訳ないのですが、CommboBox4を選んだ際に連動でチェックボックスにチェックがされますが、チェックがされない状態で表示することは可能でしょうか?
Falseにしてしまうと、チェックボックス全体が押下不可になってしまいますよね?
チェックがされないで連動は可能なんでしょか。

【77055】Re:コンボボックスとチェックボックスの...
発言  β  - 15/5/10(日) 17:33 -

引用なし
パスワード
   ▼mohimohi さん:

よかったです。

>CommboBox4を選んだ際に連動でチェックボックスにチェックがされますが、チェックがされない状態で表示することは可能でしょうか?
>Falseにしてしまうと、チェックボックス全体が押下不可になってしまいますよね?
>チェックがされないで連動は可能なんでしょか。

ComboBox4_Change の最後のほうにある  .Value = True を消せばOKだと思います。

【77056】Re:コンボボックスとチェックボックスの...
お礼  mohimohi  - 15/5/10(日) 18:04 -

引用なし
パスワード
   ▼β さん:
 本当にありがとうございます!非常に助かりました・・・・

これらのソースコードの意味をこれから日本文で追加してみます!!!
改めて聞くことがあるかと思いますが、(きっとすぐに。。。;;)
その際はどうかよろしくお願い致します。

【77060】Re:コンボボックスとチェックボックスの...
発言  mohimohi  - 15/5/11(月) 23:27 -

引用なし
パスワード
   ▼β さん:
また来てしまいました。。。;;
前回のソースコードの理解をしている最中です。


質問1.
Option Explicit

Dim rfA As Range
Dim rfX As Range

の変数は、
Set rfA = WS.AutoFilter.Range
Set rfX = WS.Cells(rfA.Rows.Count + 2, "A")から、
rfA⇒表の1行目を読んでいる
rfX⇒表のプルダウンで変更させる項目を読んでいる
という認識であっていますでしょうか。。。初歩的ですみません。

質問2.
ComboBox4の ソースコードの意味がよく理解できません。涙
なぜ、For j = 5 To zなのでしょうか。
また、"父"、"母"、"祖父"、"祖母"のx=の値がなぜ1、2、3〜の順番ではないのでしょうか。。。。

質問3.
エクセルを起動したときに、今のCommundButonの機能を反映させたいです!
CommundButonの機能は、コンボボックスの値をクリアし、チェックボックスをFalseにするものでしたが、今回は、コマンドボックスの値を、表の1行目の値(田中、女、12、東京)に、チェックボックスの値を父、母、姉、妹にデフォルトで表示したいのです。コンボボックスは削除した形で、以下のアドレス等をもとに実施していますが、やはり自分ではうまくいきません。。。
h   t tp://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_130_04.html

いつも申し訳ございませんが、ご教授よろしくお願い致します。
    

【77061】Re:コンボボックスとチェックボックスの...
発言  β  - 15/5/12(火) 10:08 -

引用なし
パスワード
   ▼mohimohi さん:

おはようございます。

質問1.

まず、シート上に設定されているオートフィルター領域は

シート.AutoFilter.Range で取得できます。
このプロパティは優れもので、たとえばリストの下に行を追加した場合
あるいは、行を消した場合、自動的に増減します。

いずれにしても 変数 rfA は タイトル行も含めた オートフィルターリスト領域になります。

このオートフィルター領域の下、一行あけて、そこから下を作業域に使っています。
抽出された行のみをここにコピペしています。
変数 rfX は、この作業域の先頭のセルです。

たとえば オートフィルター領域が A1:D10 だったとします。
そうしますと、作業域としては A12 以降にしたいわけです。

  Set rfX = WS.Cells(rfA.Rows.Count + 2, "A")

ここで、 rfA.rows.count はオートフィルター領域の行数、つまり 10 。
rfA.Rows.Count + 2 は 12。
したがって WS.Cells(rfA.Rows.Count + 2, "A") は WS.Cells(12, "A") になります。


質問2.

>ComboBox4の ソースコードの意味がよく理解できません。涙
>なぜ、For j = 5 To zなのでしょうか。

ここは、各行の 祖父 や 父 をピックアップしようとしています。
各行の 祖父 や 父 は E列から始まりますので 始まりは 5 ですね。
終わりは、固定で I列(9) でもいいかなと思ったのですが、将来、この項目が増えて、L列あたりまで、
使うといったことになると、その都度、コードを直す必要が出てきます。
で、ここでは、その行の値が入った最後のセルの列番号を
z = Cells(i, Columns.Count).End(xlToLeft).Column
で取得し、5 から z までチェックということにしています。

これは、もしかしたら具合悪いかもしれません。 
つまり、J列より右側に、この 祖父 や 父 とは関係のない領域があるということになると
逆に、そこも 祖父 や 父 扱いになってしまいます。
なので、そういう場合は For j = 5 To 9 にしてください。

>また、"父"、"母"、"祖父"、"祖母"のx=の値がなぜ1、2、3〜の順番ではないのでしょうか。。。。

★ えっ? これって 15/5/6(水) 7:46 のコードですよね。

βとしては15/5/6(水) 21:56 のコードにしてもらっていると思っているんですが。
前者はCheckBoxの名前が固定で、CheckBox3 が 祖父用 と決め打ちしています。
まぁ、Select/Caseコードの順番としては1,2,3,・・・が美しかったかもしれませんが
祖父ならこう、祖母ならこう、父ならこう と、年齢順に書きましたので、それぞれの
CheckBox●の値が順不同になったというわけです。

で、ついでに後者に関するメモ。後者は 祖父なら CheckBox3 だとは決めつけていません。
極端にいえば、初期値として設定されている CheckBox3 を Ojiisan という名前に変更
してあってもかまいません。

そうすると各行の 父 や 祖父 が、どのチェックボックスに紐付いているのかということを
把握する必要があります。で、ここで Dictionary が登場します。

  CommandButton1_Click の

    For Each ckb In OLEObjects
      If TypeName(ckb.Object) = "CheckBox" Then dic(ckb.Object.Caption) = ckb.Name
    Next

わかりにくかったかもしれませんが、ここでは

・シート上の CheckBox(それぞれの名前は決め打ちしていません)を抜出し
・キーをそのキャプション(父 とか 祖父 とか)、データとして、そのCheckBoxの名前(CheckBox5 等)
 で登録します。
 すでに説明しましたがCHeckBoxの名前を、初期値ではなく任意のオブジェクト名に変更してあってもOKです。

で、ComboBox4処理では、各行に現れる 父 や 祖父 といった文字列で、このDictionaryを読み
そのデータであるCHeckBoxオブジェクト名を取得して、そのCheckBoxを参照しています。
 
質問3.

>エクセルを起動したときに、今のCommundButonの機能を反映させたいです!
>CommundButonの機能は、コンボボックスの値をクリアし、チェックボックスをFalseにするものでしたが、
>今回は、・・・・・

βも、実行タイミングとしてはそのほうがいいと思っていました。
ちょっと時間ください。

【77064】Re:コンボボックスとチェックボックスの...
発言  β  - 15/5/12(火) 19:10 -

引用なし
パスワード
     ▼mohimohi さん:

コードは、もうしばらく待ってください。
以下は、「予習」ということで、時間があるときに目を通していただければと思います。

ブックを開いたときに、何かを自動実行させるには参照された井上さんのページにも記載の
2つの方法があります。

1つは ThisWorkbookモジュールに書く、WorkBook_Open イベント処理。
もう1つは 標準モジュールに書く、Auto_Open プロシジャによる処理です。

後者は、古い仕組みで、ブックを開いたときには実行されますが、
別のマクロで、このブックを開いたときには実行されません。
ですから、最近のトレンドとしては前者が多いですね。

いずれにしても、今回は、今までのシートモジュール以外にもコードを書くことになります。
シートモジュールで、そのシートのActiveXコントロールを参照する場合、
コントロール名記述のみでOKです。
たとえば ComboBox1 、その値は ComboBox1.Value といったように。

ところが、当該シート以外のシートモジュールも含めて、別のモジュールで記述する場合は
以下のいずれかの記述が必要です。

Sheets("シート名").OLEObjects("ComboBox1").Object.Value

あるいは

シートコード名.ComboBox1.Value

前者は煩雑なので、今回は後者でいこうと思っています。
じゃぁ、この シートコード名 とは、何者か? ちょっとメモします。
(もし、先刻承知ならスルーしてください)

1.新規ブックを立ち上げてください。
  最初にできているシートはPCの設定でかわりますが、初期設定では Sheet1〜Sheet3。
2.ここでVBE画面を開き、左上のプロジェクトエクスプローラをみてください。
  Sheet1(Sheet1)
  Sheet2(Sheet2)
  Sheet3(Sheet3)
  このようになっていますね。
3.「VBE画面をXボタンで閉じて」シートに戻って、Sheet1 のシート名を "ABCD" にかえてください。
4.で、VBE画面を呼び出しプロジェクトエクスプローラを見てください。
  Sheet1(ABCD)
  Sheet2(Sheet2)
  Sheet3(Sheet3)
  こうなっているはずです。

  Sheet1(ABCD)の Sheet1 これがシートコード名です。(かっこの中はシート名)

5.で、ここからが、ちょっとややこしいのですが、「VBE画面をXボタンで閉じて」シートに戻って、
  Sheet4とSheet5 を追加してください。
6.追加したSheet4を移動させて最後のシートに、Sheet5を移動させて最初のシートにしてください。
7.この状態で、VBE画面のプロジェクトエクスプローラを見てください。
  Sheet1(ABCD)
  Sheet2(Sheet2)
  Sheet3(Sheet3)
  Sheet4(Sheet5)
  Sheet5(Sheet4)

  Sheet名 "Sheet5" のシートコード名が Sheet4、Sheet名"Sheet4"のシートコード名がSheet5になっています。

8.ですから、シート名 "Sheet5" にある ActiveXコントロールの参照は Sheet4.ComboBox1 になります。
  ややこしいですし、間違いの元になりそうですね。

なぜ、こんなことになるかというと

・シートコード名は、シートができたときには、つけられていない。
・VBE画面を開いたときに、まだシートコード名を持たないシートについて、その時の状態で「左から」
 それまでにつけられた Sheet● の次の番号から連番をアサインする。
・いったんつけられたシートコード名は、強制的に変更しない限り、そのシート名をかえようが、
 そのシートの場所を変更しようが 決してかわらず同じ名前のままです。
 シート名が【芸名】、シートコード名が【本名】といった感じです。

で、先ほど書いた、Sheet4.ComboBox1、シート名が"Sheet4"じゃないので、間違える可能性が高いですね。
このような時、この【本名】を強制的に変更してやります。たとえば山田花子さんが佐藤さんと結構したら佐藤花子さんに
本名がかわりますね。そういうことをしてやります。


【77065】Re:コンボボックスとチェックボックスの...
発言  β  - 15/5/12(火) 19:14 -

引用なし
パスワード
   ▼mohimohi さん:

そういうことをしてやります の中身を書かないままアップしてしまいました。
以下、続けます。

具体的には

 9.VBE画面のプロジェクトエクスプローラで、シートコード名を変えたいシートを選択します。
10.画面左下にあるプロパティウィンドウにこのシートのプロパティが表示されます。
11.この中の最初の項目、(オブジェクト名)にある、現在のシートコード名を、たとえば MainSh と変更します。
12.プロジェクトエクスプローラの該当シートの表示、左側が MainSh に代わりましたね。これで変更完了です。
13.以降は、コーディング上、 MainSh.ComboBox1.Value このように書くことができます。

【77066】Re:コンボボックスとチェックボックスの...
発言  β  - 15/5/12(火) 19:54 -

引用なし
パスワード
   ▼mohimohi さん:

いろいろ「うんちく」を述べましたが、結局、ほとんどのコードを現在のシートのシートモジュールに書きました。
ただ、1か所、ThisWOrkbookモジュールのOpenイベントで参照しているところがありありますので
先に述べた方法で、このシートのシートコード名を MainSh に変更してください。

ThisWorkbookモジュール

Private Sub Workbook_Open()
  MainSh.Init
End Sub

シートモジュール

・CommandButton1_Click を削除
・新たに以下を追加。

Public Sub Init()    'Workbook_Open から実行される
  Dim WS As Worksheet
  Dim x As Long
  Dim ckb As OLEObject
  
  Set WS = Sheets("Sheet2")
  ComboBox2.Clear
  ComboBox3.Clear
  ComboBox4.Clear
  ComboBox1.Value = ""
  ComboBox2.Value = ""
  ComboBox3.Value = ""
  ComboBox4.Value = ""
  
  WS.UsedRange.Clear
  WS.AutoFilterMode = False
  Range("A1").CurrentRegion.Columns("A:D").Copy WS.Range("A1")
  WS.Range("E1").Value = 1
  WS.Range("A1").CurrentRegion.Columns("E").DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, Step:=1, Trend:=False
  WS.Range("A1").AutoFilter
  Set rfA = WS.AutoFilter.Range
  Set rfX = WS.Cells(rfA.Rows.Count + 2, "A")
  WS.Range("A1").CurrentRegion.Columns("A").Copy WS.Range("G1")
  WS.Range("G1").CurrentRegion.RemoveDuplicates Columns:=1, Header:=xlYes
  With WS.Range("G1").CurrentRegion
    If .Rows.Count = 2 Then
      ComboBox1.AddItem .Offset(1).Value
    Else
      ComboBox1.List = .Offset(1).Resize(.Count - 1).Value
    End If
  End With
  For x = 1 To 8
    OLEObjects("CheckBox" & x).Object.Value = False
    OLEObjects("CheckBox" & x).Object.Enabled = False
  Next

  If dic Is Nothing Then
    Set dic = CreateObject("Scripting.Dictionary")
    For Each ckb In OLEObjects
      If TypeName(ckb.Object) = "CheckBox" Then dic(ckb.Object.Caption) = ckb.Name
    Next
  End If
  
  '一行目の値をComboBox1〜COmboBox4にセット
  ComboBox1.Value = Range("A2").Value
  ComboBox2.ListIndex = 0
  ComboBox3.ListIndex = 0
  ComboBox4.ListIndex = 0
  
End Sub

【77073】Re:コンボボックスとチェックボックスの...
お礼  mohimohi  - 15/5/13(水) 8:13 -

引用なし
パスワード
   ▼β さん:
βさん、おはようございます。

わかりやすく教えて下さって本当にありがとうございます。。。(まだまだ読みきるのに時間がかかりそうです。涙)
ソースコードの意味を理解してから連絡しては、かなり遅れてしまいそうなので、、、
お先に感謝の言葉だけを言わせてください。
βさんにお礼の気持ちをこめて何かお送りしたい気持ちでいっぱいです。。。
お忙しい中、いつも本当にありがとうございます。
週末までには改めてご連絡させていただきますので、よろしくお願いします!

【77074】Re:コンボボックスとチェックボックスの...
発言  β  - 15/5/13(水) 9:14 -

引用なし
パスワード
   ▼mohimohi さん:

お礼を言われた後でつらいのですが、アップしたコード、不備があります。
もともと、ComboBox1でリセットがかかっていたんですが、今回は
それが、最初の1回だけなので、次に、ComboBox1を選んだ時にデータがリセットされずに
消えてしまう現象が発生します。
なるべく早く、修正してアップします。

【77075】Re:コンボボックスとチェックボックスの...
発言  β  - 15/5/13(水) 15:51 -

引用なし
パスワード
   ▼mohimohi さん:

なんとか不備解消できたようです。

Public Sub Init() の最初のほうの2行、

  WS.UsedRange.Clear
  WS.AutoFilterMode = False

順番をいれかえて

  WS.AutoFilterMode = False
  WS.UsedRange.Clear

にしてください。

で、新しいプロシジャとして以下を追加してください。

Private Sub ComboBox1_GotFocus()
  rfA.AutoFilter Field:=1
  rfA.AutoFilter Field:=2
  rfA.AutoFilter Field:=3
  rfA.AutoFilter Field:=4
End Sub

【77076】Re:コンボボックスとチェックボックスの...
お礼  mohimohi  - 15/5/13(水) 23:08 -

引用なし
パスワード
   ▼β さん:

お世話になっております。
解説読まさせていただきました。やっと。。。
私にもわかるレベルに話を例えてくださり、本当にありがとうございます^^

ソースコードは、実際のところまだ読み切れてないです;;
コピペをしましたが、

Public Sub Init()のdicの変数が定義されてないみたいで、エラーになりました。
話変わりますが、「hanahana_mohi」のヤフーのアドレスに連絡していただくことは可能でしょうか?

【77077】Re:コンボボックスとチェックボックスの...
発言  β  - 15/5/14(木) 1:19 -

引用なし
パスワード
   ▼mohimohi さん:

>Public Sub Init()のdicの変数が定義されてないみたいで、エラーになりました。

えっ?
dic という変数は使って居ませんが?

>話変わりますが、「hanahana_mohi」のヤフーのアドレスに連絡していただくことは可能でしょうか?

個人的なコンタクトということですか。
それは、ちょっと、この種の掲示板の主旨にはそぐわないような・・・
もし、お手伝いが必要なら、質問を投げかけていただければ、対応しますから。

【77078】Re:コンボボックスとチェックボックスの...
発言  mohimohi  - 15/5/14(木) 5:44 -

引用なし
パスワード
   ▼β さん:
おはようございます。
>>Public Sub Init()のdicの変数が定義されてないみたいで、エラーになりました。

>dic という変数は使って居ませんが?
あれれ。スミマセン。
もう一度みてから改めてご連絡します!

>もし、お手伝いが必要なら、質問を投げかけていただければ、対応しますから。
掲示版という環境に慣れなくて。。。
そうですよね!大変失礼致しました。これからもここでご対応よろしくお願いします。

986 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free