- ベストアンサー
Excelでリストボックス(入力規則)を活用したい
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
>欲を言えば、B列の作業セルを使わずに導くことができればと考えていますが…難しいでしょうか。 エクセルを使い始めて間もない人のようで、難しいと思う。質問者は、#1回答に関して、エクセルの関数の本質も判ってない。 また質問者はVBAにも首を突っ込んでいないだろうから、下記を書いても無駄だと思うが。 質問者以外の人でVBAを少し判る人のために、参考までに、やってみたことを記してみます。 エクセルに限っても、素人的に「あれもできないか、これもできないか」言うなら、最低でもVBAを勉強すること。それでもできないことは沢山ある。 素人には、簡単そうでもVBAでは、むつかしいこともある。 (エクセルの本質) (1)エクセル(関数)では、頭の中に、ああすればよい(たとえば一行おきとか、重複のないデータなど)いう方式は、簡単に想像して、文章で表現できても、中間の変数(や配列の変数)を、関数では使えないので、従ってどこかの空き(使わない邪魔にならない)セル範囲に、最終の(リストの)データを置くセル範囲を作らないといけない場合が多い。 (2)元データ(範囲と中身)は普通は、変更や追加・抹消される場合があると思うが、その場合に、連動してリストのデータ源も変わってほしい場合が多い。 (1)(2)を満たすのは、エクセルの関数です。すでに#1で回答がありま す。それも作業列を使わないために、配列数式という、普通ではない仕組みを使わざるを得ないのです。でも最終結果列は絶対使わないとできない。 普通入力規則はデータを利用者が手入力して、それを使う程度のものです。 それも表計算ソフトとして、異例な付加機能でしょう。 同じようなことをやりたいなら、勉強する人は、UserFormのしくみを使って、VBAも使ってやるでしょう。 ーー 本件についてVBAでやる一方法例 例データ Sheet1 A1:A12に データ 横 縦 縦 縦 斜 斜 左 左 上 上 下 ーー VBE画面で、挿入ー標準モジュール コードは Sub test02() Dim a(100) '重複のないデータの配列 Dim b(100) '元データの配列 lr = Range("A10000").End(xlUp).Row MsgBox lr '---元データの配列を作る For i = 1 To lr b(i) = Cells(i, "A") 'MsgBox b(i) Next i '----重複のないデータを配列に作る j = 1 For i = 2 To lr 'MsgBox b(i) If Application.WorksheetFunction.CountIf(ActiveSheet.Range("A1:A" & i), b(i)) = 1 Then a(j) = b(i) j = j + 1 Else End If p1: Next i '---重複のないデータの配列から入力規則用のリスト文字列を作る s = "" For i = 1 To j 'MsgBox a(i) s = s & a(i) & "," Next i s = Left(s, Len(s) - 1) MsgBox s '---C2;C7に入力規則を設定 With ActiveSheet.Range("c2:C7").Validation '入力規則を削除 .Delete '入力規則の設定: 'エラーメッセージのスタイルは「注意」 .Add Type:=xlValidateList, _ Formula1:=s, _ AlertStyle:=xlValidAlertWarning End With End Sub ーーー 実行するとC2:C7に入力規則が設定される。 Accessなどのリストボックスではデータソースに配列やSQL文を指定できたように思う
補足
失礼ですが、VBAを使うこともできますし、全く不可能ならその方法も考えてはいました。 しかし、VBAはなるべ使いたくないし、数式の関数ですむなら数式で済ませたいと思っています。 知らないことは知らないし、知ってることは知っています。理解していないことは悪いことなんでしょうか? 現に、あなただって私がVBAを使えることは知らなかったはずなのだから。 知らない人が質問するのだから、どうせ教えても無駄みたいな言い方は、とても気分が悪いですよ。知恵を貸していただけるのはとてもありがたいことです。だからぜひ嫌みなしに今回のように丁寧に教えてくだされば、ベストアンサーになると思いますし、心がけてくだされば幸いだと思います。
- tsubu-yuki
- ベストアンサー率46% (179/386)
msMikeさん、横入りで申し訳ないです。 > No.1 へのコメント > B列の作業セルを使わずに導く 出来ないとは言いませんが、「より」難しくなりますよ。 例えば If Target.Address <> "$D$7" Then Exit Sub myTxt = "" For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row If WorksheetFunction.CountIf(Range("A1", "A" & i), Range("A" & i)) = 1 Then If myTxt <> "" Then myTxt = myTxt & "," myTxt = myTxt & Range("A" & i) End If Next With Target.Validation .Delete .Add Type:=xlValidateList, _ AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, _ Formula1:=myTxt End With SendKeys "%{Down}" やっつけですが、例えばこんな感じのものを セレクションチェンジイベントに仕込んでやればOKです。
お礼
数式でできないのならVBAでもと考えてはいましたが、いろんなブックで使うのならリスクは高そうですね… お知恵を貸してくださりありがとうございました?
- msMike
- ベストアンサー率20% (364/1804)
[No.1お礼]へのコメント、 》 …ことができればと考えていますが…難しいでしょうか。 さぁ~、私にはアレが精いっぱいです。
お礼
難しそうですね…私なりにも考えてはみましたが… VBAを使う方法も考えていましたが、作業列が1列ですむならお答えいただいた回答例を採用するのが1番よいと思いました。ありがとうございました!
お礼
回答ありがとうございます! なるほどそのような手があるのですね。 欲を言えば、B列の作業セルを使わずに導くことができればと考えていますが…難しいでしょうか。