【问题标题】:How to extract records from a worksheet into a seperate worksheet using VLOOKUPS and IF's如何使用 VLOOKUPS 和 IF 将工作表中的记录提取到单独的工作表中
【发布时间】:2019-12-14 23:47:55
【问题描述】:

工作表1:

Excel sheet

New

工作表 1 的许可证包含 6 列信息 - 两列是开始日期和结束日期。

我需要一种方法来提取到期日期前 90 天内的所有记录——我想要一个单独的警报页面

我已经做了一个 IF 语句,它位于列的末尾,如果日期达到警报标准,则打印 1,如果没有,则打印 0...现在在 Worksheet2 中的想法我需要某种 VLOOKUP 和 IF 来提取自动记录这些记录。

我该怎么做?

=IF(IFERROR(DATEDIF(TODAY(),H5,"d"),91)<90,1,0)

【问题讨论】:

  • 你可以使用宏吗?还是需要excel公式?

标签: excel vba if-statement vlookup


【解决方案1】:

虽然在这种情况下建议使用数据透视表或 VBA 宏,但如果您绝对需要使用公式,则可以使用以下技巧。

您已经有了 Binary 列。现在,添加另一列,例如 Cumulative Binary,它将使用 SumIf 公式将所有 1 相加,直到当前行,如下面的屏幕截图所示(如果某些数字因为 0 而重复也可以)

我的工作簿中 I3 中的公式是 =SUMIF(H$3:H3,1,H$3:H3) 您可以根据自己的需要进行调整。

现在,这很容易,因为每一行都有一个唯一的数字,我们可以使用 Vlookup 或像我在这里所做的那样,即使用 Offset 函数,它只是将“查找列”中的值与“累积二进制”列并返回匹配的行。

=IFERROR(OFFSET($F$2,MATCH(M3,$I$3:$I$9,0),0,1,2),"")

请注意,这是一个数组公式,因为我需要返回多列(此处为 2)。因此,我选择了两列 N,O,如屏幕截图所示,编写公式并使用 Ctrl+Shift+Enter(而不是 Enter)。然后我简单地把公式拖下来。您可能希望通过包含更多列来根据需要对其进行调整。

【讨论】:

  • 由于某些原因,代码被跳过了——因为应该提取的数据没有被提取
  • 你能分享更多截图或者在这里输入公式吗?这可能是因为范围以及它们的选择方式,例如在可能不需要时使用“$”来锁定范围等。
  • 应该在新工作表上,但我只是在测试:)
  • 在您的新图像中,我看到偏移量来自 $B$2。将其更改为 $B$1 即可。原因是,match 返回匹配值的位置,offset 导航到从下一个开始的位置。
【解决方案2】:

如果你会使用VBA,你可以写一些这样的代码:

Option Explicit

Public Sub CopyCloseToExpiration()
    Dim rngSource As Range: Set rngSource = ThisWorkbook.Worksheets("Sheet1").Cells(2, 1).Resize(LastRow(ThisWorkbook.Worksheets("Sheet1")) - 1, 9)
    Dim rngDestinationTopLeft As Range: Set rngDestinationTopLeft = ThisWorkbook.Worksheets("Sheet2").Cells(LastRow(ThisWorkbook.Worksheets("Sheet2")) + 1, 1)
    Dim datLimit As Date: datLimit = DateAdd("d", 90, Date)

    CopyBeforeDate rngSource, rngDestinationTopLeft, datLimit
End Sub

Public Sub CopyBeforeDate(rngSource As Range, rngDestinationTopLeft As Range, datLimit As Date)
    Dim lngOffset As Long: lngOffset = 0
    Dim rngRow As Range: For Each rngRow In rngSource.Rows
        If rngRow.Cells(1, 8).Value < datLimit Then
            rngDestinationTopLeft.offset(lngOffset, 0).Resize(rngRow.Rows.Count, rngRow.Columns.Count).Value = rngRow.Value
            lngOffset = lngOffset + 1
        End If
    Next
End Sub

Public Function LastRow(ewsSheet) As Long
    With ewsSheet
        Dim lngResult As Long: lngResult = .Cells(.Rows.Count, 1).End(xlUp).Row
    End With
    LastRow = lngResult
End Function

您必须将上述内容放入一个新模块中,对其进行自定义(例如,将“Sheet1”替换为工作表的实际名称),然后运行它(您可以将插入符号放在子 CopyCloseToExpiration 上并按 F5 或放置某处的按钮并从其事件处理程序中调用此函数)。

【讨论】:

    猜你喜欢
    • 2015-11-08
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多