我在两张工作表上有一组名称和日期时间。我们将一张工作表称为 LargerSheet,另一张工作表称为 Sheet1。在 LargerSheet 上,每个名称都有多个与之关联的日期时间。在 Sheet1 上,每个日期时间都有多个与之关联的名称。目标是找出 Sheet1 上的名称是否在 LargerSheet 上具有匹配的名称值,使得 Sheet1 上的日期时间与 LargerSheet 上与匹配名称关联的日期时间之间的差异小于 72 小时。LargerSheet 上的候选匹配日期时间还必须满足条件,即它大于 Sheet1 上与名称关联的日期时间。要处理多个日期时间符合条件的事件,想法是只查看第一个匹配项。示例工作表可以在这里找到。
还请注意,我以前也问过类似的问题,但我认为,由于我措辞的方式,这些问题更令人困惑,而不是有帮助。这些问题可以在这里和这里。
答案1
我相信我已经接近回答您的问题了,但是仍然需要进行一些调整。它使用 MS Query 从工作簿中查询工作簿。这允许您针对工作表运行 SQL 并执行比 VLOOKUP 复杂得多的计算。
现在,开始步骤。1
. 在功能区中,在“数据”选项卡的“获取外部数据”部分中,单击“来自其他来源”并选择“来自 Microsoft Query”
2. 选择“Excel 文件”
3. 在“选择工作簿”中,导航到您的页面。还要更改为所有文件,因为他们没有更新新文件扩展名的代码。4
. 接下来,选择要从中查询的工作表。如果它给您错误,请不要担心,只要您进入 Microsoft Query 编辑器,如下所示。
现在,此时您可以像在 Access 中一样开始构建此查询,或者您可以切换到 SQL 视图并编写查询。它就是上图中的 SQL 按钮。编辑器很烂,所以复制粘贴到 SSMS 或 N++。完成后,点击“门出口”按钮,称为“返回数据”。
对于所提出的问题,以下是 SQL:
SELECT `S1`.DATES , `S1`.NAMES , MAX(`LS`.DATES)
FROM `C:\Admin\StackExchange\vlookup multiple results.xlsx`.`Sheet1$` `S1`
LEFT OUTER JOIN `C:\Admin\StackExchange\vlookup multiple results.xlsx`.`LargerSheet$` `LS`
ON `S1`.NAMES = `LS`.NAMES
WHERE (`S1`.DATES - `LS`.DATES) > -3 and (`S1`.DATES - `LS`.DATES) < 3
group by `S1`.DATES, `S1`.NAMES
将数据添加到新的工作表以获得以下结果:
由于某种原因,第 2 行似乎与查询不匹配,因为它实际上需要 75 小时的时间,但此时我将其归咎于 Excel 日期时间转换为 SQL(MS Query)并返回的一些问题。
PS,这个答案也发布在我的博客上,以防有人认为我未经授权复制了它。我只是不想因为链接到我自己的博客而被标记。如果找到它,你可以链接它。
答案2
我将为此使用 Power Query 插件。
对于许多场景,您无需编写一行代码,只需在 Power Query UI 中单击即可。每一步都会显示数据转换的结果,从而实现高效的测试/调试。
我已经构建了一个原型解决方案,您可以下载并尝试 - 它是:“Power Query 演示 - 基于日期时间间隔的条件匹配.xlsx”在我的 OneDrive 演示文件夹中:
FinalResult 表上有我的结果。
我确实必须编写一行代码 - FirstMatches 查询中的 Matches 列的“if”语句。