• ベストアンサー

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

質問者が選んだベストアンサー

  • ベストアンサー
  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.2

For j = 2 To 3 'For i = 1 To Controls("Data" & j).ListCount Controls("Data" & j).Clear 'Next i Next j こうしたら?

Bluejoy12
質問者

お礼

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

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答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

Bluejoy12
質問者

お礼

回答ありがとうございます 私の説明が悪かったようで Comboboxに入る要素は定量的なものではなく、予め準備しておけないデータだったのです ですのでAddItemで毎回必要な要素を入れる事にしていました ただやはりClearを使う事で問題は解消しましたのでアドバイスに感謝します また、 >要するに、List を削除しても、Valueプロパティは残っているからです。 はとても勉強になりました (それでループから抜けてしまうのはまだ理解できていませんが) どうもありがとうございました

  • yuu_yuu
  • ベストアンサー率41% (34/81)
回答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 ちなにみ、このロジックは動かしてません^^; 正常に動作しなかったら。。。ごめんなさい><

Bluejoy12
質問者

お礼

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

関連するQ&A

  • Excel VBAのComboboxのRemoveItem

    ExcelのVBAでの、すごく初歩的な質問です。Comboboxに読み込まれるリストがシートのA1:A10にあります。ところどころ空白なので、ComboboxのDropDownListにも空白が出でます。この空白を消すために次のようなコードを書いて実行しますがいろいろやってもエラーになってしまいます。どうもRemoveItemのあたりがおかしいようなのですが、どうすればいいのでしょうか?よろしくおねがいします。 ComboBox1.RowSource = "A1:A10" I = ComboBox1.ListCount - 1 For n = I To 0 Step -1 If ComboBox1.List(n) = "" Then ComboBox1.RemoveItem (n) End If Next

  • VBAのComboBoxについて

    UserForm1にComboBoxが8個(ComboBox1~8)あります。 各ComboBoxはSheet1の下記列に入力されているリストを表示します。 ComboBox1 : A列 ComboBox2 : B列 ComboBox3 : C列 ComboBox4 : D列 ComboBox5 : E列 ComboBox6 : F列 ComboBox7 : G列 ComboBox8 : H列 ComboBox9 : I列 ComboBox10 : J列 そこで、UserForm1の各ComboBoxでデータ選択する際に、リストにある場合はそれを選択し、リストにない場合はComboBoxに新しいデータを入力し、UserForm1のCommandButton1を押下時にその新しいデータをSheet1の各列に追加したいのですが、どのようにしたらよいのでしょうか。 Sheet1にあるリストをComboBoxに表示するところまではできています。 ※ComboBoxの番号とリストの列番号を一致させています。 --------------------------------------------------------------- Private Sub UserForm_Initialize() Dim lastrw As Integer, retu As Integer, i As Integer For retu = 1 To 10 lastrw = Sheet1.Cells(1, retu).End(xlDown).Row For i = 1 To lastrw - 1 Controls("ComboBox" & retu).AddItem Sheet1.Cells(i + 1, retu).Value Next i Next retu End Sub ---------------------------------------------------------------

  • エクセルファイルの有効期限の設定について

    エクセルのファイルに有期限を設定し、期日が来たら特定の "Seet"を削除してしまい、利用に値しない物にする。 このようなプログラムを作りたいのですが、他の方の質問を 参考に、流用して、いろいろやってみたのですが、どうもうまく行きません。 どなたかお知恵をお貸しください。 よろしくお願いたします。 This Workseet Openのプログラム中には、次の構文が入っています。 メッセージBOXを表示するまではうまく行きましたが、それ以降で 行き詰まっております。 ----------------- Private Sub Workbook_Open() Dim i As Integer, j As Integer, k As Integer Dim Start As Integer, Finish As Integer Dim Lbl As Variant Dim Cmb(4) As ComboBox Lbl = Array("札幌", "函館", "福島", "新潟", "東京", "中山", "中京", "京都", "阪神", "小倉") With Sheet1 .ListBox1.Clear .ListBox1.Font.Size = 10 For i = 0 To 9 .ListBox1.AddItem Lbl(i) Next .ListBox1.ListIndex = 4 Set Cmb(1) = .ComboBox1: Set Cmb(2) = .ComboBox2 Set Cmb(3) = .ComboBox3: Set Cmb(4) = .ComboBox4 Lbl = Array("", "開催年", "開催月", "開催日", "発走") For i = 1 To 4 Cmb(i).Clear Cmb(i).Font.Size = 10 Cmb(i).AddItem Lbl(i) Next Select Case Sheet1.Range("E4") Case 2003 To 2999: Start = Sheet1.Range("E4") Case Else: Start = 2003 End Select Select Case Sheet1.Range("F4") Case 2003 To 2999: Finish = Sheet1.Range("F4") Case Else: Finish = 2003 End Select k = 0 For i = Start To Finish k = k + 1 .ComboBox1.AddItem i If .ComboBox1.List(k) = Format(Date, "yyyy") Then .ComboBox1.ListIndex = k End If Next For i = 1 To 12 .ComboBox2.AddItem Format(i, "00") Next For i = 1 To 31 .ComboBox3.AddItem Format(i, "00") Next For i = 1 To 12 .ComboBox4.AddItem Format(i, "00") Next .ComboBox2.ListIndex = Month(Date) .ComboBox3.ListIndex = Day(Date) .ComboBox4.ListIndex = 1 End With MsgBox ("使用期限は 2009/9/18です")

  • リスト間のアイテム移動について - VBAで

    http://okwave.jp/qa/q4903870.html を読んで、No.2の回答にあるようなコードをExcel2000のVBAで組みたいと思いました。VBではitemdataというプロパティがありましたがVBAではなかったようで、かわりにListプロパティなどを使ってみましたが、うまくいきません。アドバイスをお願いできますでしょうか? VBでの元のコードは以下のとおりです。 Private Sub Form_Load() With List1   .AddItem "FreeBSD"   .AddItem "Linux"   .AddItem "Macintosh"   .AddItem "MS-DOS"   .AddItem "Slaris"   .AddItem "Windows 95"   .AddItem "Windows CE"   .AddItem "Windows NT"   for n = 0 to .ListCount-1     .ItemData(n) = n   next End With としておきます リストの移動時に Private Sub Command1_Click()   dim m as Integer   m = 0   For i = List1.ListCount - 1 to 0 step - 1     If List1.Selected(i) = True Then       if list2.ListCount > 0 then         for m = 0 to List2.ListCount-1           ' ここで ItemData比較する           if list2.itemData(m) > list1.ItemData(i) then             exit for           end if         next       end if       ' 挿入位置が mに求められている       list2.additem List1.List(i), m       list2.ItemData(m) = List1.ItemData(i)       List1.RemoveItem i     End If   next End Sub

  • エクセル 複数のComboBoxの連携

    エクセルでフォームを使い、社内各部署での案件の一覧の検索データベースを作成中です。 その際、ComboBoxを3つ使い、1「支店名」2「課名」3「チーム名」を選択するようにしたいのですが、支店により課名やチーム名が異なるため、1で選択した支店名と合致する課やチーム名が選べるようにしたく、以下のようなマクロを組みました。が、実行すると、支店名は表示されるものの、何故か選択できません。また、2つ目(課)の結果から3つ目(チーム名)も得る方法もいまいちよくわかりません。ご教示お願いいたします。 Option Explicit Private Sub ComboBox5_Change() Dim si As Integer With UserForm1 .ComboBox5.Text = "" si = .ComboBox5.ListIndex Select Case si Case 0 .ComboBox6.AddItem "A課" .ComboBox6.AddItem "B課" .ComboBox6.AddItem "C課" 以下必要分続く ’ComboBox6の結果から7を得るには? End Select End With End Sub Private Sub UserForm_Initialize() ' ComboBox がアクティブの時の処理 With UserForm1 .ComboBox5.AddItem "A支店" .ComboBox5.AddItem "B支店" .ComboBox5.AddItem "C支店" .ComboBox6.AddItem "A課" .ComboBox6.AddItem "B課" .ComboBox6.AddItem "C課" .ComboBox7.AddItem "Aチーム" .ComboBox7.AddItem "Bチーム" .ComboBox7.AddItem "Cチーム" End With End Sub

  • EXCEL VBA コンボボックスでのLISTINDEXの値

    初めて質問させていただきます。 EXCEL VBAでコンボボックスを設定したときのLISTINDEXの値についてですが、 コンボボックスがフォーム内に3つ(ComboBox1,2,3)あり、次のようなコードの入力を行い、 ComboBox1 Sub Userform_Intialize()  With CcomboBox1   AddItem"AAA" '・・・ここの値は0ですね   AddItem"BBB" '・・・ここの値は1ですね  End With End Sub sub ComboBox1_Change()  Me.combobox2.Clear  Select Case Me.ComboBox1.ListIndex   Case 0   Me.ComboBox2.AddItem "2AAA" '・・・ここの値は0ですね    Me.ComboBox2.AddItem "2BBB" '・・・ここの値は1ですね   Case 1   Me.ComboBox2.AddItem "2CCC" '・・・ここの値は何になりますか?   Me.ComboBox2.AddItem "2DDD" '・・・ここの値は何になりますか?  End Select End Sub このcombobox2の4つの項目から、 更にcombobox3の選択項目に分岐するように設定したいのです。 わかりやすいように、ComboBox3もComboBox2のように作成したいのですが、 このように入力した場合、ComboBox2で"2CCC"を選択した場合、 ListIndexの値が2ではないようなのです。 この"2CCC"と"2DDD"のListIndex値はいくつになるのでしょうか? どなたか教えて下さい。

  • EXCEL VBA 多種のコンボボックス操作

    こんばんは。 現在ユーザーフォーム上に10個のコンボボックスを配置しています。 1-8は共通リストを、9と10は別々のリストを表示させたいのですが・・ Private Sub UserForm_Initialize() Dim X, No, Y As Integer With UserForm2 For No = 1 To 8 For X = 0 To 7 .Controls("ComboBox" & No).AddItem Worksheets("Letter").Cells(X + 1, 10).Value Next Next For Y = 0 To 7 .ComboBox9.AddItem Worksheets("Letter").Cells(Y + 1, 11).Value .ComboBox10.AddItem Worksheets("Letter").Cells(Y + 1,12).Value Next End With End Sub 上記のコードですが、エラーが出てどうにも行き詰っています。 Private Sub UserForm_Initialize() Dim X, No As Integer For No = 1 To 8 For X = 0 To 7 UserForm2.Controls("ComboBox" & No).AddItem Worksheets("Letter").Cells(X + 1, 10).Value Next Next End Sub ↑だと1-8まで問題なく動くのですが・・・ すみませんが、アドバイスお願いいたします。

  • リスト間のアイテム移動について

    現在独学でhttp://www4.plala.or.jp/tamo/vb/vb99.htmlの問題の10番を解いてるのですが、どうしてもうまくいきません。 左のリストボックスから右のリストボックスへの1つ1つのアイテム移動はできたのですが、アイテムを複数同時に選択すると違うアイテムが移動したりすべてのアイテムが移動してしまいます。 今のコードは Private Sub Command1_Click() For i = List1.ListCount To 1 Step -1 If List1.Selected(i - 1) = True Then List2.AddItem List1.Text List1.RemoveItem List1.ListIndex End If Next End Sub Private Sub Form_Load() With List1 .AddItem "FreeBSD" .AddItem "Linux" .AddItem "Macintosh" .AddItem "MS-DOS" .AddItem "Slaris" .AddItem "Windows 95" .AddItem "Windows CE" .AddItem "Windows NT" End With End Sub このように指定しています。 解決法がありましたら教えてください。

  • comboboxで任意の行列を削除する

    comboboxで選択したデーターを探して、その行の 2列目から45列までを、削除する方法をお教えください。 下のように記述したのですが、1行全てが削除されてしまいます。 どのように記述したらよいのでしょうか。 よろしくお願いします。 Private Sub 保存データー削除_Click() Dim i As Long For i = 2 To 199 If Cells(i, 2).Value = combobox1.Value Then Range(i & ":" & i).Delete End If Next i Dim k As Long, s As Long k = 1 For s = 1 To 31 Cells(s, 1).Value = k k = k + 1 Next s End Sub

  • ユーザーフォームで使うコンボボックスの変数について

    ユーザーフォームで使うコンボボックスの変数について お世話になります。 エクセル2003で、ユーザーフォームを使った入力を考えています。 vbaのコードを作成中なのですが、 素人ながらFor Next とWithをつかった構文で 作り始めています。 作成中にふと思い、質問させていただきました。 ---------------------------------------------- Private Sub UserForm_Initialize() Dim i1 As Single Dim i2 As Integer With ComboBox101 For i1 = 5 To 40 Step 2.5 .AddItem i1 Next End With With ComboBox102 For i2 = 1 To 10 .AddItem i2 Next End With With ComboBox103 For i2 = 1 To 6 .AddItem i2 Next End With With ComboBox104 For i2 = 1 To 10 .AddItem i2 Next End With End Sub ---------------------------------------------- 上記コードにおいて、 ComboBox101については、小数以下の値が必要なため、変数はSingle 他のものについては、整数のため、Integerとなります。 ComboBox103から、変数の条件が同じため、そのまま同じ変数を使用しております。 個々のコンボボックスがWithで囲まれており、なおかつその中にFor Nextが含まれていますので、 問題はないのかなぁと思っていますが、はっきりとした確信が持てません。 コンボボックスでのドロップダウンリストを作成する際、この変数の再利用については 問題ありませんでしょうか? ご存知の方がいましたら、教えてください。よろしくお願いします。

専門家に質問してみよう