
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で
ループから抜けてしまっていました
ソース上では問題ないので、どこを修正したらよいか分かりません
よろしくお願いします
No.3
- 回答日時:
こんにちは。
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プロパティは残っているからです。
はとても勉強になりました
(それでループから抜けてしまうのはまだ理解できていませんが)
どうもありがとうございました
No.1
- 回答日時:
毎回では無く、たまに発生する現象と言うのが、ふに落ちませんが、
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の使い方をもっと勉強します
どうもありがとうございました
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Visual Basic(VBA) ListBox1をClickしたときのイベント 5 2022/12/11 19:45
- Visual Basic(VBA) ユーザーフォームに2つのコンボボックス銀行名「ConboBox1」支店名を「ConboBox2」とし 4 2022/08/03 17:34
- Visual Basic(VBA) userformでSheetを選択して開くコード 1 2023/05/15 16:27
- Visual Basic(VBA) 複数シート一括作成後に、特定範囲の数式は値で貼り付けしたい 3 2022/10/07 11:18
- Visual Basic(VBA) リストボックス セルの値を取得する 1 2022/05/21 20:47
- Visual Basic(VBA) ユーザーフォームの表示を追加したい 2 2023/03/26 23:18
- Visual Basic(VBA) リストポックスについて 2 2022/11/05 20:48
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) VBA横データを縦にしたいです 2 2023/08/08 19:38
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UWSCの終了の仕方
-
範囲指定したセルを1つずつ飛...
-
画面を強制的に再描画させる方法
-
Escキーを押すと、中断する時と...
-
CSVファイルの特定の行だけを読...
-
【VBA】全て空白のセルの列の非...
-
VBAでの一時停止と再開の方法
-
vb.netです。2次元配列の要素を...
-
PHPで今日の日付から3日後を表...
-
ガレージバンド のサンプリング...
-
DoEventsが必要な理由について
-
素数の個数を求めるプログラミング
-
Comboboxのデータを入れ替えた...
-
スリザーリンクの問題をランダ...
-
while(*s++=*t++)の判定は?
-
メッセージループを調べすぎてC...
-
データベースをEOFまでループさ...
-
ExcelVBAで、index、match関数...
-
「規格外の太陽光パネルQ CELLS...
-
メビウスループの画像
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UWSCの終了の仕方
-
画面を強制的に再描画させる方法
-
範囲指定したセルを1つずつ飛...
-
Escキーを押すと、中断する時と...
-
vb.netです。2次元配列の要素を...
-
VBA for i=1 to lastrow
-
DOSコマンドのループ内のTIMEコ...
-
CSVファイルの特定の行だけを読...
-
DoEventsが必要な理由について
-
VBAで3秒だけ時間を止めたい
-
VBAでの一時停止と再開の方法
-
エクセルの当番表を作っていま...
-
イベントの発生を待つ
-
UWSCに制限時間を付けたいです
-
UWSCのスクリプトで行き詰って...
-
vb.netからエクセル関数書き込み
-
VBA Dir関数でファイルをループ...
-
Do whileでExitせず、ループの...
-
乱数の桁数指定、または範囲指定。
-
GIFアニメをループさせたくない
おすすめ情報