Excel VBA質問箱 IV

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

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


2364 / 13646 ツリー ←次へ | 前へ→

【68460】ComboBoxに同じ値を入れない Zenji 11/3/9(水) 11:06 質問[未読]
【68461】Re:ComboBoxに同じ値を入れない kanabun 11/3/9(水) 11:16 発言[未読]
【68462】Re:ComboBoxに同じ値を入れない Zenji 11/3/9(水) 11:36 質問[未読]
【68465】Re:ComboBoxに同じ値を入れない kanabun 11/3/9(水) 12:06 発言[未読]
【68467】Re:ComboBoxに同じ値を入れない Zenji 11/3/9(水) 12:39 質問[未読]
【68468】Re:ComboBoxに同じ値を入れない kanabun 11/3/9(水) 12:57 発言[未読]
【68476】Re:ComboBoxに同じ値を入れない kanabun 11/3/9(水) 17:00 発言[未読]
【68482】Re:ComboBoxに同じ値を入れない Zenji 11/3/9(水) 23:21 お礼[未読]
【68484】Re:ComboBoxに同じ値を入れない teian 11/3/9(水) 23:43 発言[未読]

【68460】ComboBoxに同じ値を入れない
質問  Zenji  - 11/3/9(水) 11:06 -

引用なし
パスワード
   ComboBoxに書く値を以下のようにコードを作成しました
この時読込む値が同じであればComboBoxに入れないようにしたい
のですが
ちなみに列の値は別途作成された表から取得しています

  Set Ws = Workbooks(F_Name).Worksheets(Sheet1)
  Ws.Activate
  With Worksheets(Sheet1)
    'LastRow=Noが書かれている最下行
   LastLow = .Range("B7").CurrentRegion.Rows.Count
   列 = 3
   For i = 7 To LastLow
    If Worksheets(Sheet1).Cells(i, 2) <> "No" _
            And Worksheets(Sheet1).Cells(i, 2) <> "" Then
      For j = 2 To 9
       If Ws.Cells(i, 列) <> "" Then
        UserForm1.Controls("ComboBox" & j).AddItem .Cells(i, 列)
       End If
       列 = 列 + 1
      Next j
    End If
    列 = 3
   Next i
  End With

【68461】Re:ComboBoxに同じ値を入れない
発言  kanabun  - 11/3/9(水) 11:16 -

引用なし
パスワード
   ▼Zenji さん: こんにちは〜

> 以下のようにコードを作成しました

回答でなくてすみませんが、
このコードはどこに書かれていますか?
 UserFormモジュール?
 標準モジュール?
 シートモジュール?

変数F_Name はどこで値を代入されてますか?
変数Sheet1 は Sheet1オブジェクトというのがあるから、まずいのでは?

【68462】Re:ComboBoxに同じ値を入れない
質問  Zenji  - 11/3/9(水) 11:36 -

引用なし
パスワード
   ▼kanabun さん:
>▼Zenji さん: こんにちは〜
>
>> 以下のようにコードを作成しました
>
>回答でなくてすみませんが、
>このコードはどこに書かれていますか?
> 標準モジュール?

  標準モジュールに書いています
>変数F_Name はどこで値を代入されてますか?
  F_Name="集計表.xls" としています
>変数Sheet1 は Sheet1オブジェクトというのがあるから、まずいのでは?
  すいませんでした Sheet1は変数ではなく シート名でした
  よろしくお願いします
  Set Ws = Workbooks(F_Name).Worksheets("Sheet1")
  Ws.Activate
  With Worksheets("Sheet1")
    'LastRow=Noが書かれている最下行
   LastLow = .Range("B7").CurrentRegion.Rows.Count
   列 = 3
   For i = 7 To LastLow
    If Worksheets("Sheet1").Cells(i, 2) <> "No" _
            And Worksheets("Sheet1").Cells(i, 2) <> "" Then
      For j = 2 To 9
       If Ws.Cells(i, 列) <> "" Then
        UserForm1.Controls("ComboBox" & j).AddItem .Cells(i, 列)
       End If
       列 = 列 + 1
      Next j
    End If
    列 = 3
   Next i
  End With

【68465】Re:ComboBoxに同じ値を入れない
発言  kanabun  - 11/3/9(水) 12:06 -

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

>>このコードはどこに書かれていますか?
>
>  標準モジュールに書いています
標準モジュールですか??
私はまた、UserForm1のボタンを押すと一連の処理を実行するのかと
想像してました。

UserForm1がすでに開いている前提で、

'----------------------- 標準モジュール
Option Explicit
Sub ComboBox_Setting()
 Dim Ws As Worksheet
 Dim i As Long, j As Long
 Dim LastRow As Long
 Dim v As Variant, ss As String
 Dim dic(2 To 9) As Object
 For i = 2 To 9
  Set dic(i) = CreateObject("Scripting.Dictionary")
 Next
 
 Set Ws = ActiveWorkbook.Worksheets("Sheet1")
 'LastRow=Noが書かれている最下行
 LastRow = Ws.Range("B7").CurrentRegion.Rows.Count
 For i = 7 To LastRow
  v = Ws.Cells(i, 2).Value
  If Not IsEmpty(v) Then
   If v <> "No" Then
    For j = 3 To 10
     ss = Ws.Cells(i, j).Value
     If Len(ss) > 0 Then
      dic(j - 1)(ss) = Empty
     End If
    Next j
   End If
  End If
 Next i
 For i = 2 To 9
   UserForm1.Controls("ComboBox" & i).List = dic(i).Keys()
 Next
 Erase dic

End Sub
'-------------------
とすると、ComboBox2〜ComboBox9 にリストが作成されます。
つまり、このばあい、最初 ComboBoxにはアイテムが一つもない状態を
仮定しています。

そうではなく、
すでにComboBoxどもに、アイテムがAddItem されていて、
そこに Sheet1 からアイテムを追加したい(重複せずに)ということであれば、
別の方法を(ちょっと思いつきませんが)考える必要があります。

この点(新規リスト作成か/すでにあるリストに追加か)をご確認ください。

【68467】Re:ComboBoxに同じ値を入れない
質問  Zenji  - 11/3/9(水) 12:39 -

引用なし
パスワード
   ▼kanabun さん:
ありがとうございました

>すでにComboBoxどもに、アイテムがAddItem されていて、
>そこに Sheet1 からアイテムを追加したい(重複せずに)ということであれば、
 Sheet1 からアイテムを追加したい(重複せずに)のです
 追加した後重複したアイテムを削除する などの方法は
 あるのでしょうか
 また
 ( 新規リスト作成か/すでにあるリストに追加か)の確認は
 どのようにするのでしょうか
すいません よろしくお願いいたします

【68468】Re:ComboBoxに同じ値を入れない
発言  kanabun  - 11/3/9(水) 12:57 -

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

>>すでにComboBoxどもに、アイテムがAddItem されていて、
>>そこに Sheet1 からアイテムを追加したい(重複せずに)ということであれば、
> Sheet1 からアイテムを追加したい(重複せずに)のです
良いアイデアが浮かばないので、先ほどのDictioanryを使った
方法の応用です。
今度は、すでにComboBoxたちにリストがあるということなので、
はじめにDictionaryに 各ComboBoxのリストを格納しておき、
追加したいセルの文字列が Dictionaryになかったら、
ComboBox.AddItem する、というふうに使います。


'-------------------------------- 標準モジュール(追加プロシージャ)
Sub ComboBox_AddItem()
 Dim Ws As Worksheet
 Dim i As Long, j As Long
 Dim LastRow As Long
 Dim v As Variant, ss As String
 Dim dic(2 To 9) As Object
 
 '現在の各ComboBoxのリストをDictioanryに記憶
 For i = 2 To 9
  Set dic(i) = CreateObject("Scripting.Dictionary")
  With UserForm1.Controls("ComboBox" & i)
    For j = 0 To .ListCount - 1
      dic(i)(.List(j)) = Empty
    Next
  End With
 Next
 
 Set Ws = ActiveWorkbook.Worksheets("Sheet1")
 LastRow = Ws.Range("B7").CurrentRegion.Rows.Count
 For i = 7 To LastRow
  v = Ws.Cells(i, 2).Value
  If Not IsEmpty(v) Then
   If v <> "No" Then
    For j = 3 To 10
     ss = Ws.Cells(i, j).Value
     If Not dic(j - 1).Exists(ss) Then
       UserForm1.Controls("ComboBox" & j - 1) _
         .AddItem ss
     End If
    Next j
   End If
  End If
 Next i
 Erase dic

End Sub

【68476】Re:ComboBoxに同じ値を入れない
発言  kanabun  - 11/3/9(水) 17:00 -

引用なし
パスワード
   すみません。↑のコードに 一行追加させてください

>    For j = 3 To 10
>     ss = Ws.Cells(i, j).Value
>     If Not dic(j - 1).Exists(ss) Then
>       UserForm1.Controls("ComboBox" & j - 1) _
>         .AddItem ss
        dic(j - 1)(ss) = Empty '◆この行 追加
>     End If
>    Next j

【68482】Re:ComboBoxに同じ値を入れない
お礼  Zenji  - 11/3/9(水) 23:21 -

引用なし
パスワード
   ▼kanabun さん:
急遽出かけてしまい
お返事遅くなり申し訳ありません
明日早速実行してみたいと思っています
また、何かありましたら教えてください
ありがとうございました

【68484】Re:ComboBoxに同じ値を入れない
発言  teian  - 11/3/9(水) 23:43 -

引用なし
パスワード
   >>すでにComboBoxどもに、アイテムがAddItem されていて、
>>そこに Sheet1 からアイテムを追加したい(重複せずに)ということであれば、
> Sheet1 からアイテムを追加したい(重複せずに)のです
> 追加した後重複したアイテムを削除する などの方法は
> あるのでしょうか
> また
> ( 新規リスト作成か/すでにあるリストに追加か)の確認は
> どのようにするのでしょうか

ComboboxのValue値にセットしてみて、ListIndex > -1 なら既に設定済みと判断してはどうですか?

例です。

  Dim r As Range, c As Range
  Dim v As Variant
  
  Set r = Sheets("Sheet1").Range("A1").CurrentRegion.Resize(, 1)
  With ComboBox1
    For Each c In r
      v = c.Value
      .Value = v
      If .ListIndex < 0 Then
        .AddItem v
      End If
    Next
    .ListIndex = -1
  End With

(注意)
ただ、ComboboxのChangeイベントが書いている場合には、再帰に注意してください。

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