我从复活节假期回来了,感谢你的帮助我解决了这个问题,
它有一个根据列表表中可用的列定义过滤器的表。它将数据保存在字典中,因此用户是否将列添加到列表表中并不重要。以下是其他人可能会觉得有用的代码。
Sub filterCreation()
Dim lColumn As Long
rowHeader = 2 ' HEader row in list sheet
rowHeader2 = 1 'header row in filter sheet
Set ws = ThisWorkbook.Sheets("List")
Set ws2 = ThisWorkbook.Sheets("Filter")
lColumn = ws.Cells(rowHeader, Columns.Count).End(xlToLeft).column
Set columnHeader = CreateObject("Scripting.Dictionary")
Set filterDict = CreateObject("Scripting.Dictionary")
Dim temp() As Variant
lRow = ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row
For i = rowHeader2 To lRow
lcolumn2 = ws2.Cells(i, Columns.Count).End(xlToLeft).column
If lcolumn2 > 1 Then
ReDim temp(lcolumn2 - 2)
For j = 2 To lcolumn2
temp(j - 2) = ws2.Cells(i, j)
Next j
Else
temp = Array(Empty)
End If
filterDict.Add CStr(ws2.Cells(i, 1).Value), temp
Next i
tempCol = ws2.Cells(1, Columns.Count).End(xlToLeft).column
ws2.Range(ws2.Cells(rowHeader2 + 1, 1), ws2.Cells(lRow, tempCol)).Clear
'Refill the sheet
For i = 1 To lColumn
'columnHeader.Add ws.Cells(rowHeader, i), ""
If filterDict.Exists(CStr(ws.Cells(rowHeader, i).Value)) Then
b = filterDict.Item(CStr(ws.Cells(rowHeader, i).Value))
For k = LBound(b) To UBound(b)
ws2.Cells(rowHeader2 + i, k + 2).Value = b(k)
Next k
End If
'column header to excel sheet
ws2.Cells(rowHeader2 + i, 1).Value = ws.Cells(rowHeader, i).Value
Next i
'Set columnHeader = Nothing
Set filterDict = Nothing
End Sub
此外,我还在列表表中自动添加了按钮以激活过滤器:
Sub CreateButtons()
'On Error Resume Next
Set ws2 = ThisWorkbook.Sheets("Filter")
Set ws1 = ThisWorkbook.Sheets("List")
For Each wShape In ws1.Shapes
wShape.Delete
Next wShape
rowHeader2 = 1
lcolumn2 = ws2.Cells(rowHeader2, Columns.Count).End(xlToLeft).column
tempName = "All"
ws1.Buttons.Add(20, 20, 81, 36).Name = tempName
ws1.Shapes(tempName).OnAction = "Unhide_All_Columns"
ws1.Shapes(tempName).Placement = xlFreeFloating
ws1.Shapes(tempName).Select
Selection.Characters.Text = "All"
tempName = "ShowGUI"
ws1.Buttons.Add(120, 20, 81, 36).Name = tempName
ws1.Shapes(tempName).OnAction = "loadGUI"
ws1.Shapes(tempName).Placement = xlFreeFloating
ws1.Shapes(tempName).Select
Selection.Characters.Text = "Show GUI"
For i = 2 To lcolumn2
tempName = CStr(ws2.Cells(rowHeader2, i).Value)
ws1.Buttons.Add(15 + i * 100, 20, 81, 36).Name = tempName
ws1.Shapes(tempName).OnAction = "Tester"
ws1.Shapes(tempName).Placement = xlFreeFloating
ws1.Shapes(tempName).Select
Selection.Characters.Text = tempName
'ws2.Shapes(tempName).Characters.Text = CStr(ws2.Cells(rowHeader2, i).Value)
Next i
End Sub