• ベストアンサー

簡易リストボックス

http://okwave.jp/qa/q8161154.html で質問したものです。 行で分けたのですが、は行が200近くあり、行数だけでは難しいとおもい、 VBAでやる頭2文字でリストが表示できるようにしたいとおもいます。 いろいろと調べたのですが、 http://www.max.hi-ho.ne.jp/happy/YNxv98314.html が参考になるかとおもったのですが、VBAは全然わかりません。 頭文字を頭2文字に変更して教えていただけますでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんばんは! 一案です。 ↓の画像で説明します。 左側がSheet1でリスト表示させたいSheet 右側がSheet2でリストデータがあるSheetだとします。 Sheet1のA列にリスト候補を絞ってリスト設定させるとし、 Sheet2のA列にすべてのリストデータがあり、 Sheet1のA列のリストとして表示させたいデータだけをSheet2のC列に表示させます。 まず Alt+F11キー → メニュー → 挿入 → 標準モジュール → VBE画面に ↓のコードをコピー&ペーストしておいてください。 Sub リスト() 'この行から Dim i As Long, cnt As Long, wS1 As Worksheet, wS2 As Worksheet Set wS1 = Worksheets("Sheet1") '←Sheet1は実際のSheet名に! Set wS2 = Worksheets("Sheet2") '←Sheet2も実際のSheet名に! i = wS2.Cells(Rows.Count, "C").End(xlUp).Row Application.ScreenUpdating = False If i > 1 Then Range(wS2.Cells(2, "C"), wS2.Cells(i, "C")).ClearContents End If cnt = 1 If Selection.Column = 1 And Selection.Count = 1 Then For i = 2 To wS2.Cells(Rows.Count, "A").End(xlUp).Row If wS2.Cells(i, "A") Like Selection & "*" Then cnt = cnt + 1 wS2.Cells(cnt, "C") = wS2.Cells(i, "A") End If Next i Application.ScreenUpdating = True End If End Sub 'この行まで つぎに画面左下のSheet1にSheet見出し上で右クリック → コードの表示 → VBE画面に ↓のコードをコピー&ペースト Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'この行から If Target.Column = 1 And Target.Count = 1 Then Call リスト End If End Sub 'この行まで 最後にSheet1のA列のリスト表示させたいセルを範囲指定 → データ → データの入力規則 → 元の値の欄に =OFFSET(Sheet2!C$1,1,,COUNTA(Sheet2!C:C)-1) という数式を入れます 同じ画面で「エラーメッセージ」タブ → 「無効なデータが入力されたら・・・」のチェックを外しておきます。 以上で完了です。 ※ Excel2010以降ではこの数式が使用できますが、 Excel2007までのバージョンだと数式で別Sheetを指定できないかもしれません。 その場合はSheet2のC列を適当に範囲指定 → 「名前定義」しておき → 元の値の欄に =「名前定義した名前」 とします。 この場合、行数が指定できませんので多目に範囲指定しなくてはなりません。 尚、オートコンプリート機能のようなものではありませんので、 Sheet1のA列に1文字以上を入力 → Enter → 先ほどのセルに戻る という操作が必要です。 参考になりますかね?m(_ _)m

kenken008
質問者

お礼

ありがとうございます。無事にやることができました。 あとは、これを実際のデーターで試してみます。 本当にありがとうございました^^

kenken008
質問者

補足

おはようございます。 さっそくやってみました。 http://uploda.cc/img/img51db294013a87.jpg http://uploda.cc/img/img51db2975dcb25.jpg のようにやってみたのですが、データの入力規則のところがダメなのか、 sheet1のA列がリスト化してくれません。 どこかおかしいとこありますでしょうか? エクセルは2013です。

その他の回答 (4)

回答No.5

「簡易リストボックス」とかいうものをリストの機能で作られたいそうなので、作業列をたくさん使ったらどれだけ数式が易しくなるか試してみましたが、それほど易しくもなりませんでした。リストから選ぶユーザーにとっては簡易だとしても、それを構築するのはまた話が別なのですね。 J3 セルに入力する文字数は、何文字でも構いません。ただ平仮名か片仮名か、振り仮名の設定に合った種類の文字を J3 に入力しないと、機能しません。 Sheet1 B5 =phonetic(b5) D5 =left(c5,len(sheet2!J$3)) E5 =(d5=sheet2!J$3)*(n(e4)+1) F5 =e5+9999*(e5=0) G5 =row(g5)*(e5=min(F$5:F$14)) H5 =row(h5)*(e5=max(E$5:E$14)) Sheet2 J3 ゆうき 「名前の定義」の「参照範囲」ボックス =offset(sheet1!b5,max(sheet1!g5:g14)-row(sheet1!b5),0,max(sheet1!H5:H14)-max(sheet1!g5:g14)+1) L3の入力規則 リストの「元の値」ボックス =絞り込み範囲  ……上で「絞り込み範囲」という名前を付けた場合 ところで、は行だけで 200 近い入力候補があるということは、全体では 1,000 にも迫る個数でしょうか?よかったら、後学のために、それほど大量なリストを使うニーズというのはどんな状況なのか、差し支えない範囲で教えていただけませんか?

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

No.2です! 補足の件ですが・・・ サイトの画像を拝見するとExcel2013をお使いのようですので、 リストの数式もそのまま利用できるみたいですね! 「データの入力規則」のダイアログ画面を見ると 「入力値の種類」が「ユーザー設定」になっていますね! 「リスト」を選択して、数式欄をそのままの数式でちゃんと動作すると思います。 ※ 前回も書きましたが、その画面の「エラーメッセージ」タブで 「無効なデータが入力されたら・・・」のチェックを外すのを忘れないでください。m(_ _)m

kenken008
質問者

お礼

ありがとうございます。無事にやることができました。 あとは、これを実際のデーターで試してみます。 本当にありがとうございました^^

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.3

VBAにこだわっていらっしゃるようですが・・ 一般機能だけでもできますよ。 > VBAは全然わかりません。 とのことですから、一応提案しておきます。 添付図に沿って話を進めます(実際の構成に従って適宜変更ください)。 まず準備として、 A列に「実際のリスト(全部の一覧)」を置いておきます。 「頭文字として認識させるための文字」をG1セルに入力するものとし、 絞り込まれた「入力規則によるリスト」を入力するセルをG3セルに置いてあります。 (G2セルはオマケで、絞り込まれた件数が入っています。) B列に作業列を作ります。 B1セルに   =IF(IFERROR(FIND($G$1,A1,1)=1,0),ROW(),"")   ※2003以前なら     =IF(ISERROR(FIND($G$1,A1,1)),"",IF(FIND($G$1,A1,1)=1,ROW(),"")) として、行方向にフィルします。 ザックリと「G1セルの文字から始まるものに番号を振る」列です。 D列も作業列です。 D1セルに   =IF(COUNT(B:B)<ROW(A1),"",INDEX(A:A,SMALL(B:B,ROW(A1)))) として、行方向にフィルします。 要するに、B列に番号が振られた行のA列を返してきます。 これで、抽出された(絞り込まれた)リストは完成です。 次に、動的な名前を付け、入力規則にリストとして反映させる準備です。 2007以降の場合、リボンの数式タブ⇒名前の定義⇒名前の定義 2003以前なら、挿入メニュー⇒名前⇒定義 で名前の定義ダイアログを出し、   名前:絞込リスト    (任意。なんでも良いです。)   参照範囲:=OFFSET(Sheet1!$D$1,0,0,COUNTIF(Sheet1!$D:$D,">"""""),1) とし、OKで終了します。 最後。 入力規則を設定します。ダイアログを出す手順はお分かりのようなので割愛。   入力値の種類:リスト      元の値:=絞込リスト     (先ほどつけた「名前」) として、OKで終了します。 オマケとして、(必要なら)いくつまで絞り込まれたか表示するためにG2セルに   =COUNTIF($D:$D,">""""") として、終了です。 ちなみに、図では「頭二文字」としていますが、 実際には1文字だろうが3文字だろうが10文字だろうが絞り込めます。 リストの範囲を「定義済みの名前」にしていますので リスト・絞込リストが別シートにあっても対応できます。 わからないVBAコードをわからないまま使うと、 あとで変更(リストを列が変わってみたり)が入った時に痛い目に合います。 とりあえず、参考までに。

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.1

一例です。 仮に D列にデータがあいくえお順にあるとします。 A2 セルに はあ とか絞り込み値を入れます。 C列に =IF(ROW(A1)>COUNTIF(D:D,A$2&"*"),"",INDEX(D:D,MATCH(A$2,D:D,1)+ROW(A1)-1)) と入れてたっぷりと下までコピーします。 C列に A2で指定した 文字で始まるデータが表示されますので このC列を、入力規則のリストの範囲に指定します。 別案ですが データに見出しの文字を追加しておきます。 あ 味 雨 か 紙 ・・・ は 歯 はか 墓 ・・・ とかにします。 入力規則のセルに見出しの文字を入れると、指定したところが一番上に くるので、選択が簡単になります。

kenken008
質問者

お礼

ありがとうございます。やってみたのですがあまりうまくいきませんでした。 申し訳ございません。

関連するQ&A

  • [Access2003]コンボボックスのプロパティの「リスト行数:8」について

    昨日、リスト行数について分からなくて質問しました。アドレスは、http://okwave.jp/qa4858817.htmlです。リスト行数が8以下だとそのまま表示されるということは、理解できました。 質問1:http://okwave.jp/qa4858817.htmlで質問したことなんですが、参考書(下記のコンボボックスは、著作権の関係もあり、商品名の名前は変えてあります)を見たら・・・・ コンボボックス: A みかん B メロン C パイナップル D なし 回答してくださった方のアドバイスを見ると、【リスト行数が8以下だとそのまま表示される】のであれば、上記の場合、「リスト行数:4」ではないかなと思いました。参考書の「リスト行数:8」が間違っていて、「リスト行数:4」が正解かなと思いましたが、この場合、4が正しいのでしょうか? 質問2:回答してくださった方のアドバイスを見ると、「リスト行数:8」と表示される場合、8行のみが表示され、超える部分はスクロールすると教えてくださいました。(パソコン教室では、Access2003の勉強をしていますが、家庭の事情により、Access2003のソフトは、持っていないのでよく分からないです。) たぶんですが、リスト行数が8行以上の場合は、コンボボックスの横にスクロールバーが表示されてスクロールバーを使用して、リストを移動させながら関係ある商品名などを選択して入力するというイメージがあるのですが…..。 「リスト行数:8」と表示される場合、8行のみが表示され、超える部分はスクロールするということについて具体的に教えてもらえないでしょうか?

  • リストボックス内の重複したものを削除

    初心者です。 リストボックス内で A--- B--- C--- D--- E--- B--- F--- C--- という行数で表示しているものを onclickで重複しているBとCとの行数を消したいのですが どうすればいいのでしょうか? 消すものは6、8行目のBとCです。 実際は行がもっと多いので for文で上から見て消していくというようにしたいです。 困ってます。よろしくお願いします。

  • 簡易リストボックス

    以前 http://okwave.jp/qa/q8166399.html で質問したものですが、No2の回答を参考にさせていただいております。 No2で教えていただいたコードをひらがなで入力してもカタカナとひらがなの両方が ヒットするようにすることは可能なのでしょうか?

  • テキストボックスとボタンで行を増やす方法

    はじめまして。Excel.2003.2007.2013を使用しています。 どの環境でも使えるVBA、マクロ等ありましたらよろしくお願いします。 職場で添付画像のようなリストを作成しています。 リスト数が増える度にA~Mを選択しオートフィルで行を増やしてるのですが 選択したセル(又は行)から下の行をテキストボックス(セルでも構いません)で行数を指定し OKボタンで生成することは出来ないでしょうか? 希望のイメージとしては、図1の選択している10行目から下を、図2のようにテキストボックスとボタンを使用してリストを追加です。 次にまた追加する時はA18又は行をテキストボックスとOKボタンで追加。こんな感じです。 ※実際にはA~Mより広範囲で256行追加。324行追加。決まりのない数字での追加作業です。 もしもA列の名称 B列の数(+1加算) F.G列等もテキストボックス等で入力を指定できて 上記と同じように行数をを指定して生成できれば嬉しいです。 説明不足でしたら申し訳ありません。 よろしくお願いします

  • 結合されたセルをプルダウンのリストにする方法は?

    先日は以下の質問でお世話になりました。 http://okwave.jp/qa/q8846917.html さっそく作業に取り掛かったのですが、以下の画像のように結合されたセルをプルダウンのリストにしようとすると"リストの元の値は、区切り文字で区切られたリストか、または単一の行または列の参照でなければなりません。"と表示されてしまい、エラーとなってしまいます。 つまり、結合されたセルをプルダウンのリストにすることは出来ないのでしょうか? 面倒な質問かとは思いますが、どうぞ宜しくお願い致します。

  • リストボックスの値取得方法について

    VBAでリストボックスを使用しています。リストボックスの中には、A,B,C,D,Eと表示されています(カンマは行とします。 つまりリストボックスには5行表示されています)。選択はされていない状態です。この状態でボタンを押すことにより ループで各行の値を取得したいと思っています。listcountを利用してlistcountの数までループをまわし、各行の値を 取得したいです。値というのは、A,B,C,D,Eです。この値を配列なり変数なりにいれたいのです。 どのリストボックスのプロパティを利用すれば、選択されていないリストボックスの各値を取得することができるでしょうか?

  • メーリングリストについて

    無料のメーリングリストを探しています。ただし http://okwave.jp/qa/q3851466.html このような問題を目にして懸念しております。 大丈夫でしょうか? よろしくお願いします。

  • リストボックスについてです。

    リストボックスについてです。 B列をダブルクリックするとリストボックスが立ち上がり、データを選択してB列に表示できるように設定されていますが、困った現象が起こっています。 例えば、sheet1のB10にダブルクリックでリストボックスを表示し、そこから「あいうえお」という名前を表示させて、sheer1編集が終わったとします。 次のsheet2でB1をダブルクリックしているのに、sheet2のB10に勝手に「あいうえお」と表示されてしまいます。 コードは以下になってます。 VBA初心者なのでエクセルのサイト等からコピペ等して作ったコードです。 どこかおかしな箇所があると思うのですが、何処がおかしいのかがわかりません。 お分かりになる方、教えていただければ助かります。 ' ◆Worksheetのコード◆ '---------------------------------------------------- '選択範囲を変更したときに実行される Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) UserForm1.ListBox1.RowSource = "データ!A1:A100"  '表示するデータ範囲 UserForm1.ListBox1.Font.Size = 12    'フォントサイズ If Target.Column = 2 Then 'B列なら 行 = Target.Row '行番号を取得する UserForm1.Show 'ユーザーフォームを表示する End If End Sub '=================================================================================== ' ◆UserForm1のコード◆ '-------------------------------------------------------------------------- Private Sub ListBox1_Click() 'クリックされたときに実行される If 行 <> 1 Then '1行目でなければ Cells(行, 2) = ListBox1.Value 'リストボックスの値をセルにセットする End If UserForm1.Hide 'ユーザーフォームを非表示にする End Sub Private Sub UserForm_Deactivate() '非アクティブになったときに実行される Unload Me 'ユーザーフォームをメモリから削除する End Sub '========================================================================================= '============================== ' ◆標準モジュールのコード◆ Option Explicit Public 行 As Variant '行番号 Sub auto_open() Load UserForm1 'ユーザーフォームをメモリに読み込む End Sub '==============================

  • VBAで行を分割し、隣の列にコピペしていく方法

    よろしくお願いします。 三列・数十万行のデータがあります。一列目は1~N(数千程度)の整数が繰り返し現れます。二・三列目は文字・数値です。全体の行数はNの整数倍になっています。以下のような感じです。 1 A 3 2 C 27 3 J 0.8 ... 2048 L 11 1 K 77 2 B 0 ... 2048 G 99 1 H 10.3 2 Q 62 ... 2048 D 8 このデータを、N行毎に分割し、四列目以降に張り付けたいです。以下のように…。 1 A 3 1 K 77 1 H 10.3 2 C 27 2 B 0 2 Q 62 3 J 0.8 ... ... ... 2048 L 11 2048 G 99 2048 D 8 このような操作をVBAでできないでしょうか。 下記リンクなどを参照したのですが、VBAについて知識がないため、所望の機能を得られていません。 http://okwave.jp/qa/q6342761.html 教えて頂けないでしょうか。よろしくお願いします。

  • 行き詰まりましたυ

    再投稿ですみません。 CListCtrl クラス //m_xcList はCListCtrl型のDDX変数 リストコントロールの一部のフォント情報を取得したいです。 void CMylistCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){~~~} DrawItem(↑)の中で、描画すると同時に、太文字・赤色情報を、 リストコンロールの各行の最後のカラムを退避用フィールド(セル)として使用し、 文字で「BOLD」「RED」「BOLD,RED」「」のように入れれば、何とか作れそうです。 全然スマートじゃないですよね。 この方法であれば、任意のタイミングでフォント情報を取ることはできそうですが… またはDrawItemを実行させるために、ダミーの行を1行挿入、その後削除して、 エクスポートする事も考えています。 (データに変更があった場合、必ず呼び出されるから、無意味かもしれないですけど) 処理速度は遅くなると思いますし、僕には、これしかできませんが、 もっと、方法があるはずですよね… それかlParamを割り振って、何とかするほうがいいですかね。 投稿してからずっと 「リストコントロールのフォント情報取得 VC++ MFC -VB -.Net "LogFont"」 「FW_BOLD FONT VC++ LOGFONT取得」「CFont::CreatePointFont」などで、 検索したのですが、キーワードさえつかめずに、困りました(/_;) 教えてGOOで参考になりそうなのが、3つ↓ ■リストの行ごとの設定変更について http://okwave.jp/qa/q4165655.html ■リストコントロール内の文字の大きさ(ポイント数を)別々にしたい。 http://okwave.jp/qa/q5746038.html ■リストボックスのフォントをサイズを変更したい http://qanda.rakuten.ne.jp/qa4479812.html?order=DESC&by=datetime    せめてキーワードかヒントだけでも…助けて下さい!

専門家に質問してみよう