将日期标识为星期四,并汇总最近6天的时间

时间:2019-06-13 12:26:49

标签: excel-formula

我有一张表,上面有几个操作代码及其小时数,我需要每个星期四汇总每个代码所花费的小时数。

尽管能够找出一个IF公式可以完成我对范围总和的限制,但我可以通过VBA使其正常工作,但是我无法在公式上应用相同的解决方案:

WorksheetFunction.Sum(Range(“ E”&cCell.Row&“:E”&cCell.Row-6))

Dim Counter As Integer
Dim cCell As Range
Dim intToday As Integer
Dim CountDate As Integer
Dim strWsName As String
strWsName = ActiveSheet.Name
Dim xWs As Worksheet
Set xWs = Worksheets(strWsName)

'Clause 101
    For Counter = 4 To 34
        Set cCell = xWs.Cells(Counter, 4)
            If WorksheetFunction.WeekDay(cCell.Value) = 5 Then
                If cCell.Row = 4 Then
                      xWs.Range("Q" & cCell.Row) = WorksheetFunction.Sum(Range("E" & cCell.Row & ":E" & cCell.Row))
                Else
                        If cCell.Row >= 34 Then
                              xWs.Range("Q" & cCell.Row) = WorksheetFunction.Sum(Range("E" & cCell.Row & ":E" & cCell.Row))
                        Else
                            If cCell.Row - 6 <= 0 Then
                                xWs.Range("Q" & cCell.Row) = WorksheetFunction.Sum(Range("E" & cCell.Row & ":E4"))
                              Else
                                xWs.Range("Q" & cCell.Row) = WorksheetFunction.Sum(Range("E" & cCell.Row & ":E" & cCell.Row - 6))
                              End If
                        End If
                End If
            End If
    Next Counter
End Sub

我想知道如何将这段代码转换为Excel上的公式。

2 个答案:

答案 0 :(得分:0)

对公式和变量范围进行了研究之后,我设法设置了该公式,它的工作原理很吸引人:

= IF(WEEKDAY($ D9)= 5; IF(ROW(E9)<= 6; SUM(OFFSET(E9 ;;;-ROW()))); SUM(OFFSET(E9 ;;;; -7)));“”“)

注意:我的语言环境设置使用“;”而不是公式上的“,”,因此请记住,您必须将其更改为您的区域设置。

说明:

“ = IF(WEEKDAY($ D9)= 5”公式将评估日期是否为星期四,如果不是,它将在列上显示“”;

IF(ROW(E9)<= 6子句将用于标识电子表格顶部的限制,具体取决于其值将求和不同的范围:

  • 如果日期行小于6,它将运行以下命令: SUM(OFFSET(E9 ;;;-ROW()))。偏移量将与 日期是。
  • 现在,如果该行大于6,则可以设置一个固定值 7行的偏移量:SUM(OFFSET(E9 ;;;-7))

如果需要将计算结果更改为星期三,您要做的就是将打算的工作日的“ = IF(WEEKDAY($ D9)= 5”)上的数字“ 5”更改为以下列表:< / p>

  • 1到周日
  • 2到星期一
  • 3到星期二
  • 4到星期三
  • 5到星期四
  • 6到星期五
  • 7到星期六

感谢在Excel Jet和Extend Office上找到的文章,我设法构建了该解决方案!

希望更多的人可以使用此解决方案!

答案 1 :(得分:0)

解决此问题的最佳方法是创建一个UDF,我在ExcelForum的WideBoyDixon的帮助下:

Public Function SumWeek(sumRange As Range, dateRange As Range, endDate)
Application.Volatile
Dim prevSheetName As String
Dim prevSheet As Worksheet
SumWeek = Application.WorksheetFunction.SumIfs(sumRange, dateRange, "<=" & CStr(CLng(endDate)), dateRange, ">" & CStr(CLng(endDate - 7)))
prevSheetName = Mid("DecJanFebMarAprMayJunJulAugSepOctNov", Month(endDate) * 3 - 2, 3) & CStr(Year(endDate) - IIf(Month(endDate) = 1, 1, 0))
On Error Resume Next
    Set prevSheet = Worksheets(prevSheetName)  
    If Not (prevSheet Is Nothing) Then
        SumWeek = SumWeek + Application.WorksheetFunction.SumIfs(prevSheet.Range(sumRange.Address), prevSheet.Range(dateRange.Address), "<=" & CStr(CLng(endDate)), prevSheet.Range(dateRange.Address), ">" & CStr(CLng(endDate - 7)))
    End If
End Function