• 締切済み

条件を絞り込んだVBAでのドロップダウンの作り方

いつもお世話になっております。 今、Sheet1のA列に果物名、C列に数字が入力されています。(今回Sheet1のB列は、特に処理の対象とする訳ではないので不要です。) Sheet2のCells(15,1)に果物名を入力した際、Sheet1のA列の果物名でで絞り込んだC列の数字を、Sheet2のCells(15,2)にドロップダウンリストで表したいです。 当方が考えたロジックは Sheet1のA列をforで回しSheet2のCells(15,1)と一致した場合に、Sheet1のCells(i,3)の値を、あらかじめ入力規則に設定したセル範囲に転記。一致判定と一致した場合のCells(i,3)の値の転記を繰り返せばドロップダウンが出来上がるのですが、いまいちスマートではないなと思います。 いい方法があればご教示下さい。

みんなの回答

  • Chiquilin
  • ベストアンサー率30% (94/305)
回答No.5

今のやり方で何ら問題ないと思いますけど。 マクロでなくてパラメータクエリでもいいと思います。その場合 抽出データがテーブルになるので参照もしやすいでしょう。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

#3です。#3は途中的だったので、参考までに、補足します。 #3のVBAの実行結果が Sheet2のD1:F5に りんご バナナ みかん 1  2  3 4  6  7 5  9  10 8 の形に、できたとして、その後 標準モジュールに Sub Sample1() Worksheets("sheet3").Select For i = 2 To 4 'x = ActiveCell x = Cells(i, "A") MsgBox x Set cc = Worksheets("Sheet2").Range("d1:f1").Find(x) c = cc.Column MsgBox c s1 = Worksheets("sheet2").Name lr = Worksheets("Sheet2").Cells(1000, c).End(xlUp).Row MsgBox lr s2 = Range(Cells(2, c), Cells(lr, c)).Address With Worksheets("Sheet3").Cells(i, "B").Validation .Delete .Add Type:=xlValidateList, _ Operator:=xlEqual, _ Formula1:="=" & s1 & "!" & s2 End With MsgBox "=" & s1 & "!" & s2 Next i End Sub を実行すると(Msgbox行は少数テスト後は、削除のこと) Sheet3のB列に、A列の値に応じた、選択アイテムをセットします。 ここで考えているのは、Changeイベントを使わない方法のため、 前もってSheet3のA列には選択するデータ(=名前)を、一括して、入力しておくものとします。その後上記VBAを実行すると、Sheet3のB列においては、クリックして現れる選択肢から、クリックして選択すると、A列の名前に対応した選択肢が、ドロップダウンで表示されます。その中から選択すれば、B列には選択された値がセットされます。 >上記Worksheets("Sheet2").Range("d1:f1").のセル範囲部分(名前見出し部分)は(4列(個)以上に増えても)拡張対応は、コードを少し変えれば可能です。 Sheet3のA列のChangeイベントで上記のVBAに似たものを走らせるのは、なんとなく不安なので、上記の例にしました。 Formula1の右辺は、文字列で指定してますが、エクセルではこれが標準らしい。 他の方法もあるかもしれないが不明。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

色んな方法があるということで、下記を読んでください。 ーー エクセルでは、「リスト」のアイテム(項目)は、セル(行とか列)に 具体的に作られている必要があります。普通はある単一列です。 頭で考えたり、プログラムしたら「ルールが決まっている・簡単だ」では、良い方法が設けられていない。 (しかしアクセスなら、例えばコンボのアイテムを、 SQLで選択文のコードそのものを、DataSourceとして書き込む ことができる。便利です。) ーー 例えば、A列が「りんご」である行の、C列の値(=ルールで言えば)の 項目のバラエティをリストに示して、その中から選びたい、は難しい。 ーー ただし(表Aという) りんご バナナ みかん(-->列) 1  2  3 4  6  7 5  9  10 8 (下方向に列) のような表が、具体的にエクセルシートに作られておれば、 (有名なやり方ですが、) https://www.excelspeedup.com/pulldown4/ に解説のある方法で、VBAを使わずに、やれます。エクセルの上級ワザ? 2次元である表から項目(例 みかん)で選べる、ことになる。 ーー この上記のような表(表A)をVBAで、当初に1回だけ、 シートのセル範囲に作ってしまう方法もあります。  しかしこういう表の組み換えを「操作」でやるのは結構面倒です。 ソートして、目視で切り貼りすれば表を作るのは簡単で速いすがね。さらなるVBAの勉強のためやプライド(手作業は泥臭い)からやらないでしょう。 ーー そこで、プログラムで考えれば、 例えば Sub test01() lr = Range("A100000").End(xlUp).Row 'MsgBox lr For i = 2 To lr k = Cells(i, "A") Set c = Range(Cells(1, 4), Cells(1, 1000)).Find(k) If c Is Nothing Then lc = Cells(1, 1000).End(xlToLeft).Column MsgBox lc lc = lc + 1 Cells(1, lc) = k '-- r = Cells(100000, lc).End(xlUp).Row MsgBox r Cells(r + 1, lc) = Cells(i, "C") Else lc = c.Column MsgBox "find column " & lc r = Cells(100000, lc).End(xlUp).Row MsgBox r r = r + 1 Cells(r, lc) = Cells(i, "C") End If Next i End Sub 結果 Sheet1のA-C列に質問のデータがあるとして、実行すると Sheet1でD列からF列に りんご バナナ みかん 1 2 3 4 6 7 5 9 10 8 となります。 このD-F列のセル範囲を対象に、前記のWEB記事の方法で、関数と操作で 入力規則を設定すれば、できるでしょう。 ーー 質問のやり方は繰り返し法で対象を見つけているので、小生はあまり気乗りがしない。Filter法とかFind法がよいとおもうが、Filter法はVisibleセルデータを対象にしなければならない難しさがある。でもVBAコードをWEBで探し、慣れればしまいかも。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.2

>あらかじめ入力規則に設定したセル範囲に転記。 直接、入力規則の元の値に転記すれば Sheet2のシートモジュールに Private Sub Worksheet_Change(ByVal Target As Range)   Dim myList As String   Dim c As Range   If Target.Address <> "$A$15" Then Exit Sub   Range("B15").ClearContents   With Worksheets("Sheet1")     For Each c In .Range("A2:A" & .Cells(Rows.Count, "A").End(xlUp).Row)       If Range("A15").Value = c.Value Then         myList = myList & c.Offset(, 2).Value & ","       End If     Next   End With   If myList = "" Then myList = " "   With Range("B15").Validation     .Delete     .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _     xlBetween, Formula1:=myList   End With End Sub

  • skydaddy
  • ベストアンサー率51% (388/748)
回答No.1

オートフィルターを使って絞り込み、必要な行数をカウントすれば簡単かと。 オートフィルターの使い方は例えばこちら。 http://officetanaka.net/excel/vba/tips/tips155.htm Sheet1の表をいじりたくなければ、Sheet3を作業用としてSheet1から呼び出される時にコピーするようにすれば良いと思います。

関連するQ&A

  • 【Excel VBA】条件に合うデータの転記

    Excel2003を使用しています。 2つのシート間の特定の範囲内で、条件に合うデータを転記したいのですが… Sheet1(A1:C41) ← 一定範囲 Sheet2(選択範囲) ← 都度、選択範囲取得 Sheet2の選択範囲内で、A列とB列の値が、Sheet1のA列とB列のそれぞれの値と一致した場合、Sheet1のC列の値をSheet2のE列に転記したいのですが、こういう場合、コードはどのように書いたらいいでしょうか? 条件に合ったものを順に転記していくコードは書いたことがあるのですが、特定の範囲内ということや、転記する場所が指定されたりしていて、つまづいています。 よろしくお願いします。

  • VBA 条件検索について

    VBAの検索について質問です。 以下のようなものを作ろうと思います。 sheet1とsheet2がありsheet1のA、Bの数値をsheet2の同じA,Bの数値の値の行を検索して, その同じ値の行のsheet1のCの数値の値からsheet2のCの数値を引いた値をsheet3のC列に返すプログラムを作ろうと思います。空白などで同じ値がない場合はsheet3に空欄を返そうと思います。 以下に例をプログラムの実行例を示します。 sheet1 ■ A 列 B 列 C列 1: 7 | 1 | 3 2: 5 | 8 | 2 3: 2 | 3 | 1 4: 9 | 6 | 4 sheet2 ■ A 列 B列 C列 1: 2 | 3 | 4 2: 9 | 6 | 2 3: 7 | 1 | 5 4: 5|   | 3 sheet3 ■ A列 B列 C列 1: 7| 1 | -2 2: 3: 2| 3 | -3 4: 9 | 6 | 2 自分で以下のプログラムを作成してみたのですが空欄が検索できなかったりしてなかなかできません。 どなたか、教えてください。お願いします。 Sub test() Dim sh1 As Object, sh2 As Object, sh3 As Object Dim d1 As String, d2 As String, a As Long Set sh1 =Sheets(“Sheet1”) Set sh2 =Sheets(“Sheet2”) Set sh3 =Sheets(“Sheet3”) For a = 1 To 3000 Step 1 d1 = sh1.Cells(a,1) & sh1.Cells(a,2) d2 = sh2.Cells(a,1) & sh2.Cells(a,2) Do while d2 <>”” If d1 = d2 Then Sh3.Cells(a,1) = sh1.Cells(a,1) Sh3.Cells(a,2) = sh1.Cells(a,2) Sh3.Cells(a,3) = sh1.Cells(a,3) Exit Do End If a= a+1 d2 = sh2.Cells(a,1) & sh2.Cells(a,2) Loop Next End Sub

  • ドロップダウンリストで空白のセルを非表示

    エクセル2013です。 Sheet1にドロップダウンリストを作成しました。 Sheet2のC列を参照したい為 Sheet2のC3~C20000に名前の管理で「商品名」としておき Sheet1の入力規則には リスト-「=商品名」 としました。 ただ、現在Sheet2のはC列にはまだ1,000行ぐらいまでしか値が 入っておらず、ドロップダウンリストでは空白の方が多く 選択が大変です。 Sheet2のC列には毎日入力されて値のある行が 日々増加していくので都度入力規則のリストのデータ範囲を修正するのは 大変なので C3~C20000としておきました。 NETで調べると、リストの範囲が同一シート内はoffsetを使えばできるみたいですが リストが他シートの場合はどうすればいいのでしょうか? 何かいい方法はありますでしょうか? よろしくお願いします。

  • 別シートの行を選択し対象列を転記するマクロ

    シート2のA~F列までデータがあります。 行数は10,000行です。(月ごとに100行くらい追加されます。) A列は項目がNO.で半角数字が連番で入力されてます。 セルA2→1 セルA3→2 セルA4→3 . . . セルA10000→9999 セルA10001→10000 という感じです。 シート1の セルI9に番号を入力すると シート2のその番号の行のB~F列の値を シート1のJ9~N9列に転記したいです。 例えば シート1のセルI9に100と入力したら、 シート2のA列が100と入力されているセルはA101ですから 101行目となります。101行目の各列の値を転記します。 ↓ シート1のセルJ9にシート2のセルB101の値を転記 シート1のセルK9にシート2のセルC101の値を転記 シート1のセルL9にシート2のセルD101の値を転記 シート1のセルM9にシート2のセルE101の値を転記 シート1のセルN9にシート2のセルF101の値を転記 シート1もシート2もセルの書式設定は標準。 B,E,F列は半角英数字の組み合わせで C,D列は半角数字のみです。 たまにF列に空白がある行があります。 B,F列は数字のみの場合もあります。 B,C,D,F列は数字のみの場合 「数値が文字列として入力されています」 となっています。 マクロで行いたいのですが記述そのものを教えてください。

  • VLOOKUP関数と同じことをVBAでおこなうには

     初めまして、当方VBAの素人です。よろしくお願いします。  同じような質問で、このようなVBAを見つけました。 Sub Macro1() For n = 2 To 5 '処理するSheet2の行数範囲 a = Sheets("Sheet2").Cells(n, 1) 'aにA列の値を代入 For m = 2 To 5 '検索するSheet1の行数範囲 If Sheets("Sheet1").Cells(m, 1) = a Then 'Sheet2のA列の値とSheet1のA列が一致した場合 v = Sheets("Sheet1").Cells(m, 2) 'vにB列の値を代入 Sheets("Sheet2").Cells(n, 2).Value = v 'Sheet2のB列に値を入力 Exit For '値が見つかったのでForを終了 End If Next Next End Sub このVBAではSheet2での検索、入力が列になるのですが、列でなく、行でできないでしょうか。できればSheet1のB列の値をSheet2の1行で検索、Sheet2の2行に入力されるだけではなく、Sheet1のC列の値をSheet3の1行で検索、Sheet3の2行に入力されるようにしたいと思います。  解る方、よろしくお願いします。

  • VBAの複数条件分岐について

    VBAで下記の構文を使用してシート1にある表より 条件に合致するもののみシート2に抽出するようにしています。 現在はシート1のE2セルの値がシート1のB列の値と比較して 該当するものを抽出しています。 この条件が、 シート1のE1のセルの値が20より小さい場合、 かつE2のセルの値がシート1のB列の値と比較して該当するものを シート1に貼り付け、 シート1のE1のセルの値が20以上の場合、 かつE2のセルの値がシート1のD列の値と比較して該当するものを シート1に貼り付ける というような条件に変えたいのですが どのように変更したらよろしいのでしょうか。 よろしくご教授下さい。 ちなみに現在使用している構文です。 これもきれいな構文かはわからないのですが・・・ Sub test() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") k = 1 sh2.Cells(k, "B") = sh1.Cells(1, "A") sh2.Cells(k, "C") = sh1.Cells(1, "B") k = k + 1 d = sh1.Range("A65536").End(xlUp).Row For i = 2 To d If sh1.Cells(i, "B") <= sh1.Range("E2") Then sh2.Cells(k, "B") = sh1.Cells(i, "A") sh2.Cells(k, "C") = sh1.Cells(i, "B") k = k + 1 End If Next i sh2.Activate End Sub

  • Excel マクロ 値の転記

    Excel マクロ 値の転記 Sheet2をSheet1に転記したいのですが、A列だけは3回同じ値を転記 するのには、※をどのように変えたらいいのでしょうか? 宜しくお願い致します。 〔Sheet1〕転記先 A  B あ  10 あ  20 あ  30 い  40 い  50 〔Sheet2〕転記元 A  B あ  10 い  20 う  30 え  40 お  50 Sub テスト() Dim i As Long For i = 1 To 30    '↓※ココをどう書いて良いのかが分かりません Worksheets("Sheet1").Cells(i, "A") = Worksheets("Sheet2").Cells(i, "A") Worksheets("Sheet1").Cells(i, "B") = Worksheets("Sheet2").Cells(i, "B") Next i End Sub

  • Excel VBA元データから別シートへ振り分け

    元データ(DB)をA列の値で振り分け 別シート(印刷)に転記していく方法について教えてください。 以下のコードで転記は行えましたが1つの値で1つのシートを作成になってしまいます。 どこをどのように変更すればA列の値(一種類に1つのシートにまとめたい)に 1つのシートに転記となるかご教示お願いします。 Sub test01() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("DB") Set sh2 = Worksheets("印刷") d = sh1.Range("A65536").End(xlUp).Row For i = 2 To d sh2.Cells(6, "B") = sh1.Cells(i, "A") sh2.Cells(10, "B") = sh1.Cells(i, "B") sh2.Cells(10, "C") = sh1.Cells(i, "C") sh2.Cells(10, "D") = sh1.Cells(i, "D") sh2.Cells(10, "E") = sh1.Cells(i, "E") sh2.Cells(10, "F") = sh1.Cells(i, "F") sh2.Cells(10, "G") = sh1.Cells(i, "G") sh2.Cells(10, "H") = sh1.Cells(i, "H") sh2.Cells(10, "J") = sh1.Cells(i, "I") 'sh2.Range("a1:J34").PrintOut Next i End Sub よろしくお願いいたします。

  • 特定の条件の転記

    エクセル2010です。 特定の条件のセルに対しての転記ができるか質問します 入力エリアが以下 I10:M29 I32:M51 I55:M73 I76:M95 転記したいのが同じシート上のA11から↓ B11から↓ 入力エリアに -100と入力されたらA列に100と          100と入力されたらB列に100と 入力されるようにしたい なお A列とB列に値は 重なって表示しないよう段をずらして入力できるようにしたい また 入力エリアで入力された数値は A列 B列ともに 値が入力されているセルの下に 入力するようにする。 このようなことは 可能でしょうか? 説明不足でしたら また 回答させていただきます 詳しい方、お願いします。

  • エクセルのドロップダウンリスト

    入力規則のドロップダウンリストですが、次のような使い方は可能でしょうか?また可能なら方法を教えて頂けませんか?よろしくお願いします。 A、B列にドロップダウンリストを設定し、A列のリストに値を複数設定し、B列のリストの値をA列の値によって変化させたいのですが・・・。各列とも、複数行にわたってドロップダウンリストを設定しています。

専門家に質問してみよう