【问题标题】:VBA Listbox Unique ValuesVBA 列表框唯一值
【发布时间】:2017-08-30 09:09:54
【问题描述】:

我正在尝试创建一个宏,允许我通过使用用户窗体和列表框选择它们来从数据库中报告某些客户端。我目前一直在寻找一种方法来选择某些客户端,但要处理该客户端下列出的每一行。

我使用的脚本将所有唯一值存储在一个集合中。我不确定如何在运行命令按钮中调用集合来处理与选定客户端相关的所有行,这意味着如果我要在附加图像中选择 CLN1 和 CLN3,我想要行 2:6 和 10 :12 已处理,其余已删除。

有没有办法做到这一点?

这是我正在使用的代码:

Private Sub UserForm_Initialize()

Dim i, rowrow As Integer
Dim Cell As Range
Dim Unique As New Collection
Dim Item As Range

LastNonEmptyRow = ThisWorkbook.Worksheets("myfile").Range("A1").End(xlDown).Row

On Error Resume Next
For Each Cell In ThisWorkbook.Worksheets("myfile").Range("A2:A" & rowrow)
    Unique.Add Cell, CStr(Cell)
Next Cell
On Error GoTo 0

For Each Item In Unique
   ListBox1.AddItem Item
Next Item

End Sub

任何帮助将不胜感激 - 谢谢!

Spreadsheet example

截图

【问题讨论】:

  • 您可以使用脚本字典代替集合并将行存储在值中(您可以在循环遍历行时使用 Application.Union 构建 Range 对象)。使 Dictionary 对表单全局化,这样它就不会在 UserForm_Initialize 执行完毕后立即超出范围。
  • 请参阅stackoverflow.com/questions/36274110/…,了解此方法的示例。
  • 您使用的是哪个变量? rowrow 还是 LastNonEmptyRow?你设置Option Explicit了吗?

标签: vba listbox userform


【解决方案1】:

假设您的运行命令按钮在Run_Btn 之后被调用,那么您可以在您的用户表单代码窗格中从以下代码开始:

Private Sub UserForm_Initialize()

    Dim i As Long, rowrow As Long, LastNonEmptyRow As Long
    Dim Cell As Range
    Dim Unique As New Collection
    Dim Item As Range

    LastNonEmptyRow = ThisWorkbook.Worksheets("myfile").Cells(Rows.Count, 1).End(xlUp).Row

    On Error Resume Next
    For Each Cell In ThisWorkbook.Worksheets("myfile").Range("A2:A" & LastNonEmptyRow)
        Unique.Add Cell, CStr(Cell)
    Next Cell
    On Error GoTo 0

    For Each Item In Unique
       ListBox1.AddItem Item
    Next Item
End Sub

Private Sub Run_Btn_Click()
    Dim deletedClients As String
    Dim i As Long

    With Me.ListBox1
        For i = 0 To .ListCount - 1
            If Not .Selected(i) Then deletedClients = deletedClients & .List(i) & " "
        Next
    End With
    If deletedClients <> "" Then ProcessData deletedClients
End Sub

Sub ProcessData(deletedClients As String)
    With ThisWorkbook.Worksheets("myfile")
        With .Range("A1", .Cells(.Rows.Count, 1).End(xlUp))
            DeleteData .Cells, deletedClients '<--| delete unselected clients records

            ' your code to "Process" remaining data

        End With
    End With
End Sub

Sub DeleteData(rng As Range, deletedClients As String)
    With rng
        .AutoFilter Field:=1, Criteria1:=Split(Trim(deletedClients), " "), Operator:=xlFilterValues
        If Application.WorksheetFunction.Subtotal(103, .Cells) > 1 Then .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible).EntireRow.Delete
        .Parent.AutoFilterMode = False
    End With
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 2020-11-27
    相关资源
    最近更新 更多