一系列日期之间的VBA SUMIF

一系列日期之间的VBA SUMIF,vba,loops,date,declaration,sumifs,Vba,Loops,Date,Declaration,Sumifs,我有24列,其中包含美元金额(H:AE)。我将其归纳为3类,AG的ATC(24小时)、AH的高峰(8-23小时)和AI的非高峰(1-7,24小时)。在AK、AL和AM列中,我对E列中PNODENAME的所有实例的峰值和非峰值ATC进行了汇总。在AT列中,选择了正确的价格区间(来自AP列),但是,如果a列中的日期是周末,则返回ATC总和 我被困在下一部分,在AV列中有一个时间段与atc(全天候)、峰值或非峰值的时间段(基于日期)相关。例如,DAY需要12月份的所有非高峰价格(以及周末的ATC)。为

我有24列,其中包含美元金额(H:AE)。我将其归纳为3类,AG的ATC(24小时)、AH的高峰(8-23小时)和AI的非高峰(1-7,24小时)。在AK、AL和AM列中,我对E列中PNODENAME的所有实例的峰值和非峰值ATC进行了汇总。在AT列中,选择了正确的价格区间(来自AP列),但是,如果a列中的日期是周末,则返回ATC总和

我被困在下一部分,在AV列中有一个时间段与atc(全天候)、峰值或非峰值的时间段(基于日期)相关。例如,DAY需要12月份的所有非高峰价格(以及周末的ATC)。为了保持它的趣味性,一些节点需要按季度求和,比如从六月到八月。当然,为了使它有趣,需要循环。考虑把总数放在第二行

我想知道我是否可以申报一段时间?欢迎任何建议。这就是我目前所拥有的

Sub LMPTest()

    'Looping Sum for ATC by row

    For i = 2 To Cells(Rows.Count, "H").End(xlUp).Row
       Range("AG" & i) = WorksheetFunction.Sum(Range("H" & i & ":AE" & i))

    Next i

    'Looping Sum for ONPEAK by row

    For i = 2 To Cells(Rows.Count, "H").End(xlUp).Row
        Range("AH" & i) = WorksheetFunction.Sum(Range("O" & i & ":AD" & i))

    Next i

    'Looping Sum for OFFPEAK by row

    For i = 2 To Cells(Rows.Count, "H").End(xlUp).Row
        Range("AI" & i) = Val(Range("AG" & i).Value) - Val(Range("AH" & i).Value)

    Next i

    'Looping ATC Sumif Node Matches #### Needs to be from PJM Period

    For i = 2 To Cells(Rows.Count, "AG").End(xlUp).Row

    Worksheets("pjm_lmp_table").Range("AK" & i).Formula = "=SUMIF(pjm_lmp_table!E:E, pjm_lmp_table!E:E, pjm_lmp_table!AG:AG)"

    Next i

    'Looping ONPEAK Sumif Node Matches #### Needs to be from PJM Period

    For i = 2 To Cells(Rows.Count, "AH").End(xlUp).Row
       Worksheets("pjm_lmp_table").Range("AL" & i).Formula ="=SUMIF(pjm_lmp_table!E:E, pjm_lmp_table!E:E, pjm_lmp_table!AH:AH)"

    Next i

    'Looping OFFPEAK Sumif Node Matches #### Needs to be from PJM Period

    For i = 2 To Cells(Rows.Count, "AI").End(xlUp).Row
    Worksheets("pjm_lmp_table").Range("AM" & i).Formula = "=SUMIF(pjm_lmp_table!E:E, pjm_lmp_table!E:E, pjm_lmp_table!AI:AI)"

    Next i

    'Looping Sumif Day of Week

    For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row

    If Weekday(Range("A" & i).Value) > 6 Or Weekday(Range("A" & i).Value) < 2 Then

    Range("AT" & i).Value = Range("AK" & i).Value

    ElseIf Range("AP" & i) = "ONPEAK" Then
                                    Range("AT" & i).Value = Range("AL" & i)

    ElseIf Range("AP" & i) = "OFFPEAK" Then
                                        Range("AT" & i).Value2 = Range("AM" & i)

    End If

    Next

End Sub
Sub-LMPTest()
'按行为ATC循环求和
对于i=2到单元格(Rows.Count,“H”).End(xlUp).Row
范围(“AG”&i)=工作表函数.Sum(范围(“H”&i&“:AE”&i))
接下来我
'按行为ONPEAK循环求和
对于i=2到单元格(Rows.Count,“H”).End(xlUp).Row
范围(“AH”&i)=工作表函数.Sum(范围(“O”&i&“:AD”&i))
接下来我
'按行为非峰值循环求和
对于i=2到单元格(Rows.Count,“H”).End(xlUp).Row
范围(“AI”&i)=Val(范围(“AG”&i).Value)-Val(范围(“AH”&i).Value)
接下来我
'循环ATC Sumif节点匹配#####需要来自PJM周期
对于i=2到单元格(Rows.Count,“AG”).End(xlUp).Row
工作表(“pjm_lmp_表”).Range(“AK”&i).Formula=“=SUMIF(pjm_lmp_表!E:E,pjm_lmp_表!E:E,pjm_lmp_表!AG:AG)”
接下来我
'循环峰值Sumif节点匹配#####需要来自PJM周期
对于i=2到单元格(Rows.Count,“AH”).End(xlUp).Row
工作表(“pjm_lmp_表”).Range(“AL”&i).Formula=“=SUMIF(pjm_lmp_表!E:E,pjm_lmp_表!E:E,pjm_lmp_表!AH:AH)”
接下来我
'循环非峰值Sumif节点匹配#####需要从PJM周期开始
对于i=2到单元格(Rows.Count,“AI”).End(xlUp).Row
工作表(“pjm_lmp_表”).Range(“AM”&i).Formula=“=SUMIF(pjm_lmp_表!E:E,pjm_lmp_表!E:E,pjm_lmp_表!AI:AI)”
接下来我
“一周中的一天
对于i=2到单元格(Rows.Count,“A”).End(xlUp).Row
如果工作日(范围(“A”&i).Value)>6或工作日(范围(“A”&i).Value)<2,则
范围(“AT”&i).Value=范围(“AK”&i).Value
ElseIf范围(“AP”&i)=“峰值”然后
范围(“AT”和i)。值=范围(“AL”和i)
其他范围(“AP”&i)=“非峰值”然后
范围(“AT”和i)。值2=范围(“AM”和i)
如果结束
下一个
端接头


虽然这不是一个完整的答案,但我想为您指出一个正确的方向,即通过消除循环来加快流程,并且简单地说,这样您就可以自己进行更多的调整

Sub LMPTest()
    Dim lr As Long

    With Worksheets("pjm_lmp_table")   '<~~ always specify the worksheet!
        lr = Cells(Rows.Count, "H").End(xlUp).Row

        'Looping Sum for ATC by row
        .Range("AG2:AG" & lr).Formula = "=SUM(H2:AE2)"
        .Range("AH2:AH" & lr).Formula = "=SUM(O2:AD2)"
        'Looping Sum for OFFPEAK by row
        .Range("AI2:AI" & lr) = "=AG2-AH2"
        'Looping ATC Sumif Node Matches #### Needs to be from PJM Period
        .Range("AK2:AK" & lr).Formula = "=SUMIF(E:E, E2, AG:AG)"

        'revert formula to result values
        .Range("AG2:AK" & lr) = .Range("AG2:AL" & lr).Value2

        'Looping OFFPEAK Sumif Node Matches #### Needs to be from PJM Period
        .Range("AM2:AM" & lr).Formula = "=SUMIFS(AI:AI, E:E, E2, AP:AP, AM$1)"
        'revert formula to result values
        .Range("AM2:AM" & lr) = .Range("AM2:AM" & lr).Value2

        'Looping Sumif Day of Week
        .Range("AT2:AT" & lr).Formula = "=IF(OR(WEEKDAY(A2)={7, 1}), AK2, " & _
                                         "IF(AP2=""ONPEAK"", AL2, " & _
                                         "IF(AP2=""OFFPEAK"", AM2, """")"
        'revert formula to result values
        .Range("AT2:AT" & lr) = .Range("AT2:AT" & lr).Value2

    End With

End Sub
Sub-LMPTest()
变暗lr为长

对于工作表(“pjm_lmp_table”)虽然这不是一个完整的答案,但我想为您指出一个正确的方向,即通过删除循环加快流程,并简单地处理一些问题,以便您可以自己进行更多调整

Sub LMPTest()
    Dim lr As Long

    With Worksheets("pjm_lmp_table")   '<~~ always specify the worksheet!
        lr = Cells(Rows.Count, "H").End(xlUp).Row

        'Looping Sum for ATC by row
        .Range("AG2:AG" & lr).Formula = "=SUM(H2:AE2)"
        .Range("AH2:AH" & lr).Formula = "=SUM(O2:AD2)"
        'Looping Sum for OFFPEAK by row
        .Range("AI2:AI" & lr) = "=AG2-AH2"
        'Looping ATC Sumif Node Matches #### Needs to be from PJM Period
        .Range("AK2:AK" & lr).Formula = "=SUMIF(E:E, E2, AG:AG)"

        'revert formula to result values
        .Range("AG2:AK" & lr) = .Range("AG2:AL" & lr).Value2

        'Looping OFFPEAK Sumif Node Matches #### Needs to be from PJM Period
        .Range("AM2:AM" & lr).Formula = "=SUMIFS(AI:AI, E:E, E2, AP:AP, AM$1)"
        'revert formula to result values
        .Range("AM2:AM" & lr) = .Range("AM2:AM" & lr).Value2

        'Looping Sumif Day of Week
        .Range("AT2:AT" & lr).Formula = "=IF(OR(WEEKDAY(A2)={7, 1}), AK2, " & _
                                         "IF(AP2=""ONPEAK"", AL2, " & _
                                         "IF(AP2=""OFFPEAK"", AM2, """")"
        'revert formula to result values
        .Range("AT2:AT" & lr) = .Range("AT2:AT" & lr).Value2

    End With

End Sub
Sub-LMPTest()
变暗lr为长

在工作表(“pjm_lmp_表”)中,公式(例如
=SUMIF(pjm_lmp_表!e:e,pjm_lmp_表!e:e,pjm_lmp_表!AG:AG)
)看起来不正确。所有这些都在pjm_lmp_表格工作表上吗?如果是
=SUMIF(E:E,E2,AG:AG)
?@Jeeped-Yes,所有都在pjm\U lmp\U表格工作表上。这是我唯一能得到PNODENAME的方法。当然,它最终会检查另一张表上的NODENAME,我不想把它弄得太复杂,我对VBA真的很陌生。不用说,我不是在键入示例数据。如果你要在AM2中写一个公式,会是什么?AK2呢?AL2怎么了?哈哈,是的,我只是把截图放上去作为参考。隐藏了很多行,因此我可以在屏幕截图中找到重要的行。我想在与工作日(范围(“a”)和I).Value相关的最后一位代码之前需要一些代码-类似于SUMIF(范围(“a”)和I).Value=“12月”否则,接下来我……我肯定这是不对的。AK,AL,AM可能是多余的。AT是重要的,但它只需要对AV中的周期求和。公式(例如,
=SUMIF(pjm_lmp_表!e:e,pjm_lmp_表!e:e,pjm_lmp_表!AG:code>)看起来不对。所有这些都在pjm_lmp_表工作表上吗?应该是
=SUMIF吗(E:E,E2,AG:AG)
?@Jeeped是的,所有内容都在pjm_lmp_表格工作表上。这是我获得PNODENAME求和的唯一方法。值得注意的是,它最终会检查另一张工作表上的NODENAME,我不想让它太复杂,我对VBA真的很陌生。不用说,我不是在键入示例数据。如果你要在其中写入公式AM2,会是什么?AK2呢?AL2怎么了?哈哈,是的,我只是把截图放上去参考。有很多隐藏的行,所以我可以在截图中找到重要的行。我想我需要一些代码,在与工作日(范围(“a”)和“I”)相关的最后一段代码之前。值-类似于SUMIF(范围(“a”)和“I”)的东西.value=“December”否则下一步我……我肯定这是不对的。AK、AL、AM可能是多余的。AT是重要的,但它只需要以AV求和周期。