【问题标题】:Excel: Generating Months Data from Start and End DateExcel:从开始日期和结束日期生成月份数据
【发布时间】:2021-08-18 21:55:21
【问题描述】:

我想使用 excel 来跟踪这些年来我每个月有多少实习生。

Name Division Start Date End Date
Anna Div A 12 Jun 2019 1 Jan 2020
Ben Div B 20 Oct 2020 20 Dec 2020
Clare Div C 13 Jan 2021 13 Jan 2022

有没有一种方法可以让我使用 excel 列出每个实习生工作的月数,如下所示,以便我能够将每个月有多少实习生放入图表中

Month/Year Name Div
Jun 2019 Anna Div A
Jul 2019 Anna Div A
Aug 2019 Anna Div A
Sep 2019 Anna Div A
Oct 2019 Anna Div A
Nov 2019 Anna Div A
Dec 2019 Anna Div A
Jan 2020 Anna Div A
Oct 2020 Ben Div B
Nov 2020 Ben Div B
Dec 2020 Ben Div B
Jan 2021 Clare Div C
Feb 2021 Clare Div C
Mar 2021 Clare Div C
Apr 2021 Clare Div C
May 2021 Clare Div C
Jun 2021 Clare Div C
Jul 2021 Clare Div C
Aug 2021 Clare Div C
Sep 2021 Clare Div C
Oct 2021 Clare Div C
Nov 2021 Clare Div C
Dec 2021 Clare Div C
Jan 2022 Clare Div C

感谢任何帮助!在此先感谢:)

【问题讨论】:

    标签: excel


    【解决方案1】:

    此代码假定原始数据位于Sheet1 上,从A1 开始,并将结果放在H:J 列中。

    所有这些都可以根据需要进行调整。

    
    Sub ExpandThings()
    Dim arrDataIn As Variant
    Dim arrDataOut As Variant
    Dim idxRow As Long
    Dim cnt As Long
    Dim idxMonth As Long
    
        With Sheets("Sheet1").Range("A1").CurrentRegion
            arrDataIn = .Offset(1).Resize(.Rows.Count - 1)
            ReDim arrDataOut(1 To 3, 1 To Application.Max(.Columns(4)) - Application.Min(.Columns(3)))
        End With
    
        For idxRow = LBound(arrDataIn, 1) To UBound(arrDataIn, 1)
            For idxMonth = 0 To DateDiff("m", arrDataIn(idxRow, 3), arrDataIn(idxRow, 4))
                cnt = cnt + 1
                arrDataOut(1, cnt) = Format(DateAdd("m", idxMonth, arrDataIn(idxRow, 3)), "mmm yyyy")
                arrDataOut(2, cnt) = arrDataIn(idxRow, 1)
                arrDataOut(3, cnt) = arrDataIn(idxRow, 2)
            Next idxMonth
        Next idxRow
        
        If cnt > 0 Then
            ReDim Preserve arrDataOut(1 To 3, 1 To cnt)
            Range("H1").Resize(, 3).Value = Array("Month/Name", "Name", "Div")
            Range("H2").Resize(cnt, 3).Value = Application.Transpose(arrDataOut)
            
        End If
        
    End Sub
    

    【讨论】:

    • 嗨,Norie,非常感谢!但是我有一个 noob 问题。您能否为我解释一下这两行 VBA 代码:ReDim arrDataOut(1 To Cells(Rows.Count, 1).End(xlUp).Row - 1, 1 To Application.Max(.Columns(4)) - Application.Min(.Columns(3))) End With For idxRow = LBound(arrDataIn, 1) To UBound(arrDataIn, 1)
    • 第一行代码不在我发布的代码中。第二行代码用于循环遍历源数据的行。
    • 我明白了,谢谢你的解释。抱歉,我编辑了第二行代码以使其更具动态性
    【解决方案2】:

    我正在尝试:

    Option Explicit
    Option Base 1
    
    Private Const NONSENSE As String = "Nonsense"
    
    Public Sub F()
    Dim I As Date
    Dim S As String
    Dim SwitchMonth As Boolean
    Dim M As Integer
    Dim D1 As Date
    Dim D2 As Date
    
       D1 = "10.10.1990"
       D2 = "01.12.1991"
    
       If (D1 > D2) Then
          MsgBox ("Failure!")
          Exit Sub
       End If
    
       M = Month(D1)
       MsgBox (OnMonth(M, Year(D1)))
       SwitchMonth = False
       For I = D1 To D2 Step 1
          
          If Month(I) <> M Then
             M = Month(I)
             MsgBox (OnMonth(M, Year(I)))
          End If
       Next
    
    End Sub
    
    Public Function OnMonth(ByVal M As Integer, ByVal Y As Integer) As String
    
       If (M < 1) Or (M > 12) Then
          OnMonth = NONSENSE
       End If
       
       Select Case M
          Case 1
             OnMonth = "January"
          Case 2
             OnMonth = "February"
          Case 3
             OnMonth = "March"
          Case 4
             OnMonth = "April"
          Case 5
             OnMonth = "May"
          Case 6
             OnMonth = "June"
          Case 7
             OnMonth = "July"
          Case 8
             OnMonth = "August"
          Case 9
             OnMonth = "September"
          Case 10
             OnMonth = "October"
          Case 11
             OnMonth = "November"
          Case 12
             OnMonth = "December"
       End Select
       
       OnMonth = OnMonth & " " & Y
    
    End Function
    

    【讨论】:

      【解决方案3】:

      您还可以使用Power Query 获取图片输出,在 Windows Excel 2010+ 和 Office 365 Excel 中可用

      • 选择原始表格中的某个单元格
      • Data =&gt; Get&amp;Transform =&gt; From Table/Range
      • 当 PQ UI 打开时,导航到Home =&gt; Advanced Editor
      • 记下代码第 2 行中的表名。
      • 用下面的M-Code替换现有代码
      • 将粘贴代码的第 2 行中的表名更改为您的“真实”表名
      • 检查所有 cmets 以及 Applied Steps 窗口,以更好地了解算法和步骤

      还要注意#"Extracted Month Name" 步骤。这将创建您在结果表中看到的文本字符串。如果您希望这是一个“真实日期”,请从“应用步骤”窗口中删除最后一步,并在 Excel 工作表上将该列格式化为您想要的外观

      M 码

      let
      
      //Read in data
      //change table name in next line to reflect actual table name in workbook
          Source = Excel.CurrentWorkbook(){[Name="Table16"]}[Content],
          #"Changed Type" = Table.TransformColumnTypes(Source,
              {{"Name", type text}, {"Division", type text}, {"Start Date", type date}, {"End Date", type date}}),
      
      //create list of dates by month with intervening months (between start and end) = first of the months
          #"Added Custom" = Table.AddColumn(#"Changed Type", "Month/Year", each 
              let 
                StartDate = #date(Date.Year([Start Date]),Date.Month([Start Date]),1),
                EndDate = [End Date],
                mnthList = List.Generate(
                              ()=>StartDate, 
                              each _ <= EndDate, 
                              each Date.AddMonths(_, 1)),
      
      //Replace first and last months in the list with the actual date
                replLast = List.ReplaceRange(mnthList,List.Count(mnthList)-1,1,{[End Date]}),
                replFirst = List.ReplaceRange(replLast,0,1,{[Start Date]})
              in
                 replFirst),
      
      //Remove unneeded columns and move the Month/Year column to the beginning
          #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Start Date", "End Date"}),
          #"Reordered Columns" = Table.ReorderColumns(#"Removed Columns",{"Month/Year", "Name", "Division"}),
      
      //expand the month list into new rows -- one row for each month
          #"Expanded mnthList" = Table.ExpandListColumn(#"Reordered Columns", "Month/Year"),
      
      //Extract the month name and year as a string for display
      //Can omit these steps if you want actual months in the cells
      //    in which case you would format them on the worksheet
          #"Extracted Month Name" = Table.TransformColumns(#"Expanded mnthList", {
            {"Month/Year", each Date.MonthName(_) & " " & Text.From(Date.Year(_)), type text}})
      in
          #"Extracted Month Name"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-02
        • 1970-01-01
        • 2020-12-17
        相关资源
        最近更新 更多