【发布时间】:2019-01-11 14:07:52
【问题描述】:
我有一个包含列表框和命令按钮的 excel 用户表单。我希望能够在列表框中选择多行,并在使用命令按钮时将它们从数据库范围中删除。
命名范围通过字典运行,其中键作为范围单元格值,项目作为单元格地址。通过字典弹出列表框选择,返回要删除的单元格位置。
目前,当我进行选择时,最底部的选择是唯一删除的条目。 For Next 循环应该从 listbox.count-1 开始,一直到 0。但是,它似乎没有完全循环并且没有错误消息。想法?
Private Sub RemoveAnalyst()
' Select Tools->References from the Visual Basic menu.
' Check box beside "Microsoft Scripting Runtime" in the list.
Dim ws As Worksheet
Dim i As Long
Dim Location As String
Dim MsgDelete As String
Dim xCount As Integer
Dim xFound As Integer
Dim Cell As Range
Dim dict As Scripting.Dictionary
Set ws = ThisWorkbook.Sheets("Lists")
'Build Dictionary
Set dict = New Scripting.Dictionary
dict.CompareMode = vbTextCompare 'Capitalization does not apply to dictionary
For Each Cell In Range("Name").Cells 'Add named range to dictionary
With Cell
dict(Cell.Value) = Cell.Address(RowAbsolute:=False, ColumnAbsolute:=False) 'Key = Cell value (ie. Analyst name), Item = Cell address (ie. A2)
End With
Next Cell
Set xCount = RemoveAnalystLB.ListCount - 1
For i = xCount To 0 Step -1 'Reverse For Loop
If RemoveAnalystLB.Selected(i) Then
With ws
Location = dict(RemoveAnalystLB.List(i)) 'Find Cell location via dictionary function
xFound = xFound + 1
MsgDelete = MsgDelete & vbCrLf & RemoveAnalystLB.List(i)
.Range(Location).Delete Shift:=xlUp 'Delete cell at specified location
End With
End If
Next i
Set dict = Nothing
Unload Remove_Analyst_Form 'Close out userform
If xFound <> 0 Then MsgBox ("Analyst(s):" & MsgDelete & vbCrLf & "have been deleted from the database.") 'Msg names have been deleted
End Sub
【问题讨论】:
-
在这一行
Set xCount = RemoveAnalystLB.ListCount - 1你已经将 xCount 声明为 Integer,所以你不应该在这一行的开头使用 Set -
什么是
RemoveAnalystLB? -
这是我的列表框名称
标签: excel vba userform excel-2016