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

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

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

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

マクロ

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

Q&A

解決済

1回答

1298閲覧

VBA オートフィルターでデータ取得

koko2

総合スコア21

VBA

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

マクロ

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

0グッド

0クリップ

投稿2020/05/17 06:47

編集2020/05/19 02:13
Private Sub CommandButton1_Click() Dim Sh1 As Worksheet, Sh2 As Worksheet Set Sh1 = Worksheets("Sheet1") Set Sh2 = Worksheets("Sheet2") Dim keyWord As String keyWord = Control1.Caption & "_" & Control2.Caption & "_" & Control3.Caption 'Sh1のデータをオートフィルターする With Sheets("Sheet1").Range("A1") .AutoFilter field:=1, Criteria1:=keyWord .Offset(1).Columns("A:D").Copy End With 'Sheet2の2列目の最後の行の下に貼付 With Sh2.Range("A1").CurrentRegion .Cells(.Rows.Count + 1, 1).PasteSpecial End With Sh1.Range("A:D").AutoFilter Sh1.Activate End Sub

<実現したいこと>
以前、「VBA 複数のCheckBoxの組み合みせについて」でユーザーフォームのオプションボタンを作成の仕方を教えてもらい、その選択したボタンの結果をkeyWordとしてSheet1のシートをオートフィルターし、Sheet2に転記、データの抽出と貼り付けを複数回繰り返しデータ一覧を作成しようとしようとしています。

<エラー箇所>
1.コマンドボタン1を押したら、keyWordで検索しようとしていますが、検索してくれません。ユーザーフォームで押したボタンの値をオートフィルターをしようとしています、コードの修正箇所についてご教示ください。

2.コマンドボタン2を押したら、ユーザーフォームのボタンの値を一度にクリア(初期状態)にする方法を教えてください。

<修正しました>

Private Sub CommandButton1_Click() Dim Control1 As Control Dim Control2 As Control Dim Control3 As Control Dim keyWord As String  keyWord = Control1.Caption & "_" & Control2.Caption & "_" & Control3.Caption For Each Control1 In Frame1.Controls If Control1.Value = True Then Exit For Next For Each Control2 In Frame2.Controls If Control2.Value = True Then Exit For Next For Each Control3 In Frame3.Controls If Control3.Value = True Then MsgBox Control1.Caption & "_" & Control2.Caption & "_" & Control3.Caption Exit For End If Next With Sheets("Sheet1").Range("A1") .AutoFilter field:=1, Criteria1:=keyWord .CurrentRegion.Offset(1, 0).Resize(.CurrentRegion.Rows.Count - 1, 4).Copy End With 'Sheet2の2列目の最後の行の下に貼付 With Sheets("Sheet2").Range("A1").CurrentRegion .Cells(.Rows.Count + 1, 1).PasteSpecial End With End Sub コード

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

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

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

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

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

guest

回答1

0

ベストアンサー

1. .Offset(1).Columns("A:D").Copy 
は、 .CurrentRegion.Offset(1, 0).Resize(.CurrentRegion.Rows.Count - 1, 4).Copy でよいと思います。

コマンドボタン2は

VBA

1Private Sub CommandButton2_Click() 2 Dim trgControl As Control 3 For Each trgControl In Frame1.Controls 4 trgControl.Enabled = True 5 trgControl.Value = False 6 Next 7 For Each trgControl In Frame2.Controls 8 trgControl.Enabled = False 9 trgControl.Value = False 10 Next 11 For Each trgControl In Frame3.Controls 12 trgControl.Enabled = False 13 trgControl.Value = False 14 Next 15 Worksheets("Sheet1").Range("A1").AutoFilter 16End Sub

2.フイルターの解除を

Private Sub UserForm_Initialize() Worksheets("Sheet1").Range("A1").AutoFilter End Sub

と必要か所に Worksheets("Sheet1").Range("A1").AutoFilter 

追記

vb

1Private Sub CommandButton1_Click() 2 Dim Control1 As Control, Control2 As Control, Control3 As Control 3 Dim Sh1 As Worksheet, Sh2 As Worksheet 4 Set Sh1 = Worksheets("Sheet1") 5 Set Sh2 = Worksheets("Sheet2") 6 For Each Control1 In Frame1.Controls 7 If Control1.Value = True Then 8 For Each Control2 In Frame2.Controls 9 If Control2.Value = True Then 10 For Each Control3 In Frame3.Controls 11 If Control3.Value = True Then 12 Dim keyWord As String 13 keyWord = Control1.Caption & "_" & Control2.Caption & "_" & Control3.Caption 14 'Sh1のデータをオートフィルターする 15 With Sh1.Range("A1") 16 .AutoFilter field:=1, Criteria1:=keyWord 17 '.CurrentRegion.Offset(1, 0).Columns("A:D").Copy 18 .CurrentRegion.Offset(1, 0).Resize(.CurrentRegion.Rows.Count - 1, 4).Copy 19 End With 20 'Sheet2の2列目の最後の行の下に貼付 21 With Sh2.Range("A1").CurrentRegion 22 .Cells(.Rows.Count + 1, 1).PasteSpecial 23 End With 24 Exit Sub 25 End If 26 Next 27 MsgBox "産地未選択" 28 Exit Sub 29 End If 30 Next 31 MsgBox "サイズ_産地_未選択" 32 Exit Sub 33 End If 34 Next 35 MsgBox "商品_サイズ_産地_未選択" 36End Sub 37

投稿2020/05/18 09:02

編集2020/05/19 12:32
sinzou

総合スコア392

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

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

koko2

2020/05/19 02:20

sinzou様、回答ありがとうございました。 コマンドボタン2は所望の通りできました。 コマンドボタン1は、 keyWord = Control1.Caption & "_" & Control2.Caption & "_" & Control3.Captionがデバックとなりました。ここを消してみましたら、データすべてがコピーされてシート2に貼り付けられました。 オートフィルター用の別のkeyWordが必要なのか、私の書き方に問題があるのかもしれません。
sinzou

2020/05/19 12:33

追記しました。
koko2

2020/05/19 13:11

無事に完成出来ました!ありがとうございます。 この追記ようなが必要なのですね。すごいです。 アドバイス本当にありがとうございました。
koko2

2020/05/22 02:15

すみません、関連して教えてください。Sheet1にデータがあり、抽出したデータをSheet2に、ユーザーフォームのオプションボタンを表示するのをSheet3とすることはできますでしようか?どうしてもデータのあるシートでしかオプションボタンが反応しません。 新たにteratailのほうに質問を登録したほうがよろしいでしょうか?
sinzou

2020/05/22 07:04 編集

ユーザーフォーム表示した時の背景をSheet3にするには Sheets("Sheet3").Activate  で済みますが シート上に並べるとなると一から組みなおすことになります。 追記 下記あれば、フォーム表示時にフイルターリセットされます。 Private Sub UserForm_Initialize() Worksheets("Sheet1").Range("A1").AutoFilter End Sub
koko2

2020/05/23 14:06 編集

回答ありがとうございました。 Sheet3にユーザー用にボタンを設置して、そのボタンでユーザーフォームを表示して、教えて頂いたオプションボタンで順番にkeywordを抽出しようとしていました CommandButton1_Click()にSheets("Sheet3").Activate を追記してテストしてみました。この追記の場所がよくなかったのか、 結果としてやはりkeywordがあるシートとユーザーフォームが同じシートにないと、オプションボタンがうまく連動していかないのですね。ボタンの設置場所がよくなかったのかもしれません。 初めてユーザーフォームを作成したのでこのまま使用したかったのですが、うまくVBA ユーザーフォームでシート名を取得する方法があればよかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問