• ベストアンサー
  • 困ってます

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

noname#4342

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

  • 回答数3
  • 閲覧数2552
  • ありがとう数5

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

  • ベストアンサー
  • 回答No.3
  • papayuka
  • ベストアンサー率45% (1388/3066)

こんにちは。 ヘルプに「コントロールの RowSource プロパティにデータ ソースが指定されている場合、このメソッドを使っても、リストから行を削除することはできません。」とあるのでダメでしょうね。 元の範囲をソートして使うか、他の方がおっしゃるようにAddItemで必要な物だけ追加するかでしょう。

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

質問者からのお礼

なるほど、そういう条件があったんですね。あきらめがつきました(笑)ありがとうございます。

関連するQ&A

  • EXCEL VBA 配列について

    リストボックスの選択から重複しないリストボックスに値を抽出する コードを作成しました。 しかし、スペックの低いPCで動作させると、処理に時間が かかってしまいます。 配列を使うと処理が早くなるとウェブで調べたのですが、 いまいち理解が出来ません。 やりたいこと ・配列にリストボックスの値を入れる ・配列から重複を削除する? どなたかご教授ください。 コードは下記のようになっています。    If Not UserForm1.ListBox6.Value = 0 Then      For w = UserForm1.ListBox1.ListCount - 1 To 0 Step -1 If Not UserForm1.ListBox6.Value = _ UserForm1.ListBox1.List(w, 5) Then UserForm1.ListBox1.RemoveItem (w) End If Next w    End If For w = UserForm1.ListBox1.ListCount - 1 To 1 Step -1 If UserForm1.ListBox1.List(w - 1, 6) = UserForm1.ListBox1.List(w, 6) Then UserForm1.ListBox1.RemoveItem (w) End If Next w

  • 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 ---------------------------------------------------------------

  • 条件付で20行目おきにComboBoxの値を入れる

    ユーザーフォームのComboBox1の値をシートのR列31行目から20行毎に入れる 但し、選んだ20行毎の6行上が空白なら値を入れない と、したいのですが、下の構文で実行すると一瞬表示されて消えてしまいます。 結果は空白になります。 これでも必死の思いでしましたので笑わないで下さいね。 宜しくご指導をお願いします。 Dim t Dim i For t = 25 To 994 Step 20 For i = 31 To 1000 Step 20 If Cells(t, 18) <> "" Then Cells(i, 18) = ComboBox1.Value ElseIf Cells(t, 18) = "" Then Cells(i, 18) = "" End If Next i Next t

その他の回答 (2)

  • 回答No.2
  • imogasi
  • ベストアンサー率27% (4560/16325)

下記はワークシートに直接コンボボックスを貼りつけています。 UserFormには貼りつけていません。後者だと結論は別になるかも知れないと思います。 (1)まず周辺から。ComboBox1.RowSource = "A1:A10" について。 これは実際には、どの様にコーディングされましたか。上のままではエラー になると思いますが。 (A)Worksheets("sheet1").ComboBox1.RowSource = Range("a1: a10")もダメでした(このメソッドをサポートしていません。) (B)私はいつもListFillRangeにA1:A10と入れています。 (C)Worksheets("sheet1").ComboBox1.RemoveAllItemsもエラーになりました(このメソッドをサポートしていません。) (D)ある本に「コンボボックスコントロールにワークシートのデータが設定されている場合は、Additemメソッドが利用できませんとあります。ListFillRangeを使った場合か。 (E)項目の追加の別方法について Sub test03() For i = 1 To 10 Worksheets("sheet1").ComboBox1.AddItem Cells(i, 1) Next i End Sub もダメでした。 (2)項目削除について 4点注意点・心配な点があります。 (A)ListIndexは0から始まるが、Forループはi=1から始めやすい。 (B)RemoveItem n のn は第n番目の項目である。ListIndexと1ずれる。 (C)1つ削除するとループの終わりが1つ手前にずれる。 (D)1つ削除すると次ぎの削除するListIndexは同じListIndex番号に なる。 Sub test01() For i = 0 To 9 Worksheets("sheet1").ListBox1.AddItem Worksheets("sheet1").Cells(i + 1, 1) Next i i = Worksheets("sheet1").ComboBox1.ListCount ' MsgBox i p = 0 For n = 0 To i - 1 ' MsgBox Worksheets("sheet1").ComboBox1.List(n) If Worksheets("sheet1").ComboBox1.List(n) = "" Then ' MsgBox n MsgBox p Worksheets("sheet1").ComboBox1.RemoveItem p i = i - 1 Else p = p + 1 End If Next End Sub でやりましたがダメでした。 (3)VB6.0で Private Sub Form_Load() l = Array("a", "b", " ", "c", "d", _ "e", " ", "f", "g", " ") For i = 0 To 9 Form1.Combo1.AddItem l(i) Next i i = Form1.Combo1.ListCount For n = 0 To i - 1 MsgBox n If Form1.Combo1.List(n) = " " Then Form1.Combo1.RemoveItem n Else End If Next End Sub で上手く行くようです。 「内容なし項目」はスペース1字に変えています。 この場合、(2)の(C)と(D)は考えなくて良いことが判りました。 (4)エクセルVBAで Sub test01() l = Array("a", "b", " ", "c", "d", _ "e", " ", "f", "g", " ") For i = 0 To 9 Worksheets("sheet1").ComboBox1.AddItem l(i) Next i i = Worksheets("sheet1").ComboBox1.ListCount MsgBox i For n = 0 To i - 1 MsgBox n If Worksheets("sheet1").ComboBox1.List(n) = " " Then Worksheets("sheet1").ComboBox1.RemoveItem n Else End If Next End Sub は上手く行きます。 Worksheets("sheet1").ComboBox1.RemoveAllItemsはエラーになります( このメソッドをサポートしていません。) テストで何度も実行すると、項目が累積しますので注意。 結論として、エクセルVBAでワークシート上にコンボボックスを貼りつけると、RemoveIten が使えないのではないでしょうか。 であれば、ListFillRangやDatasourceを使わず、シートのセルA1:A10から自分で、空白分は除いて、、AddItemでセットすることになるでしょう。

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

質問者からのお礼

どうも沢山情報をありがとうございます。当方がやってみたのは、UserForm上にComboBoxを張るつける方です。これだと、ComboBox1.RowSource = "A1:A10"はうまくいきました。

  • 回答No.1
  • bin-chan
  • ベストアンサー率33% (1403/4213)

「不要なものを消す」ことより、「必要なものを追加」した方が良いのでは? For文でなら、 For n = 1 To 10   Range("A" & n ).value <> "" Then     ComboBox1.AddItem Range("A" & n ).value   End If Next n で良かったかな。

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

質問者からのお礼

なるほど、発想を転換すれば、あっという間に解決するんですね。RemoveItemが使えないのことにこだわってしまいますが・・・。ありがとうございます。

関連するQ&A

  • 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を二つ使えば実現できるのですが一つだけでも実現できる方法が ありましたら、教えてくださいませ。

  • エクセルVBAでコンボボックスを使いシートのデータをリストアップする方法

    VBAの詳しい方教えて下さい。 ConboBox1でSheets1のA列に入ってるデータをピックアップします。 そのピックアップされたのがAAなら 次のConboBox2でSheets2のA列に入ってるデータをピックアップして BBならSheets3のA列に入ってるデータをピックアップたいのですが、どのようにすれば良いのでしょうか。 ComboBox1.RowSource = Sheets("Sheets1").Range("A1:A2").Address もしComboBox1にAAが入ったら ComboBox2.RowSource = Sheets("Sheets2").Range("A1:A2").Address そして また もし ComboBox1にBBが入ったら ComboBox2.RowSource = Sheets("Sheets3").Range("A1:A2").Address これをひとつのUserFormで行いたいのです。 得意先別・商品別・単価をピックアップしたいのです。 教えて下さい。 宜しくお願い致します。

  • エクセル VBA if構文

    毎度お世話になります。 下記プログラミングですが、 シャーペンまたはボールペンがコンボボックス1で 選択された場合はコンボボックス2で10束または50束の選択肢となり 消しゴムまたはシャー芯がコンボボックス2で 選択された場合はコンボボックス2で100コまたは1000コの選択肢としたいのですが 他の方法がありますでしょうか。 宜しくお願い致します。 If Me.ComboBox1.Value = "シャーペン" Or Me.ComboBox1.Value = "ボールペン" Then ComboBox2.Style = fmStyleDropDownCombo ComboBox2.RowSource = "" ComboBox2.Clear ComboBox2.AddItem "10束" ComboBox2.AddItem "50束" ComboBox2.ListIndex = -1 End If If Me.ComboBox1.Value = "消しゴム" Or Me.ComboBox1.Value = "シャー芯" Then ComboBox2.Style = fmStyleDropDownCombo ComboBox2.RowSource = "" ComboBox2.Clear ComboBox2.AddItem "100コ" ComboBox2.AddItem "1000コ" ComboBox2.ListIndex = -1 End If

  • VBA コンボボックスの項目入力

    お世話になります。 Excel2002のVBAにて コンボボックスへの項目の入力について 質問させて頂きます。 現在行いたい処理はB27からB56のセルに入力されている数値 のなかからB62からB91に入力されている数値と重複の無いもの をコンボボックスへ追加したいと考えております(空白セルは 追加しない)。 以下の通りではどうもうまくいかないので宜しくお願いします。 ' For i = 27 To 56 ' If Range("B" & i) <> "" Then ' ComboBox1.AddItem Range("B" & i) ' For j = 62 To 91 ' If Range("B" & j) <> "" Then ' ComboBox1.RemoveItem Range("B" & j) ' End If ' Next ' End If ' Next

  • VB2008 comboboxを連動させた際のエラー

    先日より取り組んでいる顧客検索プログラムですが、combobox1でササキを選ぶとcombobox2には北海道、combobox3には札幌市と表示させたいと思います。先日もアドバイスをいただきそれを参考にすすめていますが、「'0' の InvalidArgument=Value は 'SelectedIndex' に対して有効ではありません。 パラメータ名: SelectedIndex」というエラーが出てしまいどうしても解決出来ません。このエラーの後さらにデバッグすると思ったとおりに動作するのですが、エラーを解決するにはどう対処すると良いのでしょうか?下記が現在のソースとなります。どうかアドバイスをお願い致します。 ササキ,北海道,札幌市, スズキ,東京都,あきる野市, サトウ,愛知県,名古屋市, ハヤシ,北海道,旭川市, が TextFile1.txtです。 Imports System.IO ------------ Public Class Form1 Private Sub Form1_Load(省略~ Dim fn As String = "C:\TextFile1.txt" Dim read As System.IO.StreamReader = My.Computer.FileSystem.OpenTextFileReader(fn, System.Text.Encoding.Default) Dim dline() As String Dim namelist As ArrayList = New ArrayList() Dim adr1list As ArrayList = New ArrayList() Dim adr2list As ArrayList = New ArrayList() dline = Split(read.ReadToEnd, vbCrLf) Dim srcary() As String Dim i As Integer For i = LBound(dline) To UBound(dline) srcary = Split(dline(i), ",") namelist.Add(srcary(0)) adr1list.Add(srcary(1)) adr2list.Add(srcary(2)) Next ComboBox1.DataSource = namelist ComboBox1.SelectedIndex = -1 ComboBox1.Text = "名前" ComboBox2.DataSource = adr1list ComboBox2.SelectedIndex = -1 ComboBox2.Text = "住所1" ComboBox3.DataSource = adr2list ComboBox3.SelectedIndex = -1 ComboBox3.Text = "住所2" End Sub ------------- Private Sub ComboBox1_SelectedIndexChanged(省略~ If ComboBox1.SelectedIndex > -1 Then ComboBox2.SelectedIndex = ComboBox1.SelectedIndex Else ComboBox2.Text = "" End If End Sub

  • Excel VBA:ComboBoxのドロップダウンリストで文字が欠ける

    Excel2000のVBAで、ユーザーフォーム上にComboBoxを作りました。 ComboBox5.RowSource = "Sheet2!q18:q21" ComboBox5.Value = WS2.Range("r18").Value こんな感じで項目を指定して、実行するとComboBoxは一応表示されるのですが、ComboBox内の文字列の下側が1ドット分くらい欠けた状態になります。[▼]を押してドロップダウンリストを表示させると、リスト内の各文字列も下側が1ドット分くらい欠けた状態になっています。 どうも項目の文字数が長くなると、この症状が現れるらしいことは分かったのですが、文字数を削りたくないので、なんとか現在の文字数で正常に表示させたいと思っています。 この症状への対処法をご存知の方がいらっしゃいましたら、どうかアドバイスをくださいますようお願いいたします。

  • Excel VBA comboboxへの割り当て

    下記コードにてcomboboxを任意の数作成しました。 このComboboxに Sub Sub1を割り当てたいのですが どうすればいいでしょうか、 (OnChange,Chaneはエラーでした) また、その際どのcomboboxからよばれたか引数で渡したいのですが どうすればいいでしょうか。 '---------------結果こうなるようにしたい Private Sub ComboBox1_Change() call sub1("コンボの名前") End Sub '----------combobox作成 With Worksheets("AAA").OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, DisplayAsIcon:=False) .Left = X .Top = Y .Width = 100 .Height = 18 .ListFillRange = "LIST" .OnChange="sub1" ->エラーでした .Change="sub1" ->エラーでした End With

  • コンボボックスのリストを取得し、Msgboxに出力

    お世話になっております。 オートフィルターをフォーム上で再現しております。Excelは2003です。 そこで、オートフィルターのように、項目を表示しすることはできました。 その後、選択されていない項目でフィルターをかけていきたいと思っています。 コンボボックスに入っている個数を数えて、 1つずつ使用していこうと考えています。 例えば、Combobox1には "あ" "い" "う" "え" "お" "" と入っているとします。(最後は空白をわざとです。) その場合、コンボボックスの個数を取得し 個数-1 でMsgboxに表示させていきたいと思っております。 (あ、い、う、え、お)と表示できればOKです。 この場合、ListCount-1 で良いのでしょうか? 配列に入るのは0からだという認識があるのですが、 Comboboxがそうだったか、うろ覚えでして… For i=0 to Combobox1.ListCount-1   Msgbox Combobox1.ListCount-1 Next これでMsgboxに表示できるのでしょうか? また、他に良いコードがあれば教えて下さい。 よろしくお願い致します!

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

    UserForm1上に コンボボックスには数字がリストされます! ComboBox1、ComboBox2、ComboBox3 3つ作成して 例えば ComboBox1=1 ComboBox2=0 ComboBox3=5 と表示された時 CommandButton1をクリックしたら UserForm2の TextBox1に”6”と足し算 された数字を表示したいのですが 普通のセルなら 出来るのですが・・ ComboBoxでするなら どのような記述に なるのでしょうか? すいません、教えて下さい!

  • Excel コンボボックス2つ以上の時のコード

    ユーザーフォームでコンボボックスを2つ作ったのですが、1つだけのときはうまくいったのですが、二つ目をつくったら、エラーが出てしまいました。 コード入力は、Initializeに入力してあります。 Private Sub UserForm_Initialize() ComboBox1.Style = fmStyleDropDownCombo ComboBox1.RowSource = "sheet1!F2:F7" ComboBox1.ListIndex = -1 End Sub Private Sub UserForm_Initialize() ComboBox2.Style = fmStyleDropDownCombo ComboBox2.RowSource = "sheet2!B2:B3" ComboBox2.ListIndex = -1 End Sub コンボボックス1だけはうまくいったのですが、コンボボックス2をつくったら名前が適切でありませんとエラーがでました。 どのようにしたらいいですか?教えてください。