コメントありがとうございます。 仮に、 b2にプルダウン、リストがe2、Filter関数で表示候補の設定がj2 b4にプルダウン、リストがg2、Filter関数で表示候補の設定がk2 とすると、以下のようなプログラムで行けるのではないかと思います。 j列、k列は仮で書いていますので、実際の列に置き換えてみてください。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address "$B$2" And Target.Address "$B$4" Then 'B2,B4セルではないので終了 Exit Sub End If 'ChangeしたのがB2セルで、 'その値がFilter関数のJ2セルと同じで、 'J2の下のJ3が値なしなら '1つだけに絞れたので、プルダウンは出さずに終了 '(入力規則のリストの元を =J2# にしている場合) If Target.Address = "$B$2" And _ Target.Value = Range("J2").Value And _ Range("J3").Value = "" Then Exit Sub End If 'ChangeしたのがB2セルで、 'その値がFilter関数のK2セルと同じで、 'K2の下のK3が値なしなら '1つだけに絞れたので、プルダウンは出さずに終了 '(入力規則のリストの元を =K2# にしている場合) If Target.Address = "$B$4" And _ Target.Value = Range("K2").Value And _ Range("K3").Value = "" Then Exit Sub End If 'プルダウンを表示 Target.Select SendKeys "%{DOWN}" End Sub
A列の全てで検索をできるようにしたい、という事でしたら 例えば1行目の場合、K1セルを =TRANSPOSE(FILTER($F$2:$F$48,IFERROR(FIND(A1,$I$2:$I$48),FALSE),"")) にして、A1セルの値を検索した結果を横方向に表示するように設定。 A1セルの入力規則を =K1# にしてK列を指定。 A列、K列それぞれを縦方向に必要な行数だけコピーしたら、VBAは Private Sub Worksheet_Change(ByVal Target As Range) Dim r As String If InStr(Target.Address, "$A$") = 0 Then 'A列でないので終了 Exit Sub End If '自分の行取得 r = Target.Row If Target.Value = Range("K" & r).Value And _ Range("K" & r).Offset(0, 1).Value = "" Then 'リストから選択したので終了 '(自分の行のK列が自分のセルと同じで、その右が空白) Exit Sub End If Target.Select SendKeys "%{DOWN}" End Sub こんな感じでいけるのではないかと思います。
この動画を見ながら、実際にやってみましたが、とても分かりやすかったです!
ちなみに、動画内のセルB2をB3、B4・・・と下にコピーしたいのですが、
FIND関数でB2のみしか選択できないので、うまく出来ませんでした。
何かいい方法がありますでしょうか?
嬉しいコメントありがとうございます(^^)
複数のセルに対応するには、それぞれのセルのリストを別々に作る必要があります。
B2、B3と行方向にコピーすることまで考えますと、例えばK2セルに
=TRANSPOSE(FILTER($F$2:$F$48,IFERROR(FIND(B2,$I$2:$I$48),FALSE),""))
と入力して、B2セルの入力規則の「元の値」を「=K2#」に変更、
B2セルをB3、B4とコピーしたら、K2セルもK3、K4とコピーすれば、それぞれのセルで検索できると思います。
あとWorksheet_Changeの方も、B3、B4セル対応すれば、より使い勝手が良くなると思いますので、お試しくださいね。
@@sum3311横にスピルさせられるのですか⁈凄すぎますね
I列にまとめてしまうのいいアイデアですね。
VBAも使えそう。勉強になりました。
ありがとうとざいます!
とてもうれしいです(*^^*)
b2にプルダウン リストがe2
b4にプルダウン、リストがg2
プルダウンまではできるのですが
vbaの2つのセルのみに対応する打ち方がわかりません。
コメントありがとうございます。
仮に、
b2にプルダウン、リストがe2、Filter関数で表示候補の設定がj2
b4にプルダウン、リストがg2、Filter関数で表示候補の設定がk2
とすると、以下のようなプログラムで行けるのではないかと思います。
j列、k列は仮で書いていますので、実際の列に置き換えてみてください。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address "$B$2" And Target.Address "$B$4" Then
'B2,B4セルではないので終了
Exit Sub
End If
'ChangeしたのがB2セルで、
'その値がFilter関数のJ2セルと同じで、
'J2の下のJ3が値なしなら
'1つだけに絞れたので、プルダウンは出さずに終了
'(入力規則のリストの元を =J2# にしている場合)
If Target.Address = "$B$2" And _
Target.Value = Range("J2").Value And _
Range("J3").Value = "" Then
Exit Sub
End If
'ChangeしたのがB2セルで、
'その値がFilter関数のK2セルと同じで、
'K2の下のK3が値なしなら
'1つだけに絞れたので、プルダウンは出さずに終了
'(入力規則のリストの元を =K2# にしている場合)
If Target.Address = "$B$4" And _
Target.Value = Range("K2").Value And _
Range("K3").Value = "" Then
Exit Sub
End If
'プルダウンを表示
Target.Select
SendKeys "%{DOWN}"
End Sub
こんにちは、ものすごく内容に感銘を受けて真似してみたのですが、VBAがうまいこと動作しません。
targetセルの値を確定(enter)をすると本来次のセルがアクティブになるはずが、「select」で元に戻ってalt+下がsendされる、という動作だと思いますが、プルダウンリストが一瞬見えるものの、すぐに消えてしまいます。
Excel自体の設定が影響しますでしょうか?
ご教示いただければ幸いです
お試しいただいてうれしいです(^^)
原因として考えられるのは
・入力規則の設定タブで「ドロップダウンリストから選択する」のチェックが外れている
・ファイル→オプション→詳細設定の「オブジェクトの表示」が「なし(オブジェクトを表示しない)になっている
あたりではないかと思います。
「オブジェクトの表示」は、水平スクロールバーを表示するなどの少し下にあります。
もしそれらでない場合は
・マウスのクリックでプルダウンが表示されるか
・セルを選択して、キーボードでAltと下矢印で表示されるか
などで切り分けができるのではないかと思いますので、お試しくださいね。
予測変換プルダウンをA行全てにやりたい場合は入力規則はわかるのですが、VBAのスクリプトはどのようになりますか?
A列の全てで検索をできるようにしたい、という事でしたら
例えば1行目の場合、K1セルを
=TRANSPOSE(FILTER($F$2:$F$48,IFERROR(FIND(A1,$I$2:$I$48),FALSE),""))
にして、A1セルの値を検索した結果を横方向に表示するように設定。
A1セルの入力規則を =K1# にしてK列を指定。
A列、K列それぞれを縦方向に必要な行数だけコピーしたら、VBAは
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As String
If InStr(Target.Address, "$A$") = 0 Then
'A列でないので終了
Exit Sub
End If
'自分の行取得
r = Target.Row
If Target.Value = Range("K" & r).Value And _
Range("K" & r).Offset(0, 1).Value = "" Then
'リストから選択したので終了
'(自分の行のK列が自分のセルと同じで、その右が空白)
Exit Sub
End If
Target.Select
SendKeys "%{DOWN}"
End Sub
こんな感じでいけるのではないかと思います。
とても有益な情報ありがとうございます。
このプルダウンを活用したいのですが、
例えば会社毎にシートが分けられていて、
A1に会社名、B1に「赤」と入力すると、
その会社名のシートの中のリストから「赤」が含まれる商品をプルダウンに表示するよう作成するようにするには、どうすればいいのでしょうか?
わかりにくい文章で申しわけございませんがよろしくお願いします。
コメントありがとうございます(^^)
会社ごとのシートのA列に商品があるとして、検索するシートのC1セルなどに
=FILTER(INDIRECT(A1&"!A1:A100"),IFERROR(FIND(B1,INDIRECT(A1&"!A1:A100")),FALSE),"")
とすると、A1のシート名のシートからB1の文字を検索して、該当する値だけが表示されるようになります。
あとはB1セルの入力規則をリストにして元の値を「=C1#」、SendKeysなどのVBAを設定すれば、
シートを切り替えて検索できるようになると思います。
会社のシートの商品がある範囲をA1:A100としていますが、そこは実際に合わせてご変更くださいね。
ありがとうございます。
丁寧な説明でわかりやすいです!
今度試してみます。