Excelシート(Sheet1)にComboBox1とComboBox2とComboBox3を配置しています。
Sheet1のA列とB列とC列に下記のように「分類」「品目」「生産地」一覧が入力されています。
A B C
1 分類 品目 生産地
2 やさい キャベツ 千葉
3 くだもの もも 山梨
4 やさい キャベツ 茨城
5 やさい じゃがいも 北海道
6 くだもの みかん 愛媛
ファイルOPEN時に「分類」「品目」「生産地」をそれぞれComboBoxに重複を除いて表示しています。
たとえば、ComboBox1の「分類」で”やさい”を選択されたら、ComboBox2の「品目」は、
重複を除いた”キャベツ”と”じゃがいも”が表示されるようにしたいのですが、どうしたらよいのでしょうか。
下記まではできたのですが、”キャベツ””キャベツ””じゃがいも”と重複データがそのまま表示されてしまいます。
ご教授下さい。
Private Sub ComboBox1_Change()
Dim c, first As String
ComboBox2.Clear
With Worksheets("Sheet1").Range("A2:A30")
Set c = .Find(Me.ComboBox1.Text, LookIn := xlValues)
If Net c Is Nothing Then
first = c.Row
Do
ComboBox2.AddItem Worksheets("Sheet1").Cells(c.Row,2).Value
Set c = .Find Next(c)
Loop While Not c Is Nothing And c.Row <> first
End If
End With
End Sub
No.2ベストアンサー
- 回答日時:
参考に
Private Sub ComboBox1_Change()
Dim myDic As Object
Dim c As Range
Set myDic = CreateObject("Scripting.Dictionary")
With Worksheets("Sheet1")
For Each c In .Range("A2", .Cells(Rows.Count, "A").End(xlUp))
If ComboBox1.Value = c.Value Then myDic(c.Offset(, 1).Value) = Empty
Next
End With
Me.ComboBox2.List = myDic.Keys
Set myDic = Nothing
End Sub
No.3
- 回答日時:
Do
ComboBox2.AddItem Worksheets("Sheet1").Cells(c.Row,2).Value
Set c = .Find Next(c)
Loop While Not c Is Nothing And c.Row <> first
の部分でコンボボックスにすでに格納されているデータとの重複を調べて
重複していなければセットしなければいい
ただ、コンボボックスにすでに格納されているデータと比較するのは処理が重たくなるので
コンボボックスにセットしてある値を配列にもってセットするのが無難、
また、worksheets().cells().valueも同じく変数に一回格納して利用するのが無難と思います。
ということで例です。(上記の部分に関するところについてのみ記載しています。)
dim flag as string '"Find" または "NotFind"
dim wkStr as string 'シート上の値を一時格納
dim setItemData()
redim setItemData(0)
dim ix1 as single
Do
wkstr =Worksheets("Sheet1").Cells(c.Row,2).Value
flag = "Not Find" '最初(見つからなかったらこの値)
for ix1 = 1 to ubound(setItemData)
if setItemData(ix1) = wkstr then
flag = "Find" '見つかったとき
exit for
end if
next
if flag = "Not Find" then
ComboBox2.AddItem wkstr
redim preserve setItemData(ubound(setItemData) + 1) '配列を1個ふやす
setItemData(ubound(setItemData)) = wkst '配列の最大番号のところ(=今増やしたところ)に値を入れる。
end if
Set c = .Find Next(c)
Loop While Not c Is Nothing And c.Row <> first
No.1
- 回答日時:
ちょっと情報が少ないので明確な回答は控えさせていただきますが。
回答するうえで下記情報があると回答しやすいなと思える点です。
1.それぞれの項目にデータが存在しますよね?例えば生産地の項目であれば都道府県の一覧が存在するのかいないか、分類で例えるなら「やさい、くだもの」が現在データとして存在しますが 肉、穀物などほかのカテゴリが存在するのかどうか。それは、マスタとして存在するものかどうか。
2.もし存在しないのであれば動的に分類等が増えるのかどうか
3.コンボボックスを配置されているとのことですがデータの入力規則を使うコンボボックスで代用できないのかどうか例えば入力規則内(リスト)で利用できるINDIRECT関数と「範囲に名前を付ける」とか。
2、3どちらにせよマスタを用意してコンボボックスはマスタデータを参照する方がスマートに感じます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
array関数で格納した配列の型を...
-
Excelのセルの色指定をVBAから...
-
ExcelのINDEXとMATCH関数でスピ...
-
表にフィルターをかけ、絞った...
-
[エクセル]連続する指定範囲か...
-
DataSetから、DataTableを取得...
-
読み込みで一行おきに配列に格納
-
仮想リストコントロールの表示
-
エクセル 条件を指定した標準...
-
iniファイルのキーと値を取得す...
-
Excelで配列数式を使わずにとび...
-
エクセルで、絶対値の平均を算...
-
[VBA]改行入りのセルの値を配列...
-
.NET - 配列変数を省略可能の引...
-
pictureboxの表示について
-
Split関数でLong配列に格納する...
-
【VBScript】Dictionaryの項目(...
-
EXCEL VBA 2次元配列に格納さ...
-
Excel オートフィルタのリスト...
-
VBA-読み込んだテキストフ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
[エクセル]連続する指定範囲か...
-
Excelのセルの色指定をVBAから...
-
array関数で格納した配列の型を...
-
ExcelのINDEXとMATCH関数でスピ...
-
エクセルで、絶対値の平均を算...
-
表にフィルターをかけ、絞った...
-
配列がとびとびである場合の書き方
-
DataSetから、DataTableを取得...
-
読み込みで一行おきに配列に格納
-
VBA 配列に格納した値の平均の...
-
Excel オートフィルタのリスト...
-
Datatableへの代入
-
SUMPRODUCT関数を用いた最小値
-
【VBA】ユーザーフォーム リス...
-
.NET - 配列変数を省略可能の引...
-
Excel VBA 配列の分割について
-
VB6.0 ファイルの一括読込み
-
スプレットシートのGetTextにつ...
-
iniファイルのキーと値を取得す...
-
INDEX(D:D,L3)の意味は?
おすすめ情報