使用通配符防止小计行被过滤和复制 excel vba
using a wildcard to prevent subtotal line from being filtered and copied excel vba
我有一个销售人员列表被过滤并将所有过滤后的数据移动到它自己的分布sheet。我遇到的问题是宏也在过滤小计行,因此它创建了一个没有数据的 sheet 并且它还造成了 sheet 太大我无法保存文件的情况。
我写了一些代码,我认为这些代码会阻止以 "Sheet" 开头的任何工作sheet 不被过滤,但我不知道如何在字符串中使用通配符。需要通配符,因为 "Sheet #" 因月份而异。
Dim Sht As Worksheet
Dim Rng As Range
Dim List As Collection
Dim varValue As Variant
Dim E As Long
' // Set your Sheet name
Set Sht = Application.ActiveSheet
' // set your auto-filter, A6
With Sht.Range("A2")
.AutoFilter
End With
' // Set your agent Column range # (2) that you want to filter it
Set Rng = Range(Sht.AutoFilter.Range.Columns(22).Address)
ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort.SortFields.Add
Key:=Range _
("V:V"), SortOn:=xlSortOnValues, Order:=xlAscending,
DataOption:= _
xlSortTextAsNumbers
With ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
' // Create a new Collection Object
Set List = New Collection
' // Fill Collection with Unique Values
On Error Resume Next
For E = 2 To Rng.Rows.Count
List.Add Rng.Cells(E, 1), CStr(Rng.Cells(E, 1))
Next E
' // Start looping in through the collection Values
For Each varValue In List
' // Filter the Autofilter to macth the current Value
'Rng.AutoFilter Field:=22, Criteria1:=varValue, _
' Operator:=xlAnd, Criteria2:="<>"
Rng.AutoFilter Field:=22, Criteria1:="<>Sheet*", _
Operator:=xlAnd, Criteria2:=varValue
' // Copy the AutoFiltered Range to new Workbook
'If List = (Blanks) Then
Sht.AutoFilter.Range.Copy
Criteria1:="<>Sheet*" 代码是我尝试做的,上面的代码是以前的代码。所以我的问题是如何防止创建小计行 sheet?
不要将 sheet 名称添加到自动筛选条件。在自动过滤之前只需检查 sheet 名称即可。
If Not ActiveSheet.Name Like "Sheet*" Then
'Do whatever you need to do
End If
另一方面,如果您想包含 sheet 个以 sheet:
开头的名称,您可以删除 Not
关键字
If ActiveSheet.Name Like "Sheet*" Then
因此,在使用代码一段时间后,我意识到对 "Sheet*" 使用通配符是行不通的,因为所有筛选结果首先都以 "Sheet" 开头。但是通过添加
在 Rng.AutoFilter Field:=22, Criteria1:="<>Sheet*", Operator:=xlAnd, Criteria2:=varValue
之后 If varValue <> "" Then
(表示如果筛选结果不为空则继续代码)
它解决了这个问题。现在代码成功地跳过了小计行。
将时间戳附加到您的工作表名称字符串。基本思路是使用"time"函数,即时间(现在),其中时间可以提取为yy,mm,dd,hh,ss
。单独定义变量字符串以存储每个所需的时间组件。然后,创建一个像 sheetname= myname string+my dd+ my hh....
这样的名称 我认为如果您尝试将时间结果直接添加到您的工作表名称字符串中可能会出现问题,因此请先保存时间结果,然后组合字符串。
我喜欢通过 sheets(1).name ="blank"
设置我的工作簿来开始我的项目。隐藏它、取消隐藏它并永久复制它。
祝你好运。
我有一个销售人员列表被过滤并将所有过滤后的数据移动到它自己的分布sheet。我遇到的问题是宏也在过滤小计行,因此它创建了一个没有数据的 sheet 并且它还造成了 sheet 太大我无法保存文件的情况。
我写了一些代码,我认为这些代码会阻止以 "Sheet" 开头的任何工作sheet 不被过滤,但我不知道如何在字符串中使用通配符。需要通配符,因为 "Sheet #" 因月份而异。
Dim Sht As Worksheet
Dim Rng As Range
Dim List As Collection
Dim varValue As Variant
Dim E As Long
' // Set your Sheet name
Set Sht = Application.ActiveSheet
' // set your auto-filter, A6
With Sht.Range("A2")
.AutoFilter
End With
' // Set your agent Column range # (2) that you want to filter it
Set Rng = Range(Sht.AutoFilter.Range.Columns(22).Address)
ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort.SortFields.Add
Key:=Range _
("V:V"), SortOn:=xlSortOnValues, Order:=xlAscending,
DataOption:= _
xlSortTextAsNumbers
With ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
' // Create a new Collection Object
Set List = New Collection
' // Fill Collection with Unique Values
On Error Resume Next
For E = 2 To Rng.Rows.Count
List.Add Rng.Cells(E, 1), CStr(Rng.Cells(E, 1))
Next E
' // Start looping in through the collection Values
For Each varValue In List
' // Filter the Autofilter to macth the current Value
'Rng.AutoFilter Field:=22, Criteria1:=varValue, _
' Operator:=xlAnd, Criteria2:="<>"
Rng.AutoFilter Field:=22, Criteria1:="<>Sheet*", _
Operator:=xlAnd, Criteria2:=varValue
' // Copy the AutoFiltered Range to new Workbook
'If List = (Blanks) Then
Sht.AutoFilter.Range.Copy
Criteria1:="<>Sheet*" 代码是我尝试做的,上面的代码是以前的代码。所以我的问题是如何防止创建小计行 sheet?
不要将 sheet 名称添加到自动筛选条件。在自动过滤之前只需检查 sheet 名称即可。
If Not ActiveSheet.Name Like "Sheet*" Then
'Do whatever you need to do
End If
另一方面,如果您想包含 sheet 个以 sheet:
开头的名称,您可以删除Not
关键字
If ActiveSheet.Name Like "Sheet*" Then
因此,在使用代码一段时间后,我意识到对 "Sheet*" 使用通配符是行不通的,因为所有筛选结果首先都以 "Sheet" 开头。但是通过添加
在Rng.AutoFilter Field:=22, Criteria1:="<>Sheet*", Operator:=xlAnd, Criteria2:=varValue
之后 If varValue <> "" Then
(表示如果筛选结果不为空则继续代码)
它解决了这个问题。现在代码成功地跳过了小计行。
将时间戳附加到您的工作表名称字符串。基本思路是使用"time"函数,即时间(现在),其中时间可以提取为yy,mm,dd,hh,ss
。单独定义变量字符串以存储每个所需的时间组件。然后,创建一个像 sheetname= myname string+my dd+ my hh....
这样的名称 我认为如果您尝试将时间结果直接添加到您的工作表名称字符串中可能会出现问题,因此请先保存时间结果,然后组合字符串。
我喜欢通过 sheets(1).name ="blank"
设置我的工作簿来开始我的项目。隐藏它、取消隐藏它并永久复制它。
祝你好运。