• ベストアンサー
  • すぐに回答を!

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
  • 閲覧数316
  • ありがとう数3

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

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

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連する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 ---------------------------------------------------------------

  • VB Forから抜ける

    Data1(1, 1) = "りんご" Data1(1, 2) = "みかん" Data1(2, 1) = "なし" Data1(2, 2) = "オレンジ" Data2(1, 1) = "バナナ" Data2(1, 2) = "みかん" Data2(2, 1) = "なし" Data2(2, 2) = "いちご" -------------------- Dim c, i As Integer For c = 1 To 2 For i = 1 To 2 If Data1(c, i) <> Data2(c, i) Then MessageBox.Show("異なります") GoTo goto1 End If Next Next goto1: ----------------- 言語 VB.NET Data1とData2 の中身が異なればアラートを出す。 (複数異なっていても1度のみアラートを出す) さて これを「GOTO」を使わないでする方法ってあるんでしょうか? 「EXIT Sub」はgoto1:の下にもコードがあるので使えません。 GoTo goto1を Exit For にしても 「i」 のループが抜けるだけです。 これを「C」のループを抜けるようなコードってあるんでしょうか?

その他の回答 (2)

  • 回答No.3
  • 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プロパティは残っているからです。 はとても勉強になりました (それでループから抜けてしまうのはまだ理解できていませんが) どうもありがとうございました

  • 回答No.1
  • 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の使い方をもっと勉強します どうもありがとうございました

関連するQ&A

  • 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まで問題なく動くのですが・・・ すみませんが、アドバイスお願いいたします。

  • エクセル 複数の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

  • リスト間のアイテム移動について - 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

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

    ユーザーフォームで使うコンボボックスの変数について お世話になります。 エクセル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が含まれていますので、 問題はないのかなぁと思っていますが、はっきりとした確信が持てません。 コンボボックスでのドロップダウンリストを作成する際、この変数の再利用については 問題ありませんでしょうか? ご存知の方がいましたら、教えてください。よろしくお願いします。

  • VBA A1をA2に変更したい

    またお世話になります。 下記のはランダムにチーム分けするものです。 TmCnt = 5がチーム数です。 これはA1から氏名を読み取り、C1からランダムに表を作成するものです。 A2、C2に変更したいのです。 Data1 = Range("A1:A" & Total).Value A1をA2に変えましたが、「インテックスが有効範囲にありません」とエラーメッセージが出ます。 どこが違うのでしょうか? 宜しくお願いします。 Sub Sample() Dim Total As Integer Dim TmCnt As Integer Dim Data1 As Variant Dim Data2() As String Dim i As Integer, j As Integer, k As Integer Total = Cells(Rows.Count, 1).End(xlUp).Row TmCnt = 5 Data1 = Range("A1:A" & Total).Value ReDim Data2(1 To Total) Randomize For i = TmCnt To 1 Step -1 j = Int(Rnd * i) + 1 Data2(i) = Data1(j, 1) Data1(j, 1) = Data1(i, 1) Next i For i = Total To TmCnt + 1 Step -1 j = Int((i - (TmCnt + 1) + 1) * Rnd + TmCnt + 1) Data2(i) = Data1(j, 1) Data1(j, 1) = Data1(i, 1) Next i i = 1 Do For j = 1 To TmCnt k = k + 1 Cells(i, j + 2).Value = Data2(k) If k = Total Then Exit Sub Next j i = i + 1 Loop End Sub

  • [エクセルVBA] コンボボックスのリストの更新方法について

    エクセルVBAで以下のような方法でコンボボックスのリストを更新しようとしています。 参照セルの値が変わった場合に、コンボボックスのリストを削除して、新たな値をリストとして取り込みたいと思って、以下のようなコードを実行しましたが、 削除はできても、リストの追加時に"書き込みできません"というエラーが出てしまいます。 下記ロジックにかかわらず、「コンボボックスのリストを一旦クリアして、再度追加する」方法をアドバイス願います。 For i = 1 To 10 ComboBox2.RemoveItem (0) Next For j = 1 To 10 ComboBox2.AddItem Worksheets("Tool").Cells(j, 2).Value Next

  • エクセルVBAのコンボボックス

    エクセル2002使用です。 生年月日とかを入力できるコンボボックスを作っているのですが、同じコンボボックスを5つ作ろうとしています。例えば和暦を入力するには Private Sub userform_initialize() With ComboBox(1) .AddItem "昭和" .AddItem "平成" End sub でうまくいくのですが、2個目から5つ目まで同じものを作成する場合、 With ComboBox(2) ・・・ With ComboBox(3) ・・・ と、コードを記述していかないと駄目なのでしょうか? できれば With ComboBox(1: 5) とか、 変数を使って Private Sub userform_initialize() Dim i As Integer For i = 1 To 5 With ComboBox(i) .AddItem "昭和" .AddItem "平成" End With Next End sub といった具合にまとめたいのですが、コンパイルエラーとなってしまいます。 初歩的な質問で申し訳ないのですが、よろしくお願いします。

  • ComboBoxについて

    ComboBoxのアイテムリストからアイテムを選んだら 選んだアイテムに対応した別の文字列 をComboboxに表示したいと思います。 動き的には Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load  ComboBox1.Text = ""  ComboBox1.Items.Add("000")  ComboBox1.Items.Add("001")  ComboBox2.Text = ""  ComboBox2.Items.Add("0個目")  ComboBox2.Items.Add("1個目")  ComboBox2.Visible = False End Sub Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged  Select Case ComboBox1.SelectedIndex   Case 0    ComboBox1.Visible = False    ComboBox2.Visible = True    ComboBox2.SelectedIndex = 0   Case 1    ComboBox1.Visible = False    ComboBox2.Visible = True    ComboBox2.SelectedIndex = 1  End Select End Sub Private Sub ComboBox2_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox2.GotFocus  ComboBox1.Visible = True  ComboBox1.DroppedDown = True  ComboBox2.Visible = False End Sub こんな感じで、ComboBoxを二つ使えば実現できるのですが一つだけでも実現できる方法が ありましたら、教えてくださいませ。

  • VB2008 comboboxの内容をSelectCaseで使いたい

    VB2008 comboboxの内容をSelectCaseで使いたい いつもお世話になってます。 初めてComboboxを使っています。 リストには 「メロンパン」 「コロッケパン」 「ハンバーガー」 と入っていて、 デバックしそれぞれを選択すれば、無事に指定欄に表示されるようにまではなりました。 ここでストップしてしまいまして、 Selectcase(今週習った)で、 case 1 (メロンパンは120円なので) en=個数x120 case 2 … というようにしたいのですが、 "Select Case ○○"の○○を何にすればいいのか分からないのと、 caseのあとの数字は(リストの上から)0,1,2というように聞いた気がしたのですがそれでよいのかどうか。 見ていただけないでしょうか。 未完成のぼろぼろですが、コードをおのせします。 Public Class Form1 Dim cm, a As String Dim kosu, en As Integer Private Sub ShapeComboBox_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ShapeComboBox.SelectedIndexChanged txtKaimono.Text = ShapeComboBox.Text End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click kosu = TextBox1.Text Select Case ShapeComboBox Case 0 en = kosu * 120 Case 1 en = kosu * 180 Case 2 End Select End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Application.Exit() End Sub End Class

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

    現在独学で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 このように指定しています。 解決法がありましたら教えてください。