当前,我进入一个项目,在那里我不得不为下面提到的活动编写代码。
我创建了一个带有多选列表框和一个命令按钮的用户窗体
a)ListBox用2列填充表源中的项目。
Zone Region
North N1
North N2
North N3
North N4
South S1
South S2
South S3
South S4
East E1
East E2
b)命令按钮用于删除在列表框中选择的项目。
现在,一旦单击“删除命令”按钮,所选的行应在“原始表源”中被删除。
问题
即使当我在列表框中选择2行或更多行时,我也面临的问题是,只有最后选择的行被删除了。 。
Private Sub Cmd_Del_Click()
Dim sh As Worksheet
Set sh = ThisWorkbook.Worksheets("Sheet1")
Dim i As Long
For i = Me.LB_ZoneRegion.ListCount - 1 To 0 Step -1
If Me.LB_ZoneRegion.Selected(i) = True Then
sh.Range("A" & i + 2 & ":B" & i + 2).Select
Selection.Delete
End If
Next i
Call UserForm_Initialize
End Sub
Private Sub UserForm_Initialize()
On Error Resume Next
With Me.LB_ZoneRegion
.Clear
.ColumnCount = 2
.ColumnHeads = True
.ColumnWidths = "40;50"
.RowSource = "ZoneRegion"
.MultiSelect = fmMultiSelectMulti
End With
End Sub
单击下面的链接下载工作文件。 https://drive.google.com/open?id=1P5wiW6WVFAVQBgixPuA7gqyacR1aktvi
在这方面请帮助我。
答案 0 :(得分:0)
使用Union
避免重复删除
使用Union
函数,您可以将所有要删除的行添加到范围对象(例如DelRng
),最后通过一个单独的代码行DelRng.Delete
删除它们。
接近OP的示例代码
Private Sub Cmd_Del_Click()
Dim sh As Worksheet
Dim DelRng As Range
Set sh = ThisWorkbook.Worksheets("Sheet1")
Dim i As Long
For i = 0 to Me.LB_ZoneRegion.ListCount - 1 ' no more need to loop backwards
If Me.LB_ZoneRegion.Selected(i) = True Then
If DelRng Is Nothing Then
Set DelRng = sh.Range("A" & i + 2 & ":B" & i + 2)
Else
Set DelRng = Union(DelRng, sh.Range("A" & i + 2 & ":B" & i + 2))
End If
End If
Next i
Application.ScreenUpdating = False
If Not DelRng Is Nothing Then DelRng.Delete ' delete chosen rows (if any)
Application.ScreenUpdating = True
End Sub
注意
您还应该提供以下情况:用户删除整个命名范围。