Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2016)
リストボックスの値を選択してそのデータをシートから削除したい
投稿日時: 18/05/08 18:56:53
投稿者: ぽろんちょ

いつもお世話になっております。
件名のとおり、リストボックスの値を選択したときに該当するデータをシートから削除したいのですが、
なかなかうまくできません。
以下のコードで「作業員リスト」シートのデータをリストボックスに表示しています。
シートにはA列に項目で「名前」があり、データはこの一列だけになります。
 
    With Worksheets("作業員リスト")
        For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
            ListBox1.AddItem .Cells(i, 1)
        Next i
    End With
 
以下のコードでうまくできたかと思いましたが、思い通りには動きませんでした。
 
    With Worksheets("作業員リスト")
        .Cells(ListBox1.ListIndex + 2, 1).Clear
        .Rows(ListBox1.ListIndex + 2).Delete
    End With
 
どなたかお分かりになる方よろしくお願いいたします。
 
 

回答
投稿日時: 18/05/08 21:23:51
投稿者: simple

> 思い通りには動きませんでした。
とのこと。
もう少し説明が欲しいですね。
 
思い通りとはどういうことで、どこがまずいのですか?
 
リストボックスは残したままにするなら、
シートの当該行は消去はするが削除はしないでおくべきだし、
 
シートは削除してリストボックスの該当データも削除したい
ということなら、

 ListBox1.RemoveItem ListBox1.ListIndex
を追加すればよいと思います。

回答
投稿日時: 18/05/08 22:55:57
投稿者: WinArrow
投稿者のウェブサイトに移動

質問内容とちょっとずれるが、
 
> .Cells(ListBox1.ListIndex + 2, 1).Clear
このコードは必要ないと思いますが・・・
あっても害はありませんが・

回答
投稿日時: 18/05/08 22:56:13
投稿者: mattuwan44

セル範囲とリンクさせるなら、RowSourceプロパティにアドレスをセットするのもありかなぁ。。。
ざっくり思い付きで書いたから、少しスマートじゃないけど、参考になれば。。。
 
 
 
Private Sub UserForm_Initialize()
    Dim rngList As Range
    With Worksheets("作業員リスト").Range("A1").CurrentRegion
        Set rngList = Intersect(.Cells, .Offset(1))
    End With
     
    With Me.ListBox1
        .ColumnCount = rngList.Columns.Count
        .ColumnWidths = "70;50;50"
        .RowSource = rngList.Address(External:=True)
        .ColumnHeads = True
    End With
End Sub
 
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Dim rngList As Range
     
    With Application.Range(Me.ListBox1.RowSource)
        .Rows(Me.ListBox1.ListIndex).Delete
        With .CurrentRegion
            Me.ListBox1.RowSource = Intersect(.Cells, .Offset(1)).Address(External:=True)
        End With
    End With
End Sub

投稿日時: 18/05/09 15:10:06
投稿者: ぽろんちょ

simpleさん、WinArrowさん、mattuwan44さん
 
早速の返信ありがとうございます。
動きとしてはリストボックスの項目をダブルクリックした時に、リストボックス内の選択したデータを削除し、これと同時にシート内の該当するデータも削除したいです。
 
あれから自分で試行錯誤して以下のコードで動くようになりましたが、一つ問題が発生しました。
リストボックス内で一番下のデータをダブルクリックすると、シート内ではデータの最後から二番目の
データを削除してしまいます。
 
リストボックス内で一番下以外のデータをダブルクリックすると、シート内ではリストボックスで選択した
データが正しく削除されます。
 
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
 
    Dim Sakujyo As Integer
     
    ListBox1.RemoveItem ListBox1.ListIndex
    Sakujyo = UserForm3.ListBox1.ListIndex + 2
    Worksheets("作業員リスト").Rows(Sakujyo).Delete
     
End Sub
 
いろいろと試してみましたが、なぜこのように動くのかわかりませんでした。
どなたかお分かりになる方、よろしくお願いいたします。
 

回答
投稿日時: 18/05/09 21:10:04
投稿者: simple

ListBox1_DblClickの最初の行にブレークポイントを設定して、
ステップ実行して、
Indexの値がどう変わっていくか観察してみてはどうですか?
 
行の削除を先に実行して、
その後で Removeすればよいと思うけれど、
自分で納得するまで実験してみることをお薦めします。

投稿日時: 18/05/10 14:37:13
投稿者: ぽろんちょ

simpleさん
 
回答ありがとうございます。
 
>行の削除を先に実行して、
>その後で Removeすればよいと思うけれど、
 
この順序で実行したところ望み通りに動きました!
大変助かりました。お忙しいところありがとうございました!