【问题标题】:Advanced.Filter VBA高级过滤器 VBA
【发布时间】:2015-07-27 13:57:46
【问题描述】:

到目前为止,我有此代码,仅适用于工作表 2,如何更改此代码以将多个工作表包含在其中?在这里完成newb。 :

Sub extractuniquevalues()

    Sheet1.Range("C:C").AdvancedFilter xlFilterCopy, , Sheet4.Range("C1"), True
    Sheet2.Range("C:C").AdvancedFilter xlFilterCopy, , Sheet4.Range("C1"), True

End Sub

【问题讨论】:

  • 如果您的意思是要从多个工作表中获得唯一列表,则必须将数据复制到一个工作表,然后对该组合数据集使用高级过滤器。
  • 哦,所以我不能跨多个工作表执行此操作?我必须将数据复制到一张纸上吗?
  • 是的,如果您想使用高级过滤器。您可以通过仅复制每张工作表中的唯一数据来最小化数据,然后过滤该结果集以获得最终的唯一列表。

标签: vba excel


【解决方案1】:

你可以这样做:

就地过滤数据

Sub extractuniquevalues()
    Dim wks As Excel.Worksheet

    For Each wks In Excel.ActiveWorkbook.Worksheets
        Call wks.Range("C:C").AdvancedFilter(XlFilterAction.xlFilterInPlace, , , True)
    Next wks

End Sub

过滤数据并将其粘贴到新工作表中:

Sub extractuniquevalues2()
    Dim wks As Excel.Worksheet
    Dim wksSummary As Excel.Worksheet
    '----------------------------------------------------------------------------------

    On Error Resume Next
    Set wksSummary = Excel.ThisWorkbook.Worksheets("Unique data")
    On Error GoTo 0

    If wksSummary Is Nothing Then
        Set wksSummary = Excel.ThisWorkbook.Worksheets.Add
        wksSummary.Name = "Unique data"
    End If


    'Iterate through all the worksheets, but skip [Summary] worksheet.
    For Each wks In Excel.ActiveWorkbook.Worksheets

        With wksSummary

            If wks.Name <> .Name Then
                If Application.WorksheetFunction.CountA(wks.Range("C:C")) Then
                    Call wks.Range("C:C").AdvancedFilter(xlFilterCopy, , .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row + 1, 1), True)
                End If
            End If

        End With

    Next wks

End Sub

每个工作表的唯一数据都打印在名为唯一数据的新工作表的第一列中。

此方法分别过滤来自每个工作表的数据,因此如果 Sheet1 中有值 A,Sheet2 中有值 A,则结果列表中将有两个条目 A


注意,第一个值被认为是一个标题,它可以在结果列表中重复。

【讨论】:

  • 如果您对 vba 完全陌生,那么也值得一提 ThisWorkbookActiveWorkbookWorkbook 对象,它会自动更新以引用您正在积极处理的工作簿。 ThisWorkbookWorkbook 对象,它引用包含正在运行的代码的工作簿。如果您或您的用户可能同时处理多本工作簿,则此区别很重要。
  • 不过,您将在Sheet4C 中获得last 工作表的唯一值。
  • 我计划在一个目录中的多个工作表和工作簿中执行此宏。无论如何运行上面的宏,我只是得到了 sheet4 中的标题,也许我做错了什么。
  • @Jonathan 你是对的,所有的过滤器都在工作表 Sheet4 中打印了它们的值。我已经编辑了答案中的代码 - 它应该在每个工作表中打印过滤后的数据。
  • @mielk,工作正常,谢谢:),无论如何我可以将这些提取到主表中吗?还是第四张纸?
【解决方案2】:

我觉得你们的 cmets 保证我把这个作为答案发布,这样我可能会更彻底一点。 这只是为了补充 mielk 提供的答案!

Excel 中的对象层次结构大致概括为“一个 Excel 应用程序拥有工作簿。一个 Excel 工作簿拥有工作表。一个 Excel 工作表拥有范围”。有关该外观的更多信息here

当您点击一个 Excel 文件打开它时,您实际上是在做两件事:

  1. 启动 Excel“应用程序”
  2. 打开该“应用程序”将“拥有”的工作簿

当您打开后续 Excel 文件时,Excel 将跳过第一步,只需在已运行的 Excel 应用程序中打开一个工作簿。请注意,这意味着类似于一个工作簿可以有多个工作表一个 Excel 应用程序可以有多个属于它的工作簿

在 VBA 中有多种方法可以访问这些工作簿。一种方法是使用应用程序的Workbooks 成员,就像您使用WorkbookSheets 成员访问工作表一样。通常,尽管您只是想访问用户当前正在编辑/处理的工作簿。为此,您可以使用ActiveWorkbook,只要用户开始处理不同的工作簿,它就会自动为您更新。

另一个您经常想要使用的工作簿是“容纳”您正在运行的代码的工作簿。您可以使用ThisWorkbook 来执行此操作。如果您打开 VBA 编辑器并查看项目查看器,您甚至可以看到对 ThisWorkbook 的引用!如果您希望您的代码仅更新/更改包含它的工作簿,那么 ThisWorkbook 是要走的路。

举个例子:

假设您有一个宏来遍历所有打开的工作簿,并将每个工作簿“拥有”的工作表数量放入“主”工作簿中的某个工作表中。

你可以这样做:

Sub CountThem()
    Dim wb As Workbook
    Dim outputCell As Range
    Dim nextRow As Integer

    nextRow = 1
    For Each wb In Application.Workbooks
        wb.Activate
        ThisWorkbook.Sheets("MySheet").Cells(nextRow, 1).Value = ActiveWorkbook.Sheets.Count
        nextRow = nextRow + 1
    Next
End Sub

您可以将此代码作为模块放入“主”工作簿中。

让我知道这是否可以为您解决问题! :)

【讨论】:

  • 是的!谢谢 Mike!,那么为什么我必须在 thisworkbook 文件中运行 Miekl 的代码?我可以将其更改为在个人宏模块中工作吗?
  • “个人宏模块”是什么意思?您是指您通过单击“插入模块”创建的吗?
  • 我的意思是 .xlsb 文件,那些总是在 vba 编辑器中打开的文件。所以我可以使用它们而不必将代码放入每个工作簿中。
  • 我不确定我是否理解您使用的术语。从您的 cmets 中,您有一个主 excel 文件,您正在复制数据以进行更正?当您说“thisworkbook 文件”时,这就是您所指的吗?
  • 这里我将包含一个链接:[i.imgur.com/e2g8VOB.jpg]。当我在我的个人宏部分运行代码时,我得到一个错误,当我在工作簿本身中运行它时,它很好。无论如何,我的最终目标是能够在 excel 文件目录中运行它,如果可能的话,将其放入主文件中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多