【问题标题】:VBA Advanced filter unique values and copy to another sheetVBA Advanced 过滤唯一值并复制到另一个工作表
【发布时间】:2015-12-23 14:01:06
【问题描述】:

我尝试了多种方法来过滤列中的唯一值(包括空格和内部带有空格的空格)。我想过滤这些值,然后将它们粘贴到另一张表的 a 列中。

Sub filter_2()
    With Sheets("ICM flags")

        .Columns("a").AdvancedFilter Action:=xlFilterCopy, copytorange:=Sheets("Flag Update (2)").Range("a2"), Unique:=True

    End With
End Sub

上述方法适用于.range("a2"),但如果我尝试使用.range("a1"),则会收到运行时错误 1004 类的高级过滤方法失败。

我得到运行时错误 1004 类的高级过滤方法失败,方法如下。

Sub unique_filter()

               Sheets("ICM flags").Columns("a").AdvancedFilter _
                     Action:=xlFilterCopy, _
                        copytorange:=Sheets("Flag Update (2)").Range("a1"), Unique:=True

End Sub

对于上述两种方法以及对 Davesexcel 答案的编辑:

Sub AdvFilter()
Dim ws As Worksheet, sh As Worksheet
Dim rng As Range, Frng As Range

Set sh = Sheets("ICM Flags")
Set Frng = sh.Range("A:A")
Set ws = Sheets("Flag Update (2)")
Set rng = ws.Range("A1")

'Frng.AdvancedFilter Action:=xlFilterCopy, copytorange:=rng, Unique:=True
Frng.AdvancedFilter Action:=xlFilterInPlace, Unique:=True

End Sub

该方法适用于FilterInPlace,但不适用于CopyToRange

【问题讨论】:

  • 有时(并非总是)如果未选择您要过滤的范围,则会发生此错误。尝试在过滤前选择范围。选择不应该是必需的,但我已经看到它有所作为。
  • 如果您想将高级过滤器复制到另一张工作表,我相信您需要使用变量。

标签: vba excel filter unique


【解决方案1】:

这里是我独特的过滤器所使用的。它将从sheet1 复制并粘贴到sheet2。

Private Sub CommandButton2_Click()
    Dim UserRange As Range
    Sheets("Sheet2").Range("A:A").Clear
    Dim sh As Worksheet
    Set sh = ThisWorkbook.Sheets("Sheet1")
    On Error Resume Next
    Set UserRange = Application.Range("A:A")
    On Error GoTo 0
    If UserRange Is Nothing Then
        Exit Sub
    End If     
    UserRange.AdvancedFilter _
        xlFilterCopy, CopyToRange:=Sheets("BOM").Range("A1"), Unique:=True
End Sub

【讨论】:

    【解决方案2】:

    其实 目的地需要成为活动工作表,然后您可以从任何其他工作表或工作簿中获取唯一值

    【讨论】:

      【解决方案3】:

      似乎问题是由于尝试使用CopyToRange 复制到另一张纸而引起的。我已经通过首先复制到同一张表然后将这些值复制到我想要它们的表来解决这个问题

      Sub AdvFilter() 'filters flags copied from ICM to unique values and pastes  into Flag update sheet.
      
          Dim ws As Worksheet, sh As Worksheet
          Dim rng As Range, Frng As Range, Prng As Range
      
          Set ws = Sheets("Flag Update (2)")
      
          Set sh = Sheets("ICM Flags 1")'destination sheet
          Set Frng = sh.Range("A:A")'filter range
          Set rng = sh.Range("c1")'filter output range
      
      
          Frng.AdvancedFilter Action:=xlFilterCopy, copytorange:=rng, Unique:=True
          ws.Columns("a").Value = sh.Columns("c").Value 'Separate copying as the filter didn't like copying to another sheet
      
      End Sub
      

      【讨论】:

        【解决方案4】:

        当我运行你的代码时,它运行起来没有任何错误。

        这是相同的代码,但使用了变量,可能更适合您。

        Sub AdvFilter()
            Dim ws As Worksheet, sh As Worksheet
            Dim rng As Range, Frng As Range
        
            Set ws = Sheets("Flag Update (2)")
            Set rng = ws.Range("A1")
            Set sh = Sheets("ICM flags")
            Set Frng = sh.Range("A:A")
        
            Frng.AdvancedFilter Action:=xlFilterCopy, copytorange:=rng, Unique:=True
        
        End Sub
        

        【讨论】:

        • 看起来效果不错,真的应该是我自己想出来的!今天晚些时候我会检查它,如果我没有问题,我会接受你的回答。干杯
        • 奇怪的是,当我测试这个时,我得到 1004 '缺少或非法的字段名称'。我已经在本地窗口打开的情况下运行它,似乎看不到任何问题 - 有什么想法吗?干杯
        • 让我们看看你的代码,我会尝试复制问题。您可以将其添加到您的原始帖子中。
        • 啊,这是个好主意,但不幸的是,在这种情况下,我手动从 InfoWorks ICM 导出了一列数据并将其粘贴到 .xlsm 中以使用过滤器代码。我编写的所有代码都在我目前手动绕过以完成工作的过滤步骤之后。
        • 那为什么不使用代码将列复制到另一张表然后删除重复项。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-20
        • 2017-02-08
        • 1970-01-01
        • 2016-11-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多