【问题标题】:Excel advanced filter dynamic rangeExcel 高级过滤器动态范围
【发布时间】:2017-08-31 20:25:07
【问题描述】:

我与一个内部网站建立了数据连接,该网站抓取了一个完整的网页并将其导入“DC”表。从那里它通过使用以下代码的高级过滤器宏移动到“暂存”。 N1100 不是文本的最后一行,它是一个任意数字,距离我的数据末尾有一段距离。

Private Sub Worksheet_Change(ByVal Target As Range)
    Call Password_Unprotect

    Dim ws As Worksheet
        Set ws = ThisWorkbook.Sheets("DC")
    Dim lrng As Range
       Set lrng = ThisWorkbook.Sheets("DC").Range("A158:N1100")
    Dim crng As Range
        Set crng = ThisWorkbook.Sheets("DC").Range("A158:N1100")

    Dim copyto As Range
        Set copyto = ThisWorkbook.Sheets("Staging").Range("A1:H1")

    lrng.AdvancedFilter xlFilterCopy, crng, copyto, Unique:=False

    'Call password_protect  
End Sub

我的问题是,每当我用于数据连接的网页发生更改时,它都会破坏我的高级过滤器,因为我的标准从轮班开始。我希望使高级过滤器足够智能以找到它需要开始的行或删除它上面的每一行,然后将数据移动到“暂存”表。需要注意的是,包含“Division”的单元格在工作表上是唯一的。突出显示的行是高级过滤器的开始。

我已经上传了我的工作表的 snit-it。

【问题讨论】:

  • OFFSET & MATCH 的组合应该可以帮助您确定起点,或者使用动态命名范围

标签: vba excel


【解决方案1】:

下面的代码应该可以为您提供所需的内容。只需要遍历Column A 来查找DEVICE 文本,然后将其用作开始,然后在Column A 上执行.End(xlUp) 最后一行。

另一个注意事项,请始终记住在您的所有工作表上使用Option Explicit,以确保您始终声明您的变量。

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Call Password_Unprotect

    Dim DCSheet As Worksheet
    Dim lrng As Range
    Dim crng As Range
    Dim copyto As Range
    Dim StartRow As Long
    Dim ColACell As Range
    Dim LastRow As Long
    Set DCSheet = ThisWorkbook.Sheets("DC")

    LastRow = DCSheet.Cells(DCSheet.Rows.Count, "A").End(xlUp).Row

    'Stopping at 300 will just save time if the text is not found
    'if it is possible that the start row could be further down then increase the number
    For Each ColACell In DCSheet.Range("A1:A300").Cells
        If ColACell.Text = "DEVICE" Then
            'Can have cross check for the IP text in Column B
            If ColACell.Offset(0, 1).Text = "IP" Then StartRow = ColACell.Row
        End If
    Next ColACell

    Set lrng = DCSheet.Range("A" & StartRow & ":N" & LastRow)
    Set crng = DCSheet.Range("A" & StartRow & ":N" & LastRow)
    Set copyto = ThisWorkbook.Sheets("Staging").Range("A1:H1")

    lrng.AdvancedFilter xlFilterCopy, crng, copyto, Unique:=False

    'Call password_protect

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    相关资源
    最近更新 更多