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

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

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

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

マクロ

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

Q&A

3回答

3758閲覧

VBA コンボボックスで選択したキーワードで検索したい。

zuzu1984

総合スコア31

VBA

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

マクロ

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

1グッド

0クリップ

投稿2017/08/22 13:02

度々お世話になっております。

やっと目標に近づけてきたのですが、またも問題が発生しました。

【やりたいこと】
・ユーザーフォームのコンボボックスでキーワードを選択。
・その選んだキーワードを別シート内(DATA)で抽出(Sheet2)したい。

イメージとしては、コンボボックスの選択欄を指定して変数に格納すれば、実現できるのではないかと考えているのですが、まず選択欄をどう指定したらよいのかもわかりません。

ネット上や本では選択項目をシートから抽出するやり方は見つけられたのですが、行き詰っています。

[sheet2] ボタン2を押すとユーザーフォームが出現する。
イメージ説明

[ユーザーフォーム]
イメージ説明

[DATA]
イメージ説明

[code:Module1]

VBA

1Sub Test() 2 3 Dim X, Y As Long 4 Dim HHP(6), ECO(6), AAA As String 5 6 MT = "ぶどう" 7 8 With ThisWorkbook.Worksheets("DATA") 9 10 With .Cells.Find(waht:=MT) 11 X = .Row 12 Y = .Column 13 End With 14 15 Dim reHHP, reECO, reAAA As Long 16 reHHP = X + 28 17 reECO = X + 1 18 reAAA = X + 56 19 20 Dim i As Integer 21 22 For i = 0 To 6 23 HHP(i) = .Cells(reHHP + i, Y).Value 24 ECO(i) = .Cells(reECO + i, Y).Value 25 Next i 26 27 28 AAA = .Cells(reAAA, Y).Value 29 30 MsgBox "HHPの要素数:" & UBound(HHP) + 1 & vbLf & "HHPの中身:" & Join(HHP, ",") 31 MsgBox "ECOの要素数:" & UBound(ECO) + 1 & vbLf & "ECOの中身:" & Join(ECO, ",") 32 MsgBox AAA 33 34 End With 35 36 37 With ThisWorkbook.worksheeets("sheet2") 38 39 Dim M As Integer 40 41 For M = 0 To 6 42 .Cells(M + 3, "C").Value = HHP(M) 43 .Cells(M + 12, "C").Value = ECO(M) 44 Next M 45 46 Range("C21") = AAA 47 48 End With 49 50End Sub 51 52'***************************** 53' ユーザーフォーム 54'***************************** 55 56Sub FormShow() 57 58 UserForm1.Show vbModeless 59 60End Sub 61

[UserForm1]

VBA

1Option Explicit 2 3Sub ユーザーフォームの表示() 4 UserForm1.Show vbModeless 5End Sub 6 7Private Sub CommandButton1_Click() 8 9End Sub 10 11Private Sub CommandButton2_Click() 12 13 Unload Me 14 15End Sub 16 17Private Sub UserForm_initialize() 18 19Dim K As Integer 20 21 For K = 3 To 10 22 ComboBox1.AddItem Worksheets("DATA").Cells(2, K).Value 23 Next 24 25 26End Sub
退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答3

0

現状で分からないのは、

イメージとしては、コンボボックスの選択欄を指定して変数に格納すれば、実現できるのではないかと考えているのですが、まず選択欄をどう指定したらよいのかもわかりません。

ですね。

Dim MT As String MT = UserForm1.ComboBox1.Value

コンボボックスの選択した値は、下記のコードでも同じ結果になりますが、上記の方がシンプルです。
MT = ComboBox1.List(ComboBox1.ListIndex)
ただしリストボックスの場合は、こちらの方法になります。

仕様が明確でないので提示のコードは精査してませんが、気になったことは、

Dim X, Y As Long Dim HHP(6), ECO(6), AAA As String

これだと、X, HHP(6), ECO(6) はVariant型の変数になります。

Dim X As Long, Y As Long Dim HHP(6) As String, ECO(6) As String, AAA As String

とすべきですね。

追記

フォームの設計をみると Searchボタンが配置してあるので、これをクリックしたときに検索したいということだと思われます。 なので、標準モジュール(Module1)ではなく、検索するコードはこのコマンドボタンのクリック時に記述すべきですね。
ということで、UserForm1 のモジュールは下記のような感じになります。

Option Explicit 'Searchボタン Private Sub CommandButton1_Click() Dim X As Long, Y As Long Dim HHP(6) As String, ECO(6) As String, AAA As String Dim MT As String MT = ComboBox1.Value With ThisWorkbook.Worksheets("DATA") With .Range("C2:J2").Find(waht:=MT) X = .Row Y = .Column End With '以下略 End With End Sub 'Closeボタン Private Sub CommandButton2_Click() Unload UserForm1 End Sub Private Sub UserForm_Initialize() ComboBox1.List = Range("C2:J2").Value End Sub

Searchボタンクリック時ではなく、コンボボックスで選択したら即検索したい場合は、ClickイベントComboBox1_Click()に記述します。Changeイベントだと一文字入力しただけでも発生しますので、適切ではないですね。コンボボックスの場合、テキストに直接入力することを可能ですので。

投稿2017/08/22 19:03

編集2017/08/23 02:44
hatena19

総合スコア33605

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

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

0

たぶん、フォームにあるSerchボタンをクリックしたときに抽出(標準モジュールのtest関数)を実行したいということですよね。
そうであれば、以下の点を変更してみてはいかがでしょうか。

抽出処理について

まず抽出処理(Test関数)の部分ですが、現状では"ぶどう"固定での検索となっているようですね。
検索キーワードは外部からもらえるように変更しましょう。

以下の記述では、検索キーワードを引数として受け取れるよう変更しています。

Sub Test(ByVal MT As String) Dim X, Y As Long Dim HHP(6), ECO(6), AAA As String 'MT = "ぶどう" '(以下略) End Sub

フォーム側の処理について

コンボボックスで選択したキーワードの取得方法ですが、検索する文字列がコンボボックスに表示している文字列そのものならComboBox1.Textだけで取得できます。

Searchボタンのクリックイベント( CommandButton1_Click)内で抽出処理を呼び出す際、コンボボックスの選択内容を引数として渡してあげましょう。

Private Sub CommandButton1_Click() Call Test(Me.ComboBox1.Text) End Sub

抽出処理の中身などは確認していませんが、上記で処理の流れは理解いただけるのではないかと思います。
参考になれば幸いです。

投稿2017/08/23 03:13

jawa

総合スコア3013

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

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

0

こんな感じでしょうか?

モジュールの住み分け

モジュール機能
[code:Module1]フォームの呼び出しモジュール
[UserForm1]実際にデータを検索するフォーム

やりたいこと

  • フォーム上のコンボボックスに「りんご」「みかん」などの個々の要素を格納するところまでできた
  • ここから、「りんご」だとか「みかん」などを選択したときに、これをキーにして検索したい

この「やりたいこと」を処理の流れに書き直します。

処理の順番)

  1. コンボボックスを選択した(中身が変わった)とき
  2. コンボボックスの中身を取得
  3. コンボボックスの中身で検索

対策

もうほとんどできているように見受けられます。

1. コンボボックスを選択した(中身が変わった)とき
フォームの中にComboBox1.AddItem Worksheets("DATA").Cells(2, K).Valueとありますので、コンボボックスの中身が変わったときには、ComboBox1が変わったとき、というイベントで拾えます。具体的には、Private Sub ComboBox1_Change()というイベントハンドラです。

2. コンボボックスの中身を取得
コンボボックスの中身は、コンボボックスの選択中のインデックス番号(一番上なら0、2番目なら1といった具合です)で拾うことができます。具体的にはstr = ComboBox1.List(ComboBox1.ListIndex)です。

3. コンボボックスの中身で検索
検索処理自体は、Module1のMT = "ぶどう"以下と同じですね。UserForm1に、MT = str以下略で続ければよいと思います。

続けて書くと、

VBA

1Private Sub ComboBox1_Change() 2 ' コンボボックスの中身を文字列にする 3 MT = ComboBox1.List(ComboBox1.ListIndex) 4 5 ' 検索処理(Module1のEnd Subまで使いまわしOK) 6 With ThisWorkbook.Worksheets("DATA") 7 ' 以下略 8End Sub

投稿2017/08/22 22:09

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問