Vba 过滤并转移到另一张纸;“未发现任何细胞”;

Vba 过滤并转移到另一张纸;“未发现任何细胞”;,vba,excel,Vba,Excel,当我尝试在没有需要排除的日期(上个月)的情况下运行此代码时,出现一个错误,显示“未找到任何单元格”,我尝试添加“else msgbox”,但它无法运行。有人能帮我在代码中添加其他条件吗。 谢谢 子排除日期() 将sh设置为工作表,ws设置为工作表 设置sh=工作表(“原始数据”)'将工作表设置为筛选 设置ws=工作表(“排除”)'将工作表设置为粘贴 ws.Range(“AD1”,ws.Cells(ws.Rows.count,“A”).End(xlUp)).clearcontents'您可以使用错

当我尝试在没有需要排除的日期(上个月)的情况下运行此代码时,出现一个错误,显示“未找到任何单元格”,我尝试添加“else msgbox”,但它无法运行。有人能帮我在代码中添加其他条件吗。 谢谢

子排除日期()
将sh设置为工作表,ws设置为工作表
设置sh=工作表(“原始数据”)'将工作表设置为筛选
设置ws=工作表(“排除”)'将工作表设置为粘贴

ws.Range(“AD1”,ws.Cells(ws.Rows.count,“A”).End(xlUp)).clearcontents'您可以使用错误处理。将“错误转到错误手”放在您期望抛出错误的行之前

Option Explicit

Sub ExclusionDates()

    Dim sh As Worksheet, ws As Worksheet

    Set sh = Worksheets("Raw Data")              'set the sheet to filter
    Set ws = Worksheets("Exclusion")             'set the sheet to paste
    ws.Range("AD1", ws.Cells(ws.Rows.Count, "A").End(xlUp)).ClearContents '<--| clear "paste" sheet columns A:L cells from row 1 down to column A last not empty one

    '    Application.ScreenUpdating = False

    With sh                                      '<--| reference your "copy" sheet
        With .Range("AD1", .Cells(.Rows.Count, "A").End(xlUp)) '<--| reference its columns A:L cells from row 1 down to column A last not empty cell
            .AutoFilter field:=10, Criteria1:=xlFilterLastMonth, Operator:=xlFilterDynamic

            On Error GoTo ErrHand:
            If Application.WorksheetFunction.Subtotal(103, .Cells) > 1 Then
                .SpecialCells(xlCellTypeVisible).Copy ws.Cells(ws.Rows.Count, "A").End(xlUp).Offset(0) '<--| if any cell filtered other than headers (which get always filtered) then copy filtered values to "paste" sheet
                .Resize(.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete '

            End If

        End With
        .AutoFilterMode = False
    End With

    '    Application.ScreenUpdating = True

    Exit Sub

ErrHand:

    If Err.Number = 1004 Then                    'could use 1004 here

        MsgBox "No cells found"
        Err.Clear
    Else
        Debug.Print Err.Description

    End If

End Sub
选项显式
分项日期()
将sh设置为工作表,ws设置为工作表
设置sh=工作表(“原始数据”)'将工作表设置为筛选
设置ws=工作表(“排除”)'将工作表设置为粘贴

ws.Range(“AD1”,ws.Cells(ws.Rows.Count,“A”).End(xlUp)).ClearContents'您可以使用错误处理。将“错误转到错误手”放在您期望抛出错误的行之前

Option Explicit

Sub ExclusionDates()

    Dim sh As Worksheet, ws As Worksheet

    Set sh = Worksheets("Raw Data")              'set the sheet to filter
    Set ws = Worksheets("Exclusion")             'set the sheet to paste
    ws.Range("AD1", ws.Cells(ws.Rows.Count, "A").End(xlUp)).ClearContents '<--| clear "paste" sheet columns A:L cells from row 1 down to column A last not empty one

    '    Application.ScreenUpdating = False

    With sh                                      '<--| reference your "copy" sheet
        With .Range("AD1", .Cells(.Rows.Count, "A").End(xlUp)) '<--| reference its columns A:L cells from row 1 down to column A last not empty cell
            .AutoFilter field:=10, Criteria1:=xlFilterLastMonth, Operator:=xlFilterDynamic

            On Error GoTo ErrHand:
            If Application.WorksheetFunction.Subtotal(103, .Cells) > 1 Then
                .SpecialCells(xlCellTypeVisible).Copy ws.Cells(ws.Rows.Count, "A").End(xlUp).Offset(0) '<--| if any cell filtered other than headers (which get always filtered) then copy filtered values to "paste" sheet
                .Resize(.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete '

            End If

        End With
        .AutoFilterMode = False
    End With

    '    Application.ScreenUpdating = True

    Exit Sub

ErrHand:

    If Err.Number = 1004 Then                    'could use 1004 here

        MsgBox "No cells found"
        Err.Clear
    Else
        Debug.Print Err.Description

    End If

End Sub
选项显式
分项日期()
将sh设置为工作表,ws设置为工作表
设置sh=工作表(“原始数据”)'将工作表设置为筛选
设置ws=工作表(“排除”)'将工作表设置为粘贴

ws.Range(“AD1”,ws.Cells(ws.Rows.Count,“A”).End(xlUp)).ClearContents'我认为缺陷在

If Application.WorksheetFunction.Subtotal(103, .Cells) > 1
这将始终返回True,因为它将检查引用范围(从A列到AD列的某个范围)中有多少单元格可见,因此始终返回至少30(列数标题)

所以你可能想用

If Application.WorksheetFunction.Subtotal(103, .Columns(1)) > 1 
下面是正确的代码行和
Else
以及一些其他注释

Option Explicit

Sub ExclusionDates()

    Dim sh As Worksheet, ws As Worksheet

    Set sh = Worksheets("Raw Data") 'set the sheet to filter
    Set ws = Worksheets("Exclusion") 'set the sheet to paste
    ws.Range("AD1", ws.Cells(ws.Rows.count, "A").End(xlUp)).ClearContents '<--| clear "paste" sheet columns A:L cells from row 1 down to column A last not empty one


    With sh '<--| reference your "copy" sheet
        With .Range("AD1", .Cells(.Rows.count, "A").End(xlUp)) '<--| reference its columns A:AD cells from row 1 down to column A last not empty cell
            .AutoFilter field:=10, Criteria1:=xlFilterLastMonth, Operator:=xlFilterDynamic
            If Application.WorksheetFunction.Subtotal(103, .Columns(1)) > 1 Then '<--| if any cell on column A filtered other than header (which gets always filtered)
                .SpecialCells(xlCellTypeVisible).Copy ws.Cells(ws.Rows.count, "A").End(xlUp).Offset(0) '<--| copy filtered values to "paste" sheet
                .Resize(.Rows.count - 1).Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete ''<--| delete filtered values rows
            Else
                MsgBox "No Data found"
            End If
        End With
        .AutoFilterMode = False
    End With

End Sub
选项显式
分项日期()
将sh设置为工作表,ws设置为工作表
设置sh=工作表(“原始数据”)'将工作表设置为筛选
设置ws=工作表(“排除”)'将工作表设置为粘贴

ws.Range(“AD1”,ws.Cells(ws.Rows.count,“A”).End(xlUp)).ClearContents'我认为缺陷在

If Application.WorksheetFunction.Subtotal(103, .Cells) > 1
这将始终返回True,因为它将检查引用范围(从A列到AD列的某个范围)中有多少单元格可见,因此始终返回至少30(列数标题)

所以你可能想用

If Application.WorksheetFunction.Subtotal(103, .Columns(1)) > 1 
下面是正确的代码行和
Else
以及一些其他注释

Option Explicit

Sub ExclusionDates()

    Dim sh As Worksheet, ws As Worksheet

    Set sh = Worksheets("Raw Data") 'set the sheet to filter
    Set ws = Worksheets("Exclusion") 'set the sheet to paste
    ws.Range("AD1", ws.Cells(ws.Rows.count, "A").End(xlUp)).ClearContents '<--| clear "paste" sheet columns A:L cells from row 1 down to column A last not empty one


    With sh '<--| reference your "copy" sheet
        With .Range("AD1", .Cells(.Rows.count, "A").End(xlUp)) '<--| reference its columns A:AD cells from row 1 down to column A last not empty cell
            .AutoFilter field:=10, Criteria1:=xlFilterLastMonth, Operator:=xlFilterDynamic
            If Application.WorksheetFunction.Subtotal(103, .Columns(1)) > 1 Then '<--| if any cell on column A filtered other than header (which gets always filtered)
                .SpecialCells(xlCellTypeVisible).Copy ws.Cells(ws.Rows.count, "A").End(xlUp).Offset(0) '<--| copy filtered values to "paste" sheet
                .Resize(.Rows.count - 1).Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete ''<--| delete filtered values rows
            Else
                MsgBox "No Data found"
            End If
        End With
        .AutoFilterMode = False
    End With

End Sub
选项显式
分项日期()
将sh设置为工作表,ws设置为工作表
设置sh=工作表(“原始数据”)'将工作表设置为筛选
设置ws=工作表(“排除”)'将工作表设置为粘贴

ws.Range(“AD1”,ws.Cells(ws.Rows.count,“A”).End(xlUp)).ClearContents“上个月,当您尝试过滤时,您希望看到什么情况?另外,我们能看到一些样本数据吗?是否实际应用了过滤器?我想你是在清除A:AD,然后试图过滤它。我上个月排除了它,我需要过滤它并转移到另一张表,这是“排除”。我要问的是,当我试图运行的数据上个月没有时,我会遇到一个错误,说“没有找到单元格”,我想使用else语句,这样每当上个月没有数据时,就会有一个消息框告诉我没有找到数据。我无法获得确切的语法来执行此操作。上个月,当您尝试不使用筛选器进行筛选时,您希望看到什么结果?另外,我们能看到一些样本数据吗?是否实际应用了过滤器?我想你是在清除A:AD,然后试图过滤它。我上个月排除了它,我需要过滤它并转移到另一张表,这是“排除”。我要问的是,当我试图运行的数据上个月没有时,我会遇到一个错误,说“没有找到单元格”,我想使用else语句,这样每当上个月没有数据时,就会有一个消息框告诉我没有找到数据。我找不到确切的语法来做这件事。很好there@Qharr,那么,让我们等待aicirtap的反馈,看看这是否是真正的问题!谢谢@QHarr,它现在是有意义的,是的,它正在工作,只想再问一个问题,我需要在我的代码中添加一个标准。我还需要添加一个(Criteria2:=xlLastyear)来过滤去年或过去几年的所有数据。我尝试添加该语法,但不起作用。这是@DisplayName的答案:-)尽管我很乐意阅读:-)抱歉@DisplayName我忽略了它。你能帮我解决另一个问题吗?谢斯韦尔斑点there@Qharr,那么,让我们等待aicirtap的反馈,看看这是否是真正的问题!谢谢@QHarr,它现在是有意义的,是的,它正在工作,只想再问一个问题,我需要在我的代码中添加一个标准。我还需要添加一个(Criteria2:=xlLastyear)来过滤去年或过去几年的所有数据。我尝试添加该语法,但不起作用。这是@DisplayName的答案:-)尽管我很乐意阅读:-)抱歉@DisplayName我忽略了它。你能帮我解决另一个问题吗?thanksOn哪一个字段是(Criteria2:=xlLastyear)?它是同一字段上的And条件吗?.AutoFilter字段:=10,Criteria1:=xlFilterLastMonth,运算符:=xlOr,Criteria2:=xlLastyear哪个字段是(Criteria2:=xlLastyear)?它是同一字段上的And条件吗?.AutoFilter字段:=10,Criteria1:=xlFilterLastMonth,运算符:=xlOr,Criteria2:=XLLastMonth