从列表框中提取值

时间:2017-03-30 18:10:32

标签: vba excel-vba excel

我在VBA中创建了一个带有2个ListBox的UserForm。

Screenshot of UserForm

我想要做的是从右侧ListBox中提取值(并将它们保存在temp中)并删除包含这些名称的另一个工作表中的每一行。

编写代码来删除行不是问题。我不知道如何在另一个VBA模块中使用这些选定的项目。有什么想法吗?

4 个答案:

答案 0 :(得分:0)

您可以将它们保存在Collection中,然后将该Collection用作其他Procedure中的参数。

答案 1 :(得分:0)

更新以反向处理行(因为删除会将行向上移动)。请参阅代码顶部的注释。

Option Explicit

Sub cmdDelete_Click()
    ' This subroutine will allow a user to delete selected rows from an Excel sheet.
    ' In a multi-select listbox on a user form, select the items that you want to delete.
    ' Click the 'Delete' button on the form and the following will occur:
    ' a. Each selected item will be delimited and concatenated into one string.
    '    (The reason for doing that is to avoid spinning thru each listbox item for
    '    every row)
    ' b. Each row in the selected range will have it's value checked within the string.
    ' c. If found. the row will be deleted.
    '
    ' Notes: - Need to loop thru the rows from bottom upwards to top because
    '          as each row is deleted, it will shift remainder upwards.
    '        - You don't really need the delimiters if values can never be confused

    Dim sList       As String
    Dim lItem       As Long
    Dim r           As Range
    Dim ws          As Worksheet
    Dim lFirstRow   As Long
    Dim lLastRow    As Long
    Dim lRow        As Long

    For lItem = 0 To lstCountries.ListCount - 1
        If lstCountries.Selected(lItem) = True Then
            sList = sList & "<" & Me.lstCountries.column(0, lItem) & ">"     ' Adjust to the column YOU want (relative to zero)
        End If
    Next
    Debug.Print "Full List to Delete: " & sList

    Set ws = ThisWorkbook.Sheets("Sheet1")      ' Change to YOUR worksheet name
    ' Find the last used row
    lLastRow = Cells.Find(What:="*", after:=Range("A1"), SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    lFirstRow = 2                               ' Set to YOUR first used row

    ' Spin thru all rows in the range of rows
    ' Go in reverse order since the Delete will shift the rows UP
    For lRow = lLastRow To lFirstRow Step -1
        ' See if row value exists in the selections made in the listbox
        If InStr(1, sList, "<" & ws.Cells(lRow, 1) & ">") > 0 Then
            ws.Rows(lRow).Delete            ' Delete row if a match is found
        End If
    Next lRow
End Sub

答案 2 :(得分:0)

实际上我希望我的代码看起来更像这样:

For Each c In Range
    If c.Value = [any of values from list box] Then
        c.EntireRow.Delete
    End If
Next c

答案 3 :(得分:0)

此代码解决了我的问题

Private Sub delete_button_Click()

On Error Resume Next

Dim custom_range(1 To 5) As Range

Set custom_range(1) = ActiveWorkbook.Sheets("Countries").Columns(5).Cells
Set custom_range(2) = ActiveWorkbook.Sheets("Operations").Columns(2).Cells
Set custom_range(3) = ActiveWorkbook.Sheets("Costs").Columns(2).Cells
Set custom_range(4) = ActiveWorkbook.Sheets("Revenue").Columns(2).Cells
Set custom_range(5) = ActiveWorkbook.Sheets("FS").Columns(2).Cells

For i = 0 To ListBox_selected_countries.ListCount - 1
    country_to_delete = ListBox_selected_countries.List(i)

    For j = 1 To 5
    Set active_range = custom_range(j)
        For Each c In active_range
            If c.Value = country_to_delete Then
                c.EntireRow.delete
            End If
        Next c
    Next j

Next i

End Sub