【问题标题】:excel indirect function to read dates and return dynamic valuesexcel间接函数读取日期并返回动态值
【发布时间】:2018-04-20 05:45:08
【问题描述】:

浏览论坛并找不到我需要的东西。我在 B 列中有 100 多张具有唯一工作表名称和数据的工作表。B 列将包含各种结束日期。一些工作表将有 1 或 2 个结束日期,而其他工作表则有 30 个以上的结束日期。 .我想创建一个包含一个表格的摘要页面,该表格将自行更新以显示在 B 列中具有 END 日期的所有工作表名称,这些工作表名称将在接下来的 30 天内到期。这是需要编码的东西吗?还是使用 excel 间接公式并可能包含一个 vlookup?

【问题讨论】:

  • 似乎与VLOOKUP 无关。您可以遍历 Worksheets() 集合以检查每张工作表。
  • 你有什么版本的 Excel。 [提示画外音:]“这听起来像是 PowerQuery 的工作”
  • @jeffreyweir excel 2010
  • 好的。在 2013 年和 2016 年,有一种称为 PowerQuery aka“获取和转换”的东西,它可以轻松地将来自不同来源的数据(包括一个工作簿中的选项卡)合并在一起,然后从中创建一个数据透视表。在您的情况下,您可以过滤数据透视表以显示未来 30 天内的结束日期。

标签: excel vba dynamic powerquery


【解决方案1】:
Private Sub ChkEndDates()
    Dim ws As Worksheet
    Dim cell As Range
    Dim rowCount as Long
    For Each ws in Worksheets
        If ws.Name <> '"summary page" Then
            rowCount = WorksheetFunction.CountA(ws.Range("B:B"))
            For i = 1 To rowCount
                If (ws.Cells(i, 2).Value - Date < 30) And (ws.Cells(i, 2).Value > Date) Then
                    MsgBox ws.Name
                    'And maybe push into the summary page
                End If
            Next i
        End If
    Next ws
End Sub

【讨论】:

  • 使用 rowCount 假定数据从第 1 行开始并且没有空格。最好是引用 ListObjects (这当然需要将每个数据区域变成一个表......我会不厌其烦地使用一次性的 VBA)或选择每列中的底部单元格并使用.End(xlUP) 选择最后一行数据。
  • 谢谢大家。我会看看我能想出什么。感谢您的意见!
  • 我试过这段代码。收到“类型不匹配”错误。我认为这是因为并非所有 B 列的数据都是日期格式。因此,也许我们需要添加一个检查以仅在 B 列中的数据是日期时才运行循环。 B列中还有行标题和标题等。
  • 当然,您没有显示任何数据。所以我只能给你一个通用的方法,你自己根据数据来调整。
【解决方案2】:

此问题不需要VLOOKUPINDIRECT

假设您在 B 列中的日期采用 Excel 的序列号格式,则此公式将计算 Sheet2 的 B 列中距今天日期 30 天内的单元格数量:

= SUMPRODUCT((Sheet2!B:B>=TODAY())+0,(Sheet2!B:B<=(TODAY()+30))+0)

您可以将这个公式复制到所需的任意多张纸上,例如

= SUMPRODUCT((Sheet2!B:B...))+SUMPRODUCT((Sheet3!B:B...))

编辑

根据@Jeeped 的评论,建议将此范围(B:B)缩小到数据的末尾。 (例如,如果您最多有 30 行数据,请更改为 B1:B30

【讨论】:

  • 可能想要删除那些完整的列引用或切换到计数。
  • @Jeeped 谢谢,好电话,刚刚添加到我的帖子以缩小B:B 范围。
【解决方案3】:

为了完整起见,如果您有 Excel 2013 或更高版本,以下是使用 PowerQuery/Get & Transform 执行此操作的方法。

首先,您可以将工作簿中的每个数据区域转换为 Excel 表格(也称为 ListObjects),方法是选择它们并使用功能区中的“插入”>“表格”命令,或者只需使用键盘快捷键 [Ctrl] + [T]。理想情况下,您会给它们一个名称,以表明它们是什么。 (我使用了前缀“Input_”,然后使用了一个运行计数,因为稍后这个“句柄”将帮助我忽略任何我不希望在最终结果中出现的表,只需查看它的名称是否带有前缀“输入_”)。

然后从“数据”选项卡中,选择“新建查询”>“来自其他来源”>“空白查询”:

一个名为 PowerQuery 窗口的神秘 UI 将打开,对此没有什么太大的兴趣。如果在公式栏中键入 =Excel.CurrentWorkbook 并按 Enter,则工作簿中的各种表的列表将填充到该窗口中,如下所示。如果您单击“内容”列右侧的双箭头图标,将出现一个菜单,让您可以展开这些表以包含每个表中的实际列,并将它们带入 PowerQuery 窗口:

当您按下 OK 时,数据转储的外观如下:

仅当您的工作簿中已经有其他不想在最终混搭中显示的表时,才需要下一点。在下面的屏幕截图中,我将结果集过滤为仅包含带有 Input_ 前缀的表:

然后我要将该 DateTime 列的数据类型更改为简单的日期,方法是选择相关的列,然后从 Transform 选项卡。

然后我要从右上角的菜单中选择关闭并加载到

..然后从出现的对话框中选择“仅创建连接”和“添加到数据模型”选项:

现在回到 Excel,我创建了一个数据透视表,并选中“使用此工作簿的数据模型”选项:

...这会带来与您通常看到的外观略有不同的数据透视表字段列表:

我现在将名称(表名称)和结束日期字段添加到我的数据透视表中,并设置日期过滤器以仅显示未来 30 天内的日期:

这是最终结果,一个仅显示结束日期在未来 30 天内的表格的数据透视表:

这种方法的美妙之处在于,如果您稍后添加更多带有更多输入表的选项卡,然后为它们添加前缀“Input_”,那么它们将在您下次刷新数据透视表时自动出现。此外,数据透视表不仅可以告诉您哪些选项卡具有适用的结束日期,还可以告诉您这些选项卡中涉及哪些单独的记录。

在此过程中,我还有更多未展示的内容,例如通过放弃“内容”来为列命名更友好的名称。后缀,我可能会编写一个简单的宏来根据当前日期后的 30 天自动重新过滤数据透视表。但这至少向您展示了升级到 Excel 2013 并使用 PowerPivot/Get 和 Transform 彻底自动化此类任务的好处。

【讨论】:

  • 哇,感谢您所做的一切。擅长的事情会让我感到困惑。不知道电源查询
  • 在Excel 2010中实际可以使用,但是需要下载安装,不知道是否和后面的版本一样最新。在以后的版本中,它被烘焙了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多