使用通配符来防止小计行被过滤和复制excel vba

时间:2018-03-03 20:06:28

标签: excel vba excel-vba filtering copy-paste

我的情况是,我有一个销售人员列表被过滤并将所有过滤后的数据移动到它自己的电子表格中。我遇到的问题是宏也过滤了小计行,所以它创建了一个没有数据的工作表,它也创建了一个工作表很大的情况我无法保存文件。

我写了一些代码,我认为这会阻止任何以“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:=“&lt;&gt; Sheet *”代码是我尝试做的,上面的代码就是之前的代码。所以我的问题是如何防止创建小计行表?

Example of how the first tab

3 个答案:

答案 0 :(得分:0)

不要将工作表名称添加到自动筛选条件。只需在自动过滤之前检查工作表名称。

If Not ActiveSheet.Name Like "Sheet*" Then
    'Do whatever you need to do
End If

另一方面,如果您想要包含以工作表开头的工作表名称,则可以删除Not关键字:

If ActiveSheet.Name Like "Sheet*" Then

答案 1 :(得分:0)

因此,在使用代码一段时间后,我意识到使用通配符“Sheet *”将无法工作,因为所有过滤结果首先以“Sheet”开头。但是添加

console.log([] == []) // false, different object reference console.log(['test'] == ['test']) // false console.log('test' == 'test') // true, both are primitive console.log(['test'].toString()) // 'test' console.log(['test'] == 'test') // true, ['test'] converted to 'test' due to == console.log(['test'] === 'test') // false, strict comparison without type conversion // More amazing JS tricks! console.log([] == 0) // true console.log([] == '') // true console.log('' == 0) // true console.log('' == false) // true console.log(false == 0) // true console.log([] == false) // true // OOOPS... console.log({} != true) // true console.log({} != false) // true // as you see here, NEVER USE == ! use === instead(表示如果过滤后的结果不是空白而不是继续代码)If varValue <> "" Then之后

它解决了这个问题。现在,代码成功跳过了小计行。

答案 2 :(得分:0)

在工作表名称字符串中附加时间戳。基本思想是使用“时间”功能,即时间(现在),其中时间可以提取为yy,mm,dd,hh,ss。单独定义变量字符串以存储每个所需的时间组件。然后,创建一个类似sheetname= myname string+my dd+ my hh....的名称我认为如果您尝试将时间结果直接添加到工作表名称字符串,则可能会出现问题,因此请先保存时间结果,然后组合字符串。

我想通过使用sheets(1).name ="blank"设置工作簿来启动项目。隐藏它,取消隐藏它,并永久复制它。 祝你好运。