- ベストアンサー
Comboboxのデータを入れ替えたいが一部残ってしまう
OS:WinXP-Home Office:Excel2000 を使用して、VBAの入力フォームを作成しています 3つのCombobox(オブジェクト名を「Data○」と命名:○には数字が入ります)を使い 1つ目のComboboxが選択されると 2・3個目のComboboxにデータが入るようにしたいのですが 以下のソースで不具合が出ましたのでお知恵を貸してください Private Sub UserForm_Initialize() Data1.AddItem "A" Data1.AddItem "あ" End Sub Private Sub Data1_Change() Dim i As Integer Dim j As Integer For j = 2 To 3 For i = 1 To Controls("Data" & j).ListCount Controls("Data" & j).RemoveItem 0 Next i Next j Select Case Data1.ListIndex Case 0 For j = 2 To 3 Controls("Data" & j).AddItem "A" Controls("Data" & j).AddItem "B" Controls("Data" & j).AddItem "C" Next j Case 1 For j = 2 To 3 Controls("Data" & j).AddItem "あ" Controls("Data" & j).AddItem "い" Controls("Data" & j).AddItem "う" Controls("Data" & j).AddItem "え" Controls("Data" & j).AddItem "お" Next j End Select End Sub これを実行した時に、 例えば2・3個目のComboboxを何も選択していない状態で 1つ目のComboboxを操作すると問題なくデータが開放されて 新たに入ります ですが、例えば 1個目:"あ" 2個目:"え" などの選択された状態で1個目を"A"に変えると 2個目のリストには "お" "A" "B" "C" となるケースがあります(毎回ではありません) Removeitemをする部分で調べてみたところ、うまくいかない時は 内側のiのループで Controls("Data" & j).ListCountの値は正常なのに 実際のループでは選択しているListindexで ループから抜けてしまっていました ソース上では問題ないので、どこを修正したらよいか分かりません よろしくお願いします
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
For j = 2 To 3 'For i = 1 To Controls("Data" & j).ListCount Controls("Data" & j).Clear 'Next i Next j こうしたら?
その他の回答 (2)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 For i = 1 To Controls("Data" & j).ListCount Controls("Data" & j).RemoveItem 0 Next i 要するに、List を削除しても、Valueプロパティは残っているからです。 私なら、以下のように書きますね。 Private Sub Data1_Change() Dim myList1 As Variant Dim myList2 As Variant DATA2.Clear DATA3.Clear myList1 = Array("A", "B", "C") myList2 = Array("あ", "い", "う", "え", "お") Select Case DATA1.ListIndex Case 0 DATA2.List = myList1 DATA3.List = myList1 Case 1 DATA2.List = myList2 DATA3.List = myList2 End Select End Sub
お礼
回答ありがとうございます 私の説明が悪かったようで Comboboxに入る要素は定量的なものではなく、予め準備しておけないデータだったのです ですのでAddItemで毎回必要な要素を入れる事にしていました ただやはりClearを使う事で問題は解消しましたのでアドバイスに感謝します また、 >要するに、List を削除しても、Valueプロパティは残っているからです。 はとても勉強になりました (それでループから抜けてしまうのはまだ理解できていませんが) どうもありがとうございました
- yuu_yuu
- ベストアンサー率41% (34/81)
毎回では無く、たまに発生する現象と言うのが、ふに落ちませんが、 Addする個数が奇数のとき発生しているのではないでしょうか? For i = 1 To Controls("Data" & j).ListCount Controls("Data" & j).RemoveItem 0 Next i このロジックは確実にまずいです。 for文でiをカウントアップしつつ、その中でRemoveしている ListCountをループを抜ける条件にしています。(ListCountも1ずつ減少している) Dim i As Integer Dim j As Integer Dim LCnt As Integer For j = 2 To 3 LCnt=Controls("Data" & j).ListCount For i = 1 To LCnt Controls("Data" & j).RemoveItem 0 Next i Next j ちなにみ、このロジックは動かしてません^^; 正常に動作しなかったら。。。ごめんなさい><
お礼
回答ありがとうございます アドバイスの通り変数をもう一つ作ってやってみましたが 残念ながら症状は同じでした このロジック自体はいくつかのVBAのサイトで使われているものだったので 同じロジックをいくつかの場面で使っているのですが こんなケースは初めてで参りましたが okormazdさんのアドバイスの方で解決しましたので今後はClearを使って行きたいと思います &RemoveItemの使い方をもっと勉強します どうもありがとうございました
お礼
回答ありがとうございます おっしゃるとおりClearを使う事で解決しました どうもありがとうございました