おすすめのモーニング・朝食メニューを教えて!

エクセル2003と2007VBAで使用します。
ユーザーフォーム、添付画像項目「氏名」をコンボボックスで重複せず選択リストを表示させるにはどのように記述したら良いでしょうか? 宜しく御願いします。

「ユーザーフォーム、コンボボックスで重複せ」の質問画像

A 回答 (5件)

こんばんは。



VBAのコードを求めていらっしゃるのなら、回答者側としては、
ComboBox のList に、どこのシートからどのように重複を許してImport するコードを見せてほしいと言っているわけですね。最近、コードは見せられない、だから文章の説明的な質問の人が増えてきたと思うのです。画像添付でも、相手に伝えられる情報ではないです。
#3/#4さんの話も、#1/#2さんの話も熱心に正答をいただいているのに、解決に向かわないのは、残念です。

>シートにリストを予め用意しておくと膨大なリストからたくさんスクロールしてから選択するようにになってしまう為
2007のコマンドで、重複を排除する方法もありますし、両方なら関数で解く方法もあります。ComboBox に入れる以上は、千件以上のものを入れるというのは常識的にありえません。

それに、掲示板の回答は、必ずしも、コピー&ペーストで動くコードを提供してくれるとは限りません。それだけは心得ておいてください。


'//'UserForm モジュール

Private Sub UserForm_Initialize()
 ComboBox1.List = MakeUniqueList
End Sub

Function MakeUniqueList()
Dim objDic As Object 'New Scripting.Dictionary
Dim i As Long, j As Long
j = 1
Set objDic = CreateObject("Scripting.Dictionary")
With Worksheets("Sheet1")
  '2行目から
  For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
  If Not objDic.Exists(.Cells(i, 1).Value) Then
    objDic.Add .Cells(i, 1).Value, j
    j = j + 1
  End If
  Next
End With
  MakeUniqueList = objDic.keys
End Function
    • good
    • 1
この回答へのお礼

有難う御座いました。

お礼日時:2017/07/02 09:05

ANo3です



>シートにリストを予め用意しておくと~~選択するようにになってしまう為
>1対になっているsheet1に1行づつレコードが足され累積していった
結局のところ、「シートにあるリスト」を表示する方式なんですよね?
元データとは別に、整理されたリストが用意されているものとして考えるなら・・・

>には重複せず佐藤、鈴木、田中が出るようなコードとしたいです。
実行時に重複を省くのではなくて、そのシートに登録する時(何らかのタイミングで転記をしているのでしょうから)に重複しないようにすれば良いだけではないでしょうか?

・・・っていうことを、ANo3で書いたつもりなんですけど。
    • good
    • 0

こんにちは



コンボボックスの表示内容のリストは、配列を指定したり、AddItemで個々に設定する方法と、シートの範囲をリストとして指定する方法があると思います。

個別に設定する場合は、設定する際に重複を省けば良いでしよう。
シートの範囲等で指定する場合は、重複の存在するリストをそのまま利用するのではなく、一旦、重複を省いたリスト(または配列)を作成して、そちらを参照するようにすれば良いだけではないでしょうか?

項目数が非常に多い場合は、毎回ゼロから重複を省く処理をしていたのでは効率が悪いので、元のリストにアイテムを追加(?)した時に、同時に「重複を省いたリスト」にもバックグラウンドで反映するなどというようにしておくのが良いかもしれません。(重複している場合は追加されない)
とはいっても、コンボボックスでリスト表示する程度の数であれば、それほどの数とも思えませんので、毎回処理したところで大したことはなさそうですね。
    • good
    • 0
この回答へのお礼

フォローの回答有難う御座います。
シートにリストを予め用意しておくと膨大なリストからたくさんスクロールしてから選択するようにになってしまう為1対になっているsheet1に1行づつレコードが足され累積していった「氏名」だけがユーザーフォームの追加入力可能なコンボボックスにリストとして表示させるようにしたいです。
画像の「氏名」は例えば1対になっているsheet1、A列、A1は見出し「氏名」としてA2,佐藤、A3,鈴木、A4,田中、A5,佐藤、A6,鈴木と1行づつレコードとして追加されていきます。
ユーザーフォーム、コンボボックスの選択リストには重複せず佐藤、鈴木、田中が出るようなコードとしたいです。
多分A列をEndxlupでデータを拾ってフィルターして表示させるのかなと思っています宜しく御願いします。

お礼日時:2017/06/27 22:38

#1です。



結局「どこに」「何が」「どのように」の説明がないので何ともいえません。
同じ説明を繰り返してやりたいことを書くばかりでは話が前に進みません。

> 同じ氏名の場合があった時にコンボボックスリストが重複して表示されな
> いように
マスタ情報を持たずに 入力したデータをリストとして利用しようと考えるか
ら上手くいかないのでは? 何故マスタを作るという大事な作業を 省こうと
しているのでしょうか。

Excel2003でも使うなら 重複を省くためには連想配列を使う必要があります。

Excel(エクセル)VBA入門:重複なしのデータを抽出するいろいろな方法
http://www.eurus.dti.ne.jp/yoneyama/Excel/vba/vb …

マスタなしでやるなら 入力の度に 重複なしリストを抽出し直すということに
なるかと思います。
    • good
    • 0

「どこに」「何が」「どのように」がさっぱり分かりません。


そもそも何がどうなってコンボボックスが「重複」しているのですか?
    • good
    • 0
この回答へのお礼

わかりにくくてすいません。
1対になっているsheet1に1行づつレコードが足され累積していきます。
1件のデータを入力する時はユーザーフォームから入力するようにしています。
氏名が行数だけ増えていきますが同じ氏名の場合があった時にコンボボックスリストが重複して表示されないようにしたいと思います。

お礼日時:2017/06/27 12:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A