【问题标题】:Filter the data based on another workbook cell value using VBA使用 VBA 根据另一个工作簿单元格值过滤数据
【发布时间】:2021-05-18 12:06:00
【问题描述】:

由于我仍在学习,我陷入了应用条件以根据源工作簿单元格值过滤目标工作表中的两列。

例如。来源:A1 列有 Q2,b2 列有 d104 我需要将其用作目标工作簿中的过滤器并删除现有的可见过滤值并将其替换为复制的数据。

我有逻辑只替换没有过滤器的数据。但是如何使用过滤器来实现呢?



Dim wsCopy As Worksheet
Dim wsDest As Worksheet
Dim CopyLastRow As Integer
Dim DestlastRow As Integer

    '1. open the workbook to copy from
    Workbooks.Open "C:\Forecast.xlsx" -- target
     '2. Define each workbook
    Set wsCopy = ThisWorkbook.Sheets("Input Data") --source
    Set wsDest = Workbooks("Imports PY Plan Forecast.xlsx").Sheets("Source")
    
    
    '3. Define last row in source data
    CopyLastRow = wsCopy.Cells(wsCopy.Rows.Count, "A").End(xlUp).Row

    ThisWorkbook.Worksheets("Input Data").Range("A2:F" & CopyLastRow).Copy wsDest.Range("A2")
    
    '4. close and save source file
    Workbooks("Imports PY Plan Forecast.xlsx").Close SaveChanges:=True
    


End Sub```

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    为了实现过滤行,删除和粘贴值,你可以在设置工作簿完成后编写如下代码:

    'Filter column A and column B based on value
    Worksheets("Input Data").Range("A1:AE" & CopyLastRow).AutoFilter Field:=1, Criteria1:="Q2"
    Worksheets("Input Data").Range("A1:AE" & CopyLastRow).AutoFilter Field:=2, Criteria1:="d104"
    
    'Assuming your data start from row 2, will only delete visible cell
    Worksheets("Input Data").range("A2:A" & CopyLastRow).entirerow.delete
    
    'And copy value in visible cell using special cell function
    ThisWorkbook.Worksheets("Input Data").Range("A2:F" & CopyLastRow).SpecialCells(xlCellTypeVisible).Copy wsDest.Range("A2")
    

    【讨论】:

    • 谢谢,但标准值存在于另一个工作簿中。如何引用该单元格。
    • 只需将另一个工作表中的值分配给变量并在标准上使用它就可以了。
    • 我需要根据源中存在的两个值过滤目标列值并删除它们,然后从源中复制数据并将其粘贴到目标中,然后删除过滤器
    • 我已经给你答案了,你好像对变量一无所知?
    【解决方案2】:
    
    
    Dim wsCopy As Worksheet
    Dim wsDest As Worksheet
    Dim wsfilter As Worksheet
    Dim CopyLastRow As Integer
    Dim DestlastRow As Integer
    Dim ws As Worksheet, rng As Range, LstRw As Long
    
        '1. open the workbook to copy from
        Workbooks.Open "C:Forecast.xlsx"
         '2. Define each workbook
        Set wsCopy = ThisWorkbook.Sheets("Input Data")
        Set wsDest = Workbooks("Forecast.xlsx").Sheets("Source")
        Set wsfilter = ThisWorkbook.Sheets("HR - Source")
        '3. Define last row in source data
        CopyLastRow = wsCopy.Cells(wsCopy.Rows.Count, "A").End(xlUp).Row
        
        '4.Filter column A and column B based on value
        wsDest.Range("A1:F" & CopyLastRow).AutoFilter Field:=3, Criteria1:=wsfilter.Range("E1").Value
        wsDest.Range("A1:F" & CopyLastRow).AutoFilter Field:=5, Criteria1:=wsfilter.Range("D2").Value & "*"
        
        '5.Delet Visible data
        Application.DisplayAlerts = False
        ActiveSheet.UsedRange.Offset(1, 0).Resize(ActiveSheet.UsedRange.Rows.Count - 1).Rows.Delete
        Application.DisplayAlerts = True
        
        '6. Copy data from Input Data to Forecast Source
        ThisWorkbook.Worksheets("Input Data").Range("A2:F" & CopyLastRow).SpecialCells(xlCellTypeVisible).Copy wsDest.Range("A2")
        On Error Resume Next
            wsDest.ShowAllData
        On Error GoTo 0
    
         '7. close and save source file
            Workbooks("Forecast.xlsx").Close SaveChanges:=True
        End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多