質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

checkbox

checkboxは、GUIのエレメントです。また、HTML<input>タグのtype属性で扱われる値を指します。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

10945閲覧

VBA 複数のCheckBoxの組み合みせについて

koko2

総合スコア21

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

checkbox

checkboxは、GUIのエレメントです。また、HTML<input>タグのtype属性で扱われる値を指します。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2020/05/04 06:12

編集2020/05/04 06:14

抽出するキーをチェックボックスで選択し、オートフィルターのデータ集計方法について教えてください。

入力項目を制御できるように、例えば、「りんごなら本当はこの項目は選べない」という条件によって選択できないようにして、所望のデータを抽出したいです。
実際はチェックボックスが30個くらいあります。本来チェックボックスで出来るのかもわかりません。

<Sheet1> ![Sheet1](d6f40fedd6d3c752c667ee2e0d3e195c.png)

![

やりたいこと
<Sheet1>にデータがあり、ユーザーフォームでチェックボックスからユーザーに選択してもらい、<Sheet3>に所望のデータをどんどん追加して貼り付けていくようにしようとしています。

不明点
チェックボックスの組み合わせを本来望む値との対応表を作り、マクロを作成していこうと思います。
例えば商品を”りんご”、サイズ”S”、産地”AA"を選んだら問題ないけど、商品を”なし”、サイズ”L”、は選択の書き方が分からなくてつまずいています。すみませんがサンプルとなるような記載方法について教えてください。

Private

1Dim myFld1 As String, myCri As String 2Dim myRow As Long 3Dim Sh1 As Worksheet, Sh2 As Worksheet, Sh3 As Worksheet 4Set Sh1 = Worksheets("Sheet1") 5Set Sh2 = Worksheets("Sheet2") 6Set Sh3 = Worksheets("Sheet3") 7 8 'チェックボックスの組み合わせを作る 9 10 With Sh1 11 12 If .CheckBoxes(1).Value = りんご Then 13 ElseIf .CheckBoxes(5).Value = S Then 14 ElseIf .CheckBoxes(8).Value = AA Then 15 16 Else 17 End If 18 19 myFld = 1 20 myCri = UserForm1.CheckBox.Value 21  22With Sh1 23    ’Sh1のデータをオートフィルターする 24    .Range("A1").AutoFilter Field:=myFld, Criteria1:=myCri 25    myRow = .Range("A" & Rows.Count).End(xlUp).Row 26    .Range("A1:D" & myRow).Copy 27 .Sh3.Range("A").Offset(1).PasteSpecial Paste:=xlPasteAll 28    .Sh1.Range("A1").AutoFilter 29  End With 30 31  Sh3.Activate 32  Range("A1").Select 33 34End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

フレームとオプションボタンですと、こんなことできます。
各列のフィルター値取得セットできると思います
イメージ説明
フレームを配置し、各フレーム内に必要個数のOptionButtonを配置しています。
Frame1 上から OptionButton1から4
Frame2 上から OptionButton5から7
Frame3 上から OptionButton8から14
です。

VBA

1Private Sub CommandButton1_Click() 2 Dim Control1 As Control 3 Dim Control2 As Control 4 Dim Control3 As Control 5 6 For Each Control1 In Frame1.Controls 7 If Control1.Value = True Then Exit For 8 Next 9 For Each Control2 In Frame2.Controls 10 If Control2.Value = True Then Exit For 11 Next 12 For Each Control3 In Frame3.Controls 13 If Control3.Value = True Then 14 MsgBox Control1.Caption & "_" & Control2.Caption & "_" & Control3.Caption 15 Exit For 16 End If 17 Next 18End Sub

追記、

VBA

1Private Sub OptionButton1_AfterUpdate() 2 Call Chk1 3End Sub 4 5Private Sub OptionButton2_AfterUpdate() 6 Call Chk1 7End Sub 8 9Private Sub OptionButton3_AfterUpdate() 10 Call Chk1 11End Sub 12 13Private Sub OptionButton4_AfterUpdate() 14 Call Chk1 15End Sub 16Sub Chk1() 17 Dim Control1 As Control 18 Dim Control2 As Control 19 Dim Chk As Boolean 20 Dim myRange As Range 21 Dim myObj As Range 22 Dim keyWord As String 23 Set myRange = Range("A:A") 24 25 For Each Control1 In Frame1.Controls 26 If Control1.Value = True Then 27 Chk = True 28 Exit For 29 End If 30 Next 31 If Chk = True Then 32 For Each Control2 In Frame2.Controls 33 keyWord = Control1.Caption & "_" & Control2.Caption & "_*" 34 Set myObj = myRange.Find(keyWord, LookAt:=xlWhole) 35 If myObj Is Nothing Then 36 Control2.Enabled = False 37 Control2.Value = False 38 Else 39 Control2.Enabled = True 40 Control2.Value = False 41 End If 42 Next 43 For Each Control3 In Frame3.Controls 44 Control3.Enabled = False 45 Control3.Value = False 46 Next 47 End If 48End Sub 49 50Private Sub OptionButton5_AfterUpdate() 51 Call Chk2 52End Sub 53 54Private Sub OptionButton6_AfterUpdate() 55 Call Chk2 56End Sub 57Private Sub OptionButton7_AfterUpdate() 58 Call Chk2 59End Sub 60Sub Chk2() 61 Dim Control1 As Control 62 Dim Control2 As Control 63 Dim Control3 As Control 64 Dim Chk As Boolean 65 Dim myRange As Range 66 Dim myObj As Range 67 Dim keyWord As String 68 Set myRange = Range("A:A") 69 70 For Each Control1 In Frame1.Controls 71 If Control1.Value = True Then Exit For 72 Next 73 For Each Control2 In Frame2.Controls 74 If Control2.Value = True Then 75 Chk = True 76 Exit For 77 End If 78 Next 79 If Chk = True Then 80 For Each Control3 In Frame3.Controls 81 keyWord = Control1.Caption & "_" & Control2.Caption & "_" & Control3.Caption 82 Debug.Print keyWord 83 Set myObj = myRange.Find(keyWord, LookAt:=xlWhole) 84 If myObj Is Nothing Then 85 Control3.Enabled = False 86 Control3.Value = False 87 Else 88 Control3.Enabled = True 89 Control3.Value = False 90 End If 91 Next 92 End If 93End Sub

追記2
下記コードでフレームとオプションボタンの位置関係わかります。
フレーム名とその中にあるオプションボタンが
Frame3-OptionButton8のように表示されます。

Frame3と、その下に-OptionButton8から14つながっていますでしょうか?

イメージ説明

VBA

1Sub test01() 2 3Dim MyCtrl As Object 4Dim InCtrl As Object 5Dim MyStr As String 6 With UserForm1 7 For Each MyCtrl In .Controls 8 If InStr(MyCtrl.Name, "Frame") > 0 Then 9 For Each InCtrl In MyCtrl.Controls 10 MyStr = MyStr & MyCtrl.Name & "-" & InCtrl.Name & vbCrLf 11 Next 12 End If 13 MyStr = MyStr & MyCtrl.Name & vbCrLf 14 Next 15 MsgBox MyStr 16 End With 17End Sub 18

投稿2020/05/04 08:29

編集2020/05/05 14:09
sinzou

総合スコア392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koko2

2020/05/04 13:33

回答ありがとうございました。初めて作成するのでもう少し教えてください。 Control1、2と今回作成しようとしている選択1番目(商品名)、2番目(サイズ)はどう結び付けるのか、私には難しいので教えて下さい。
koko2

2020/05/05 03:30

詳しく説明頂きありがとうございました。フォームを同じに作成し、追記頂いたように再現してみたのですが、商品のボタンを押したとたんにデバックとなってしまい、For Each Control3 In Frame3.Controlsでひっかかってしまいました。原因が分かりませんので教えて頂けるでしょうか。
sinzou

2020/05/05 04:41

1. 図(差し替えました)のように配置しています。確認お願いします。 2.CommandButton1_Click()修正差し替えました。
koko2

2020/05/05 11:34

修正して頂きありがとうございました。再度再現してみたのですが、同じところFor Each Control3 In Frame3.Controlsで、実行時エラー ‘424’: オブジェクトが必要です。とのメッセージです。私の設定で必要なものがあるのでしょうか。
sinzou

2020/05/05 14:08

追記2、行いました UserForm上のコントロールの配置 確認お願います。
koko2

2020/05/05 14:32

無事できました。UserFormの説明頂きありがとうございます。フォームの設定間違いしていることに気づかせていただきました。コードも非常にわかりやすく、今後に活かせていけると思います。回答頂き、ありがとうございました。
guest

0

こんばんは。少し強引ですがコンボボックスの連動のみCollectionを使って作ってみました。
あまり時間をかけれずコードが汚いので、調整をお願いします。
また。今回は、オートフィルターのデータ集計方法はふれていません。

コンボボックスの連動

メインシート:master
セルA列~D列
Userform1
Combobox1:商品名
Combobox2:サイズ
Combobox3:産地

VBA

1Private Sub ComboBox2_Change() 2 3Dim MyData3 As New Collection 4Dim cnt3 As Long 5Dim i3 As Long 6 7 8cnt3 = Sheets("master").Range("A1").CurrentRegion.Rows.Count 9 10商品名 = ComboBox1.Text 11サイズ = ComboBox2.Text 12 13ComboBox3.Clear 14 15 On Error Resume Next 16 For i3 = 2 To cnt3 17 18 If Sheets("master").Range("B" & i3).Value = 商品名 Then 19 20 If Sheets("master").Range("C" & i3).Value = サイズ Then 21 MyData3.Add Sheets("master").Range("D" & i3).Value, Sheets("master").Range("D" & i3).Value 22 End If 23 End If 24 25 Next i3 26 On Error GoTo 0 27 28 For i3 = 1 To MyData3.Count 29 30 ComboBox3.AddItem MyData3(i3) 31 Next 32 33 34End Sub 35Private Sub ComboBox1_Change() 36Dim MyData2 As New Collection 37Dim cnt2 As Long 38Dim i2 As Long 39 40 41cnt2 = Sheets("master").Range("A1").CurrentRegion.Rows.Count 42 43商品名 = ComboBox1.Text 44 45ComboBox2.Clear 46 47 '■重複しない商品名のリストを作成(エラーを無視) 48 On Error Resume Next 49 For i2 = 2 To cnt2 50 51 If Sheets("master").Range("B" & i2).Value = 商品名 Then 52 53 MyData2.Add Sheets("master").Range("C" & i2).Value, Sheets("master").Range("C" & i2).Value 54 End If 55 56 Next i2 57 On Error GoTo 0 58 59 '■商品名のリストを作成 60 61 For i2 = 1 To MyData2.Count 62 63 ComboBox2.AddItem MyData2(i2) 64 Next 65 66 67End Sub 68 69Private Sub UserForm_Initialize() 70Dim MyData1 As New Collection 71 72Dim cnt As Long 73Dim i As Long 74 75 cnt = Sheets("master").Range("A1").CurrentRegion.Rows.Count 76 77 '■重複しない商品名のリストを作成(エラーを無視) 78 On Error Resume Next 79 For i = 2 To cnt 80 81 MyData1.Add Sheets("master").Range("B" & i).Value, Sheets("master").Range("B" & i).Value 82 83 Next i 84 On Error GoTo 0 85 86 '■商品名のリストを作成 87 88 For i = 1 To MyData1.Count 89 90 ComboBox1.AddItem MyData1(i) 91 Next 92 93End Sub

Listboxで作るとこんな感じでしょうか・・・・。
コードはコンボがリストボックスに
なっただけでほぼ同じです。

Listbox

<初回の投稿>
拝見しました。チェックボックスの組み合わせですがチェックボックスは複数選択が可能なので
現実的ではないような気がします。

他の記事ではコンボボックスが連動するように作られているようです。
Excel VBA 複数(2つ)のコンボボックスに連動するリストを登録する

VBA使うならシンプルな方法がいいので、参考にされると良いかと思います。

投稿2020/05/04 06:35

編集2020/05/04 23:16
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koko2

2020/05/04 13:27

回答ありがとうございました。参考のサイトを確認させていただきます。
koko2

2020/05/05 03:12

お忙しいところ再度解答を頂きありがとうございました。自分でも上記を再現して勉強させて頂きます。だいぶ近いものになりそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問