Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


6181 / 13644 ツリー ←次へ | 前へ→

【46659】ComboBoboxで選択するときに、既にAutofilterをかけた後の状態を表示したい ToShiYo 07/2/9(金) 21:24 質問[未読]
【46660】Re:ComboBoboxで選択するときに、既にAuto... MOON 07/2/9(金) 22:35 回答[未読]
【46666】Re:ComboBoboxで選択するときに、既にAuto... ToShiYo 07/2/10(土) 19:29 お礼[未読]
【46701】Re:ComboBoboxで選択するときに、既にAuto... MOON 07/2/12(月) 19:12 回答[未読]
【46744】Re:ComboBoboxで選択するときに、既にAuto... ToShiYo 07/2/13(火) 19:56 お礼[未読]

【46659】ComboBoboxで選択するときに、既にAutof...
質問  ToShiYo  - 07/2/9(金) 21:24 -

引用なし
パスワード
   ComboBoxで選択するときには既にAutoFilterで絞り込んだものを表示したいのですが・・・やり方が分かりません。どなたかご指導ください。
A    B    C
項目1 項目2 項目3
AAA  100   東京
BBB  110   愛知 
CCC  120   千葉 
AAA  150   長野 
CCC  200   福岡
DDD  500   鹿児島 
この項目1の全ての表示は出ているのですが、絞り込んだ状態で

ComboBoxには
AAA
BBB
CCC
DDD
の4項目だけ表示させたいのですが

Private Sub UserForm_Initialize()
 Dim LASROW As Long
 Dim myDRange As String 
 LASROW = Worksheets("Sheet1").Range("A65536").End(xlUp).Row
 myDRange = "Sheet1!A7:A" & LASROW

' Range("A7:A" & LASROW).AdvancedFilter Action:=xlFilterInPlace, Unique:=True ←この様な操作を付け加え、ComboBoxに反映したいのです。

ListBox1.RowSource = myDRange
If Worksheets("Sheet1").Range("A7").Value = "" Then
  ListBox1.RowSource = ""
End If
End Sub

【46660】Re:ComboBoboxで選択するときに、既にAu...
回答  MOON  - 07/2/9(金) 22:35 -

引用なし
パスワード
   ▼ToShiYo さん:

こんにちは。
色々なやり方がありますが、
自分はこんな感じでやるのが好みです。

フォームモジュール

Option Explicit

Private Sub UserForm_Initialize()
Macro1
End Sub

標準モジュール

Sub Macro1()

Dim dic As Object
Dim i As Long
Dim mykey As String

Set dic = CreateObject("Scripting.Dictionary")
With Sheets("Sheet1")
  For i = 7 To .Cells(.Rows.Count, 1).End(xlUp).Row
    mykey = .Cells(i, 1).Value
    If Not dic.Exists(mykey) Then dic.Add mykey, mykey
  Next
End With

UserForm1.ListBox1.List = dic.Keys
Set dic = Nothing

End Sub

【46666】Re:ComboBoboxで選択するときに、既にAu...
お礼  ToShiYo  - 07/2/10(土) 19:29 -

引用なし
パスワード
   ▼MOON さん:
貴重なご指導有難うございました。素晴らしいコードを頂き、今後参考にさせていただき、活用させていただきます。
また、小生なりに次のようにコードを一部変更して何とかComboBoxに項目行が重複するものを除きました。でもコードそのものが、いまいちダサイです。
何かもう少し美しくする方法がありましたら、小生のコードでご指摘いただければありがたいのですが・・・
Private Sub UserForm_Initialize()
Dim LASROW As Long
Dim myDRange As String

'With ListBox1 '4列を表示したいと思いこのコードを追加しましたが
'  .ColumnCount = 4  '上手くいきませんでした
'  .ColumnWidths = "50;50;50;50"
'End With

LASROW = Worksheets("Sheet1").Range("A65536").End(xlUp).Row
 Range("A7:A" & LASROW).AdvancedFilter Action:=xlFilterInPlace, Unique:=True '重複をなくし

 myDRange = Range(Range("A7"), Range("A7").End(xlDown)).Address'この行を追加しました、何とか重複行が出ないようになりました

 ComboBox1.RowSource = myDRange

If Worksheets("Sheet1").Range("A7").Value = "" Then
 ComboBox1.RowSource = "" 
End If
End Sub

【46701】Re:ComboBoboxで選択するときに、既にAu...
回答  MOON  - 07/2/12(月) 19:12 -

引用なし
パスワード
   ToShiYo さんのコードが、いまいちダサイかどうかは置いといて、

>何とか重複行が出ないようになりました。

とのことですが、ちょっと疑問です。
フィルタをかけた後、
> Range(Range("A7"), Range("A7").End(xlDown))
↑の範囲にたまたま、ユニークなデータだけが残ったのではないでしょうか?
データの並び方によっては、ToShiYo さんのコードでは重複削除はできないように思います。
例えば、

   A
7 項目1
8 AAA
9 BBB
10 CCC
11 DDD
12 AAA
13 BBB
14 CCC

のようなデータなら、OKですが、

   A
7 項目1
8 AAA
9 BBB
10 AAA
11 BBB
12 CCC
13 CCC
14 DDD

のように並んでいれば、NG ではないでしょうか?
どちらもシート上は重複データは表示されていませんが、
フィルタをかけた後の
Range(Range("A7"), Range("A7").End(xlDown))の
中身は、違っていると思います。
通常は、
.Range("A7:A" & LASROW).AdvancedFilter _
Action:=xlFilterCopy, CopyToRange:=objRange, Unique:=True
のようにして、別な場所にコピーした範囲をRowSourceに
設定するように思います。


>'With ListBox1 '4列を表示したいと思いこのコードを追加しましたが
>'  .ColumnCount = 4  '上手くいきませんでした
>'  .ColumnWidths = "50;50;50;50"
>'End With

に関してですが、ちゃんと4列分のデータを
RowSource または List に設定してやれば、
コンボボックスに4列表示されると思いますよ。

【46744】Re:ComboBoboxで選択するときに、既にAu...
お礼  ToShiYo  - 07/2/13(火) 19:56 -

引用なし
パスワード
   ▼MOON さん:

親切な解答有難うございました。
参考にさせていただいています。
これからもよろしくお願いします。

6181 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free