【问题标题】:Excel VBA Macro to filter the file and copy it on new workbookExcel VBA 宏过滤文件并将其复制到新工作簿上
【发布时间】:2016-06-17 04:30:45
【问题描述】:

我对 VBA 编程非常陌生,并试图在 excel 中编写 VBA 代码 此代码将按 Criteria1:="=*001" 过滤我的文件并将所有唯一值复制到名为 AV 的新工作簿并保存。现在,我还想将Criteria1:="<>*001" 的所有值复制到名为 LC 的新工作簿并保存。

这是我在这个网站上找到的代码并尝试对其进行修改,但不知道如何将ELSE 用于Criteria1:="<>*001"

Sub sort()
On Error Resume Next
Application.DisplayAlerts = False

Dim new_book As Workbook
Dim newsheet As Worksheet

With ThisWorkbook.Sheets("NRM_Homing_Upload")  'Replace the sheet name with the raw data sheet name

    Set newsheet = ThisWorkbook.Sheets("TempSheet")

        If newsheet Is Nothing Then
                Worksheets.Add.Name = "TempSheet"
            Else
                ThisWorkbook.Sheets("TempSheet").Delete
                Worksheets.Add.Name = "TempSheet"
        End If

            .Columns("H").Copy

                With ThisWorkbook.Sheets("cal")
                    .Range("A1").PasteSpecial (xlPasteAll)
                    .Columns("H").RemoveDuplicates Columns:=1, Header:=xlYes
                End With

                        For Each cell In ThisWorkbook.Sheets("TempSheet").Columns("a").Cells
                            i = i + 1
                                If i <> 1 And cell.Value <> "" Then
                                    .AutoFilterMode = False
                                    .Rows(1).AutoFilter field:=8, Criteria1:="=*001"
                                    Set new_book = Workbooks.Add
                                    .UsedRange.Copy
                                    new_book.Sheets(1).Range("a1").PasteSpecial (xlPasteAll)
                                    'new_book.SaveAs Filename:=ThisWorkbook.Path & "\" & cell.Value & ".xlsx"
                                    new_book.SaveAs Filename:="C:\Desktop\excel\test\AV.xlsx"
                                    new_book.Sheets(1).UsedRange.Columns.AutoFit
                                    new_book.Save
                                    new_book.Close

                                End If
                        Next cell



                            ThisWorkbook.Sheets("TempSheet").Delete
End With

End Sub

感谢任何帮助。 谢谢

【问题讨论】:

  • 您真的要遍历临时表 A 列中的所有行并在每次单元格 "" 时进行过滤吗?或者您是否只想过滤两次 - 一次用于 =*001once for &lt;&gt;*001 并创建两个工作簿? TempSheet 是如何填充数据的?我在您的代码中看到的只是您添加了工作表,但它永远不会填充数据。
  • 工作表“cal”中有什么?为什么要将 NRM_Homing_Upload.columns("H") 复制到 cal.columns("A"),然后从 cal.Columns("H") 中删除重复项?当您在 TempSheet 上运行 for 循环时,看起来您正在处理一张空工作表,因为您还没有在其中放入任何内容。如果您只有两组要查找的值,为什么要遍历 TempSheet 中的所有单元格?您的 with 语句的方式是自动过滤“NRM_Homing_Upload”,而不是临时表,这是您想要做的吗?
  • 好的 - 但您只将 H 列从 NRM_Homing_Upload 复制到 TempSheet 到 A 列。然后从 H 列中删除重复项?您的意思是从TempSheet 的 A 列中删除欺骗。所以你的两个工作簿每个只有一列数据?
  • 嗨,斯科特,我想完全按照您的要求做,但我不知道该怎么做。此外,它不是“cal”它的模板。抱歉忘记改了。当我运行它时,它会填充数据并将其保存为 AV.xlsx。从工作表“NRM_Homing_Upload”中,它根据条件过滤列 H,并将所有列从 A 复制到 S 到具有过滤结果的新工作簿。
  • 是的,它会从 TempSheet 的 A 列中删除重复项

标签: excel vba


【解决方案1】:

根据您的原始问题和 cmets,这里有几件事:

  1. 无需为此创建临时表。您可以在制作新书后就地过滤列表并删除重复项
  2. 您不需要遍历每个单元格。您可以简单地AutoFilter 数据范围
  3. 由于您要制作两次新书,因此我将其放入其自己的子目录中(并调用了两次),其中包含要复制的工作簿和范围以及要保存的文件名的参数。
  4. 使用On Error Resume Next 时请注意。您应该不惜一切代价避免它,但如果您绝对需要它(在某些情况下确实需要),请确保在您传递任何需要错误抑制的代码时使用On Error GoTo 0 重置错误标记。 *请注意,我重构的代码不包括抑制错误的需要。

这是重构后的代码:

Sub sort()

Application.DisplayAlerts = False

Rem Copy Data From NRM_Homing_Upload
With ThisWorkbook.Sheets("NRM_Homing_Upload")

    Dim lRow As Long
    lRow = .Range("A" & .Rows.Count).End(xlUp).Row

    With .Range("A1:H" & lRow)

        .AutoFilter 8, "=*001"

        CopyToNewBook ThisWorkbook, ThisWorkbook.Sheets("NRM_Homing_Upload"), .SpecialCells(xlCellTypeVisible), "AV"

        .AutoFilter 1, "<>*001"

        CopyToNewBook ThisWorkbook, ThisWorkbook.Sheets("NRM_Homing_Upload"), .SpecialCells(xlCellTypeVisible), "LC"

    End With

    .AutoFilterMode = False

End With

End Sub

Sub CopyToNewBook(wb As Workbook, ws as Worksheet, rng As Range, sFile As String)

Dim new_book As Workbook
Set new_book = Workbooks.Add

wb.Sheets(ws.name).Range(rng.Address).Copy

With new_book

    With .Sheets(1)

        .Range("a1").PasteSpecial (xlPasteAll)
        .UsedRange.Columns.AutoFit
        .UsedRange.RemoveDuplicates Columns:=8, Header:=xlYes

    End With

    .SaveAs Filename:="C:\Desktop\excel\test\" & sFile & ".xlsx"
    .Close

End With

End Sub

【讨论】:

  • 谢谢斯科特。我尝试了此代码,但它给出了运行时错误 424 Object required 并突出显示“CopyToNewBook ThisWorkbook, .SpecialCells(xlCellTypeVisible).Copy, “AV”。我不确定我在这里缺少什么。
  • 抱歉 - 我在设置范围时留下了 .Copy 命令。现在尝试编辑答案。
  • Scott,仍然报错 438 对象不支持此属性或方法并突出显示 wb.Range(rng.Address).Copy
  • 抱歉,我的游戏有点偏离@MGoyal。再次查看编辑后的答案。
  • 谢谢斯科特。它工作得很好。我唯一需要更改的是删除这行代码 .UsedRange.RemoveDuplicates Columns:=8, Header:=xlYes 因为条件 001 仅返回 1 条记录而不是全部 10 条记录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多