ExcelVBA リストボックスの複数選択処理で問題発生

このQ&Aのポイント
  • ExcelVBAでリストボックスの複数選択処理を実装していますが、うまくいきません。
  • 選択した行の特定のセルを変更するという処理がうまく機能していません。
  • 試したコードの一部をコメントアウトしてデバッグしたところ、選択した行の状態が正しく反映されていないことがわかりました。
回答を見る
  • ベストアンサー

ExcelVBA リストボックスの複数選択処理がうまくいきません

こんばんは、助けてください。 EXCEL2007です。 ユーザーフォームにリストボックス(Listbox1)を複数選択可能で作成。 リストボックス各行の4列目には「A」か「B」のいずれかが入っており、選択した行の4列目が「A」ならば「B」を、 「B」ならば「A」をCommandButton1押下でセルに反映させたいのですが、うまくいきません。 [反映先のセル] ・リストボックス1行目⇒セルC4(列番号3) ・リストボックス2行目⇒セルG4(列番号7) ・リストボックス3行目⇒セルK4(列番号11) ・リストボックス4行目⇒セルO4(列番号15) ・リストボックス5行目⇒セルS4(列番号19) ・以降同規則でつづく [コード] 01 Private Sub CommandButton1_Click() 02   Dim ListRow As Integer 03   Dim Retsu As Integer 04 05   For ListRow = 0 To Listbox1.ListCount - 1 06     If Listbox1.Selected(ListRow) Then 07       Retsu = (ListRow + 1) * 3 + ListRow 08       If Listbox1.List(ListRow, 3) = "A" Then 09         Cells(4, Retsu).Value = "B" 10       Else 11         Cells(4, Retsu).Value = "A" 12       End If 13    End If 14  Next ListRow 15 End Sub [現象] 1.単一選択時は、OK。 2.複数選択時は、選択した行のうち一番はじめの行のみOK。 3.試しに、EndSub直前でListbox1.Selected(各ListRow)を検証すると、すべてFalseになってしまっている。 4.IF文(07~12行目)を削除した上で、EndSub直前でListbox1.Selected(各ListRow)を検証すると、True/Falseは意図通りになっている。 IF文(07~12行目)が悪さをしているのでしょうか? うまいやり方をご教授いただければ、幸いです。m(_ _)m

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

リストボックスへのアイテムの追加をどのようになさっているのでしょう 私は簡易的に 4列8行程度の仮のデータテーブルシートに作って その領域をRowSourceに設定して実行しております バラバラのセルから1行のの項目を構築する場合 ListBox1.AddItem ListBox1.Item( n, 0 ) = Cells( r1, c1 ) ListBox1.Item( n, 1 ) = Cells( r2, c2 ) ListBox1.Item( n, 2 ) = Cells( r3, c3 ) ListBox1.Item( n, 3 ) = Cells( r4, c4 ) といった具合にしませんか? この手法なら セルに書かれている左右はされないはずですが ・・・

ma3ma3
質問者

お礼

当初は、リストボックスへのアイテムの追加は、 値が入っているバラバラのセルを参照して、 別テーブルを作成し、その領域をRowSourceに設定してました。 (これでは単一選択OK、複数選択はダメでした) が、 ご教授いただきましたバラバラのセルから直接項目を構築する方法で、 無事に複数選択でもOKで、すべて意図した通りに動きました!! 何がよくて、何が悪かったのかはまだ不明なのですが、 半分諦めていた中、数日間お付き合いいただきまして、誠にありがとうございます。 非常に助かりました。

その他の回答 (2)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

VirtualPC2007上の WinVista Ultimate + Excel2007で同様のコードを実行してみましたが 意図したとおりの動作でしたよ … データをインポートした際などに リストボックスの A/Bに 余分なスペースとかが混入していたりしませんでしょうか if Listbox1.List(ListRow, 3) = "A" then を if Trim(Listbox1.List(ListRow, 3)) = "A" then としてやるとか 07.5    if Len(ListBox1.List(ListRow))=1 then 08       If Listbox1.List(ListRow, 3) = "A" Then 09         Cells(4, Retsu).Value = "B" 10       Else 11         Cells(4, Retsu).Value = "A" 12       End If 12.1    else 12.2      MsgBox "設定不良" 12.5    end if などと検査してみるとか …

ma3ma3
質問者

お礼

たびたびありがとうございます。 いろいろ検証しましたが、うまくいかない原因が判明しました。 実は、 リストボックスの4列目の"A"/"B"ですが、 参照しているセルは"A"/"B"の直接の値ではなく、 Cells(4, Retsu)のセルから参照している(=C3とか=G3にしている)ことが原因みたいです。 "A"/"B"の直接の値にすれば、問題なく動きました。 ただ、やりたいことは Cells(4, Retsu).Value = "A" Cells(4, Retsu).Value = "B" と入力されたものをリストボックスに改めて表示させて、 それを元にユーザーフォームで変更させるかどうか判断基準とさせたいのですが。。。。 このようなことは、仕様上不可能なのでしょうか? たびたびすみませんが、宜しくお願いします。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

7と8の間に Debug.Print ListRow, Retu, ListBox1.List(ListRow,3), Cells(4,Retu) と記述して 選択した行が出力されるの確認しましょう WinXP SP3 + Excel2003(SP3) では正常に動作していますよ

ma3ma3
質問者

お礼

redfox63さん、早速のご回答ありがとうございます。 Drbug.Print試してみました! が、同じ現象が出てしまいます>< 2003で正常に動き、2007で動かないとなると、 あきらめるしかないですかね。。。 単純なコードなだけに、見落としているところが見つからないです。

関連するQ&A

  • リストボックスから複数行を選択し、その複数のデータをセルに入力したい

    Excel2003でマクロをつくっています。シートのB列を右クリックすると、リストボックスが表示され 任意1行を選択するとシートのB列、C列、D列のセルにデーターが入力されます。 Private Sub ListBox2_Click() With ListBox2 If .ListIndex = -1 Then MsgBox "項目を選択してくだい" Else ’シートが保護されていたら保護を解除 If ActiveSheet.ProtectContents = True Then ActiveSheet.Unprotect End If ActiveCell.Value = ListBox2.List(ListBox2.ListIndex, 0) ActiveCell.Offset(0, 1).Value = ListBox2.List(ListBox2.ListIndex, 1) ActiveCell.Offset(0, 2).Value = ListBox2.List(ListBox2.ListIndex, 2) ActiveSheet.Protect End If End With Unload UserForm3 End Sub このリストボックスから複数の行を選択し、シートのB列、C列、D列のセルにデーターを入力したいのですが、Multiselectプロパティを変更しても、一行のみしか入力できません。 上のコードをどうかえたらよろしいでしょうか。

  • VBAリストボックスで複数選んだセルの値を転記

    ActiveXコントロールで、シート内に埋め込み作成したリストボックスを、複数選択できるようプロパティを設定しました。 選択した項目の一番左の数値を、同じシートのB列の一番最後のセルから1個ずつ順番に、転記をしていきたいのです。 ★B列10行目まで埋まっていた場合、  B列 11行目 ←リストボックスで選択した1つめ  B列 12行目 ←リストボックスで選択した2つめ  B列 13行目 ←リストボックスで選択した2つめ 下記ですと、再初に選択したもののみ、転記されてしまい、1個1個入れていくことは可能なのですが、せっかく複数選択できるのに…という状況です。 同様の質問を検索してみて、真似してみたりもしましたが、うまくいきません。また、どうしても埋め込みが良くて、ユーザーフォームを別で作成はしたくはないです。 プロパティとフォームの画像を添付します。 すいません、よろしくお願いします。 Private Sub CommandButton1_Click() Dim n As Integer, s As String With ListBox1 For i = 0 To .ListCount - 1 If .Selected(i) = True Then Cells(Rows.Count, 2).End(xlUp).Offset(1, 0) = .List(i) End If Next i End With End Sub

  • リストボックスの1行目を選択状態にする

    リストボックス 何も選択していないのなら、1行目を選択状態にする というようにするにはどうすればいいでしょうか? 今は無理やり Sub test() If IsNull(Sheets("Sheet2").ListBox1.Value) = True Then Sheets("Sheet2").ListBox1.Value = "a" End If End Sub としていますが、 「リストボックスの1行目を選択状態にする」 にはどうすればいいですか? リストボックスがどの業も選択してない時に、 画像のようにしたいです。

  • リストボックスについてです。

    リストボックスについてです。 B列をダブルクリックするとリストボックスが立ち上がり、データを選択してB列に表示できるように設定されていますが、困った現象が起こっています。 例えば、sheet1のB10にダブルクリックでリストボックスを表示し、そこから「あいうえお」という名前を表示させて、sheer1編集が終わったとします。 次のsheet2でB1をダブルクリックしているのに、sheet2のB10に勝手に「あいうえお」と表示されてしまいます。 コードは以下になってます。 VBA初心者なのでエクセルのサイト等からコピペ等して作ったコードです。 どこかおかしな箇所があると思うのですが、何処がおかしいのかがわかりません。 お分かりになる方、教えていただければ助かります。 ' ◆Worksheetのコード◆ '---------------------------------------------------- '選択範囲を変更したときに実行される Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) UserForm1.ListBox1.RowSource = "データ!A1:A100"  '表示するデータ範囲 UserForm1.ListBox1.Font.Size = 12    'フォントサイズ If Target.Column = 2 Then 'B列なら 行 = Target.Row '行番号を取得する UserForm1.Show 'ユーザーフォームを表示する End If End Sub '=================================================================================== ' ◆UserForm1のコード◆ '-------------------------------------------------------------------------- Private Sub ListBox1_Click() 'クリックされたときに実行される If 行 <> 1 Then '1行目でなければ Cells(行, 2) = ListBox1.Value 'リストボックスの値をセルにセットする End If UserForm1.Hide 'ユーザーフォームを非表示にする End Sub Private Sub UserForm_Deactivate() '非アクティブになったときに実行される Unload Me 'ユーザーフォームをメモリから削除する End Sub '========================================================================================= '============================== ' ◆標準モジュールのコード◆ Option Explicit Public 行 As Variant '行番号 Sub auto_open() Load UserForm1 'ユーザーフォームをメモリに読み込む End Sub '==============================

  • Excel マクロ リストボックス複数選択

    いろいろ拝見させていただいているのですが 理解が低いのが原因で困っています。 データのシートがあります。 ・B列には、起点となる人の名前が記載(300名ほど) ・データの入っている列は、A:CE データシートでB列にてオートフィルタをかけ 抽出シートに転記したい。 抽出シートでは、ユーザーフォームを組みました。 オプションボタン1 単一選択 オプションボタン2 複数選択 オプションボタン3 拡張選択 リストボックス(2・3に対して) コマンドボタン   終了 とした場合、単一選択はできたのですが 複数選択の場合 該当数が「0」の表記となってしまい、うまくいきません。 同じような質問が…というお返事があることを承知でお伺いしています。 いただいた回答を基に、勉強をしていきたいと思っていますので なにとぞよろしくお願い申し上げます。 Private Sub UserForm_Initialize() ListBox1.ColumnCount = 1 'リストボックスの列は1 ListBox1.BoundColumn = 0 'ListIndexの値(行数)を使用する ListBox1.MultiSelect = 0 '最初は単一選択状態にする ListBox1.RowSource = 'リストのソース ListBox1.ColumnHeads = True '列見出し表示 OptionButton1.Value = -1 'オプションボタン1を選択状態にする End Sub Private Sub OptionButton1_Click() ListBox1.MultiSelect = fmMultiSelectSingle '単一選択状態にする End Sub Private Sub OptionButton2_Click() ListBox1.MultiSelect = fmMultiSelectMulti '複数選択状態にする End Sub Private Sub OptionButton3_Click() ListBox1.MultiSelect = fmMultiSelectExtended '拡張(連続)選択状態にする End Sub Private Sub ListBox1_Click() 'リストボックスがクリックされたとき(単一選択) Dim 条件 As String 条件 = UserForm1.ListBox1.Text '氏名 With Worksheets("データ") .Range("A1").AutoFilter _ field:=2, Criteria1:=条件 .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy _ Worksheets("抽出").Range("A1") .Range("A1").AutoFilter End With End Sub Private Sub CommandButton1_Click() '選択終了ボタンがクリックされたとき(複数・拡張選択) Dim 条件 As String Dim lastRow As Long With ListBox1 If .ListIndex = -1 Then Exit Sub '何も選択されていない For 条件 = 0 To .ListCount - 1 If .Selected(条件) Then '行選択あり With Worksheets("データ") .Range("A1").AutoFilter _ field:=2, Criteria1:=条件 .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy _ Worksheets("抽出").Range("A1") .Range("A1").AutoFilter End With End If Next End With End Sub Private Sub UserForm_Deactivate() Unload UserForm1 '×ボタンを押したら、ユーザーフォームのunloadをする End Sub

  • Sheetの選択行の複数列を空白に

    RowSurceでリストボックスにS5:AB21の範囲を表示させているのですが、下の式だSheetの選択行全体のセルが、空白になってしまいますので選択行の列のS:ABの範囲だけを空白にしたいのですが、教えてください。 '削除の処理 Dim 選択行 As Integer For 選択行 = 0 To ListBox1.ListCount - 1 If ListBox1.Selected(選択行) Then Rows(選択行 + 5) = "" End If Windows7 Office2010

  • 複数選択可能なリストボックス

    Excel VBAの質問をさせてください。 シート(sheet1)のA列、セルA1から以下のデータがあるとします。 みかん りんご バナナ 苺 梨 バナナ バナナ みかん フォームのリストボックスで"みかん"と"バナナ"を選択した際、シート(sheet2)のセルA1にコピーしていきたいのですが機能しません。 単品、"みかん"だけを選択しても何もコピーされません。 どこがいけないでしょうか?? Private Sub UserForm_Initialize()   With ListBox1     .AddItem "みかん"     .AddItem "りんご"     .AddItem "バナナ"     .AddItem "苺"     .AddItem "梨" .MultiSelect = fmMultiSelectMulti   End With End Sub Private Sub CommandButton1_Click() Dim i As Long For i = 1 To 8 If Worksheets("Sheet1").Cells(i, "A").Value = Me.ListBox1.Value Then Worksheets("Sheet1").Cells(i, "A").Copy Worksheets("Sheet2").Cells(i, "A") End If End Sub

  • リストボックスで選択した一行を一度にセルに入力したい

    Xcel2003でマクロ作成中です。以下のコードで、リストボックスで一行を選択しました。この選択した一行のデータのうち2個のデータをC列とD列に入力することができました。が、E列にもデータを入力したいのです。が色いろやってみましたができません。 Private Sub ListBox2_Click() With ListBox2 If .ListIndex = -1 Then MsgBox "項目を選択してくだい" Else ActiveCell.Value = ListBox2.list(ListBox2.ListIndex, 0) ActiveCell.Offset(0, 1).Value = ListBox2.list(ListBox2.ListIndex, 1) End If End With Unload UserForm3 End Sub 上のコードにどう追加記入したらよろしいでしょうか?

  • エクセルでのリストボックスの値の取得

    早速ですが、エクセルでユーザーフォーム上にある リストボックスの複数選択した時の値の取得方法を教えてください。 具体的にはアンケート集計をするためのフォームで "Q6"というワークシートのA列に「項目名」、B列に「数」を 1行目から設定しています(「数」の初期値は"0"です)。 ユーザーフォームのリストボックスにはA列を表示させています。 そのユーザーフォーム上にあるコマンドボックスに 下記のようにコード記述しても、一番上の選択されたものしか"Q6"に 反映されません(2,3,4行目を選択しても2行目の「数」のみ+1になる)。 Private Sub CommandButton1_Click()  For n = 0 To ListBox1.ListCount - 1   If ListBox1.Selected(n) = True Then    Worksheets("Q6").Cells(n + 1, 2) = _    Worksheets("Q6").Cells(n + 1, 2) + 1   End If  Next n End Sub エクセルは97で、リストボックスのMultiSelectはMultiでもExtendedでもダメでした。 どなたかご存知の方がいらっしゃいましたらよろしくお願いします。

  • リストボックスから項目を選択してセルに入力したいのです

    EXcel2003でマクロ作成中です。エクセルシートのN列を右クリックすると、ユーザーォームが現れ、その中のリストボックスから項目を選択すると選択文字が白色に反転します。 ユーザーホームの下方に設置した「入力する」ボタンをクリックする、アクティブセルにテキスト文字列が挿入されます。 Option Explicit Private Sub CommandButton1_Click() With ListBox1 If .ListIndex = -1 Then MsgBox "項目を選択してくだい" Else ActiveCell.Value = ListBox1.list(ListBox1.ListIndex) End If End With Unload UserForm1 End Sub --------------------------- Private Sub CommandButton2_Click() Unload UserForm1 End Sub ------------------------------ これと同じものをB列につくりました。エクセルシートのB列を右クリックすると、リストボックスが表示されますが、その中の項目を選択しようとすると、一瞬にしてユーザーフォーム自体が消えてしまい項目を 選択できません。 Private Sub CommandButton1_Click() With ListBox2 If .ListIndex = -1 Then MsgBox "項目を選択してくだい" Else ActiveCell.Value = ListBox2.list(ListBox2.ListIndex) End If End With Unload UserForm2 End Sub ----------------------------- Private Sub CommandButton2_Click() Unload UserForm2 End Sub ------------------------------------------ まったく同じものを作って内容だけかえたのですが、できません。 どうしてでしょうか?ご教授おねがいします。

専門家に質問してみよう