我有一些 VBA 代码,可以过滤一些数据,在总计一列之前删除一些列和行。
我现在想要实现的是在总计之前出现一个弹出窗口,其中包含特定列中存在的所有项目的列表,以便用户可以选择他们想要的项目,然后删除他们不想要的项目。
例如,一列有一个名称列表,我想要一个弹出窗口给我提供名称列表(这可能每次都会更改,因此需要从列中获取列表)用户检查他们想要的名称,然后删除包含他们没有选择的名称的所有行都保留他们选择的名称。
姓名 | 得分 |
---|---|
约翰 | 1 |
保罗 | 4 |
约翰 | 1 |
马克 | 4 |
保罗 | 6 |
彼得 | 1 |
马克 | 7 |
这应该给用户一个弹出窗口,其中包含 John、Paul Mark 和 Peter 作为选择。
如果用户选择 Paul 和 Peter,则所有包含 Mark 和 John 的行都将被删除。
我用来根据列内容删除行的代码是:
Public Sub del_Name()
Dim BarrToCheck As Variant
BarrToCheck = Array("Name.", "Paul", "John")
Dim q As Range 'create range
For Each q In ActiveSheet.UsedRange.Columns("A").Cells 'loop through range
If Len(q.Value) > 0 Then 'if value is more than 0 characters (not empty)
If Not BisInArray(q.Value, BarrToCheck) Then 'check if not in array
q.Value = "#N/A" 'make it #N/A
End If
End If
Next
Columns("A").SpecialCells(xlConstants, xlErrors).EntireRow.Delete
End Sub
但是我不知道如何在运行宏时创建一个弹出窗口,以允许用户选择要保留哪些名称以及将哪些名称放入数组中以进行行删除。
任何帮助或指出正确的方向将不胜感激。
谢谢
为您的 VBA 项目创建一个名为
Userform1
的用户窗体和一个名为 Listbox1
的列表框。
使用此代码可以将其附加到您的 Sub 或用作具有返回值的函数
seled()
数组,其中将包含表的选定名称。然后你可以使用 BarrToCheck 来代替。
Sub selector()
Dim dropdown As MSForms.ListBox
Set dropdown = UserForm1.ListBox1
Set namerange = Range(ActiveSheet.Range("A2"), ActiveSheet.Range("A2").End(xlDown))
namearray = WorksheetFunction.Unique(namerange)
dropdown.List = namearray
dropdown.MultiSelect = fmMultiSelectMulti
UserForm1.Show
ReDim seled(dropdown.ListCount - 1)
j = 0
For i = 0 To dropdown.ListCount - 1
If dropdown.Selected(i) Then
seled(j) = dropdown.List(i)
j = j + 1
End If
Next i
If j = 0 Then MsgBox "No selection", vbCritical: Exit Sub Else ReDim Preserve seled(j - 1)
End Sub