需要在这个宏中改变一件小事

时间:2015-06-26 19:34:33

标签: excel vba excel-vba

我有这个宏,它完全符合我的要求,除了一个改变。我希望它按列“M”而不是“A”排序。我已经尝试手动更改它,但我一直在收到错误。我知道这可能是一个简单的修复,但我似乎无法得到它。提前谢谢!

我试图将“Field:= 1”更改为Field:=“13”,但我得到“运行时错误'1004'范围类的AutoFilter方法失败”。

Debug然后突出显示“rngFilter.AutoFilter Field:= 13,Criteria1:= cell.Value”

Private Sub CommandButton1_Click()


Dim wbDest As Workbook
Dim rngFilter As Range, rngUniques As Range
Dim cell As Range


Set rngFilter = Range("A1", Range("A" & Rows.Count).End(xlUp))

Application.ScreenUpdating = False

With rngFilter


    .AdvancedFilter Action:=xlFilterInPlace, Unique:=True


    Set rngUniques = Range("A2", Range("A" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeVisible)


    ActiveSheet.ShowAllData

End With


For Each cell In rngUniques


    Set wbDest = Workbooks.Add(xlWBATWorksheet)


    rngFilter.AutoFilter Field:=1, Criteria1:=cell.Value


    rngFilter.EntireRow.Copy
    With wbDest.Sheets(1).Range("A1")
        .PasteSpecial xlPasteColumnWidths
        .PasteSpecial xlPasteValuesAndNumberFormats
    End With
    Application.CutCopyMode = True


    wbDest.Sheets(1).Name = cell.Value


    wbDest.SaveAs ThisWorkbook.Path & Application.PathSeparator & _
        cell.Value & " " & Format(Date, "mmm_dd_yyyy")

Next cell

rngFilter.Parent.AutoFilterMode = False
Application.ScreenUpdating = True

End Sub

2 个答案:

答案 0 :(得分:1)

试一试。我已经更新了代码,所以你需要做的就是将sColumn从A更改为你想要的任何列字母:

Private Sub CommandButton1_Click()

    Const sColumn As String = "A"

    Dim wbDest As Workbook
    Dim rngFilter As Range, rngUniques As Range
    Dim cell As Range

    Set rngFilter = Range(sColumn & "1", Range(sColumn & Rows.Count).End(xlUp))

    Application.ScreenUpdating = False

    With rngFilter
        .AdvancedFilter Action:=xlFilterInPlace, Unique:=True
        Set rngUniques = Range(sColumn & "2", Range(sColumn & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeVisible)
        On Error Resume Next
        ActiveSheet.ShowAllData
        On Error GoTo 0
    End With


    For Each cell In rngUniques
        Set wbDest = Workbooks.Add(xlWBATWorksheet)
        rngFilter.AutoFilter Field:=1, Criteria1:=cell.Value
        rngFilter.EntireRow.Copy
        With wbDest.Sheets(1).Range("A1")
            .PasteSpecial xlPasteColumnWidths
            .PasteSpecial xlPasteValuesAndNumberFormats
        End With
        Application.CutCopyMode = True
        wbDest.Sheets(1).Name = cell.Value
        Application.DisplayAlerts = False
        wbDest.SaveAs ThisWorkbook.Path & Application.PathSeparator & cell.Value & " " & Format(Date, "mmm_dd_yyyy")
        wbDest.Close False
        Application.DisplayAlerts = True
    Next cell

    rngFilter.Parent.AutoFilterMode = False
    Application.ScreenUpdating = True

End Sub

答案 1 :(得分:1)

尝试将此替换为您的调试错误:

ActiveSheet.Range("A1").CurrentRegion.AutoFilter Field:=13, Criteria1:=cell.Value

基本上,您的rngFilter变量似乎将您的范围限制为A列,并且您尝试根据超出此范围的列进行过滤。 让我知道它是否有效!