電子書籍の厳選無料作品が豊富!

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で
ループから抜けてしまっていました
ソース上では問題ないので、どこを修正したらよいか分かりません
よろしくお願いします

A 回答 (3件)

For j = 2 To 3


'For i = 1 To Controls("Data" & j).ListCount
Controls("Data" & j).Clear
'Next i
Next j
こうしたら?
    • good
    • 0
この回答へのお礼

回答ありがとうございます
おっしゃるとおりClearを使う事で解決しました
どうもありがとうございました

お礼日時:2008/03/07 14:32

こんにちは。



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
    • good
    • 0
この回答へのお礼

回答ありがとうございます
私の説明が悪かったようで
Comboboxに入る要素は定量的なものではなく、予め準備しておけないデータだったのです
ですのでAddItemで毎回必要な要素を入れる事にしていました
ただやはりClearを使う事で問題は解消しましたのでアドバイスに感謝します

また、
>要するに、List を削除しても、Valueプロパティは残っているからです。
はとても勉強になりました
(それでループから抜けてしまうのはまだ理解できていませんが)

どうもありがとうございました

お礼日時:2008/03/07 14:33

毎回では無く、たまに発生する現象と言うのが、ふに落ちませんが、


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

ちなにみ、このロジックは動かしてません^^;
正常に動作しなかったら。。。ごめんなさい><
    • good
    • 0
この回答へのお礼

回答ありがとうございます
アドバイスの通り変数をもう一つ作ってやってみましたが
残念ながら症状は同じでした
このロジック自体はいくつかのVBAのサイトで使われているものだったので
同じロジックをいくつかの場面で使っているのですが
こんなケースは初めてで参りましたが
okormazdさんのアドバイスの方で解決しましたので今後はClearを使って行きたいと思います
&RemoveItemの使い方をもっと勉強します
どうもありがとうございました

お礼日時:2008/03/07 14:32

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