【问题标题】:Compare dates then match columns比较日期然后匹配列
【发布时间】:2019-09-25 20:08:53
【问题描述】:

Sheet1 全年累积工作并提供建议。

Sheet2 累积已完成的推荐。

Sheet1 上任何没有匹配的行都需要跟进。重复项在第 14 行突出显示。由于第 14 行的作业发生在 2019 年 1 月 24 日,因此无法在该日期之前完成建议。

这是我用于 MatchColums 的代码;

Sub MatchColums()

Dim i, total, fRow As Integer
Dim found As Range

total = Worksheets(1).Range("A" & Rows.Count).End(xlUp).Row

For i = 1 To total
    answer1 = Worksheets(1).Range("C" & i).Value
    Set found = Worksheets(2).Columns("C:C").Find(what:=answer1) 'finds a match

    If found Is Nothing Then
        Worksheets(1).Range("H" & i).Value = "NO MATCH"
    Else
        fRow = Sheets(2).Columns("C:C").Find(what:=answer1).Row
        Worksheets(1).Range("I" & i).Value = Worksheets(2).Range("A" & fRow).Value
        Worksheets(1).Range("J" & i).Value = Worksheets(2).Range("B" & fRow).Value
        Worksheets(1).Range("K" & i).Value = Worksheets(2).Range("C" & fRow).Value
        Worksheets(1).Range("L" & i).Value = Worksheets(2).Range("D" & fRow).Value
        Worksheets(1).Range("M" & i).Value = Worksheets(2).Range("E" & fRow).Value
        Worksheets(1).Range("N" & i).Value = Worksheets(2).Range("F" & fRow).Value
        Worksheets(1).Range("O" & i).Value = Worksheets(2).Range("G" & fRow).Value

     End If
 Next i

End Sub

为了防止重复,我添加了以下代码;

Sub CompareDates()

If Sheet1.Range("A1") < Sheet2.Range("A1") Then
    Run "MatchColums"
End If
End Sub

我没有收到任何错误消息,但我的 CompareDates 宏似乎不起作用。我尝试先运行 matchcolums 宏,但再次得到以下相同的结果;

这是 Sheet2 的副本

【问题讨论】:

  • 这些是实际日期还是看起来像日期的文本?他们是左对齐的吗?每张纸上的Range("A1") 是什么?
  • 如果没有输入样本,很难看出发生了什么或错误。只是代码的简单视图,问题是如果您有重复的日期,那么您将得到重复的结果。在 H 列有“NO MATCH”的单元格中,I 列有文本。这似乎是一个意外的结果。你能上传一个输入样本吗?
  • BigBen,这些都是格式化的日期。是的,他们是有道理的。每张纸上的 A1 作为标题,后跟日期。
  • 大卫,是的,我将编辑我的帖子以添加 Sheet2。

标签: excel vba date-comparison


【解决方案1】:

这两行做同样的事情

Dim i, total, fRow As Integer 

Dim i As Variant, total As Variant, fRow As Integer
  • IntegerDim

    Dim i As Integer, total As Integer, fRow As Integer


这看起来总是评估为“1”,除非Column A 有空单元格,那么您的For 循环功能如何

`total = Worksheets(1).Range("A" & Rows.Count).End(xlUp).Row`

Find 只返回第一个匹配项

`Set found = Worksheets(2).Columns("C:C").Find(what:=answer1)`
  • 您似乎不是在搜索唯一值。您的示例数据在 Column C 中具有“姓氏”,而“Moss”在 Shhet1 中出现的时间不同,但您的 Find 函数只会返回 Sheet2 中第一次出现的“Moss”。这意味着Sheet2 中的第一个“Moss”将为Sheet1 中的每个“Moss”写入。所以你得到误报和错误的匹配。这在您的输出中很明显,您没有提供Sheet2 的样本,但我知道“Moss”的第一次出现是“2018 年 12 月 18 日”上的“工作编号 13774”,因为它在 @ 中多次写入987654337@。要解决此问题,请使用具有唯一值的 Find 或查找每个匹配项并比较日期、工作编号等,直到找到正确的值。

  • 您已将范围限定为工作表级别,但 Rows.Count 不合格。


这个块可以缩短为一行

`Worksheets(1).Range("I" & i).Value = Worksheets(2).Range("A" & fRow).Value`
`Worksheets(1).Range("J" & i).Value = Worksheets(2).Range("B" & fRow).Value`
`Worksheets(1).Range("K" & i).Value = Worksheets(2).Range("C" & fRow).Value`
`Worksheets(1).Range("L" & i).Value = Worksheets(2).Range("D" & fRow).Value`
`Worksheets(1).Range("M" & i).Value = Worksheets(2).Range("E" & fRow).Value`
`Worksheets(1).Range("N" & i).Value = Worksheets(2).Range("F" & fRow).Value`
`Worksheets(1).Range("O" & i).Value = Worksheets(2).Range("G" & fRow).Value`

Worksheets(1).Range("I" &amp; i ":O" &amp; i) = Worksheets(2).Range("A" &amp; fRow &amp; ":G" &amp; fRow)

【讨论】:

  • 非常感谢您对整理我的代码的见解。您是对的,因为客户可以在一个月内或一年内拥有多个工作,使用姓氏并不总是返回唯一匹配项。但是,每个客户每天只有一份工作。为该工作提出的建议通常会在接下来的几天或几周内完成,但很少会在 Moss 的情况下在同一天完成。这就是为什么我想添加一个宏来进行日期比较。日期为 2019 年 1 月 24 日的作业 13877 无法在 2019 年 12 月 18 日完成。我想如果我添加一个这样的宏
  • 如果 Sheet1 Col A 上的日期小于 Sheet2 Col A 上的日期,则运行匹配宏。你认为这会解决重复的问题吗?
  • @airstatdipatch 会有所帮助,但我不知道它是否会是带来 100% 准确率的解决方案。我仍然会尝试在更多领域进行排位赛。努力是微不足道的,如果可以忽略不计,性能会下降,如果失败,你不依赖单点的保证会让你晚上睡得更好。你也会更好看,赚更多钱,人们会更喜欢你。
猜你喜欢
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
相关资源
最近更新 更多