【问题标题】:How to calculate start and end dates of blocks of cells in Excel 2013?如何计算 Excel 2013 中单元格块的开始和结束日期?
【发布时间】:2020-02-03 08:31:15
【问题描述】:

我在 Excel 2013 中有下表:

日期列由随后的 2 周间隔组成。 其他列有彩色单元格,指示不同地址的事件何时持续。例如,对于地址 2,事件从 13.01.2020 持续到 09.02.2020。我需要将此表转换为带有列的表:

Start Date | Finish date | Address

对于每个地址,可以有多个事件持续的时间间隔,因此每个地址可以有几行。

我可以使用 Text to Columns 轻松地将每两周间隔的开始日期和结束日期分开,并且我可以用数字填充彩色块,以便更轻松地使用单元格进行操作。但我不知道如何计算开始日期和块的长度以计算每个块的结束日期。我确信它可以通过一些 VBA 编码来完成,但这不是我最强的一面。有没有办法使用内置的 Excel 功能来做到这一点?原始表由大约 50 个地址和 30 个 2 周间隔组成。

谢谢!

【问题讨论】:

    标签: excel


    【解决方案1】:

    您可以使用 Excel 2010+ 中提供的 Power Query 来完成此操作

    在 Excel 2013 中,如果您没有它,您可能需要下载免费的 Microsoft 插件才能启用它。

    在红色方块里放些东西。我只使用了x 字母,但它们必须是非空白的

    • 在表格中选择一个单元格
    • 数据/获取和转换/从表/范围
    • 选择日期列和Split column by delimiter:-
    • 按区域设置更改类型
      • 您需要选择Date 和具有dd.mm.yy 格式的语言环境
      • 我选择了瑞士-阿尔萨斯,但还有其他的
    • 选择两个日期列和Unpivot other columns
    • 然后Group By 地址列和聚合
      • Min Dates.1 列的开始日期
      • Max Dates.2 列的结束日期
    • 将列移至最终设计并根据需要重命名
    • 按地址列排序

    这一切都可以通过 UI 完成

    M 码

    let
        Source = Excel.CurrentWorkbook(){[Name="Table3"]}[Content],
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"Dates", type text}, {"Address 1", type text}, {"Address 2", type text}, {"Address 3", type text}, {"Address 4", type text}, {"Address 5", type text}}),
        #"Split Column by Delimiter" = Table.SplitColumn(#"Changed Type", "Dates", Splitter.SplitTextByDelimiter("-", QuoteStyle.Csv), {"Dates.1", "Dates.2"}),
        #"Changed Type with Locale" = Table.TransformColumnTypes(#"Split Column by Delimiter", {{"Dates.1", type date}, {"Dates.2", type date}}, "gsw-CH"),
        #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Changed Type with Locale", {"Dates.1", "Dates.2"}, "Address", "Value"),
        #"Grouped Rows" = Table.Group(#"Unpivoted Other Columns", {"Address"}, {{"Start Date", each List.Min([Dates.1]), type date}, {"Finish Date", each List.Max([Dates.2]), type date}}),
        #"Sorted Rows" = Table.Sort(#"Grouped Rows",{{"Address", Order.Ascending}})
    in
        #"Sorted Rows"
    

    如果您需要使用公式,以下应该可以工作:

    输入您的地址列表,例如G18:Gn

    在下面的公式中,我定义了一个表并使用了结构化引用,但如果需要,您可以使用常规引用。

    如上所述,我还将x 放在彩色块中。在这种情况下,它必须是x。不能只是non-blank

    H18: =AGGREGATE(15,6,DATE(MID(Table3[Dates],7,2)+100,MID(Table3[Dates],4,2),LEFT(Table3[Dates],2))*1/(INDIRECT("Table3["&$G18&"]")="x"),1)
    I18: =AGGREGATE(14,6,DATE(RIGHT(Table3[Dates],2)+100,MID(Table3[Dates],14,2),MID(Table3[Dates],10,2))*1/(INDIRECT("Table3["&$G18&"]")="x"),1)
    

    并根据需要填写。

    你得到相同的结果:

    【讨论】:

    • 谢谢!我最终使用类似的技术自己解决了我的问题。我还用相同的数字填充了单元格,使用 Text to Column、PowerQuery 来取消透视表,然后使用几个 IF 函数来查找开始和结束日期。但是非常感谢您的详细回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    相关资源
    最近更新 更多