Excel VBA-在电子表格中添加数据后公式中断

Excel VBA-在电子表格中添加数据后公式中断,vba,excel,Vba,Excel,我有一份Excel电子表格,其中包含2016年1月至2016年12月的每月费用(M列至X列)。工作表上还有两个按钮。当您单击“执行分析”按钮时,它会按D列中输入的百分比减少每个月的成本(即,如果您在D列中输入15,则M列(1月)到X列(12月)将减少15%) 一旦M列到X列减少,则填充Z列(2017年1月)到AK列(2017年12月)。为了确定Z列到AK列的值,我查看2016年的平均月成本是否大于或小于2016年的原始年度总成本(Y列)和新降低的成本之间的差异。如果平均成本大于差异,则2017年

我有一份Excel电子表格,其中包含2016年1月至2016年12月的每月费用(M列至X列)。工作表上还有两个按钮。当您单击“执行分析”按钮时,它会按D列中输入的百分比减少每个月的成本(即,如果您在D列中输入15,则M列(1月)到X列(12月)将减少15%)

一旦M列到X列减少,则填充Z列(2017年1月)到AK列(2017年12月)。为了确定Z列到AK列的值,我查看2016年的平均月成本是否大于或小于2016年的原始年度总成本(Y列)和新降低的成本之间的差异。如果平均成本大于差异,则2017年1月(Z列)等于原始成本和降低成本之间的差异。如果平均值小于差值,则2017年1月等于2016年的月平均成本

接下来,我们使用与上述相同的逻辑来确定AA列的值(2017年2月)。然而,这一次我们从2016年的原始年度成本和新降低的成本之间的差额中减去2017年1月的价值

例如,如果2016年的原始年度成本为350000美元,减少的成本为297500美元(减少15%),平均每月成本为45000美元(也是2017年1月的成本),那么我们将通过以下方式计算2017年2月的价值:

如果月平均成本($45000)大于($350000-$297500-$45000),则2017年2月=275300美元

否则,平均月成本(45000美元)低于2017年2月的(350000美元-297500美元-45000美元)=45000美元

这种模式持续到2017年12月,AK列

我所有的代码都工作得很好,直到我在电子表格的第5行添加了数字。添加数据后,COUNTIFS公式不再返回正确的结果

对于第5行,
MonthsWithValues
应等于10;但是,每次我现在运行代码时,它都会给我一个0。我尝试过使用“步进”、“断点/切换点”和“观察”来调试它。每次我运行代码时,它总是说
MonthsWithValues
的值为0。因为我的代码包含一个公式,其中您用值除以
MonthsWithValues
,所以我一直得到运行时错误11(您不能除以0)。救命啊! 有关守则如下:

Function ReduceCost_Percentage()

With Worksheets("Analysis Worksheet")

Dim i As Long
Dim LastRow As Long
LastRow = Range("X" & Rows.Count).End(xlUp).Row
Dim Orig2016Total(65) As Long
Dim MonthsWithValues As Long
Dim TodayDate As Date
TodayDate = Format(Date, "DD/MM/YYYY")

For i = 5 To LastRow
Orig2016Total(i) = Excel.WorksheetFunction.Sum(.Range(("BC" & i), ("BN" & i)))
MonthsWithValues = Excel.WorksheetFunction.CountIfs(.Range(("M" & i), ("X" & i)), "<>0", "<>")
Next i

For i = 5 To LastRow
If .Range("D" & i).Value > 0 And IsEmpty(.Range("B" & i).Value) And IsEmpty(.Range("C" & i).Value) Then
  If .Range("X" & i).Value > 0 And Not IsEmpty(Worksheets("Fixed Cost Test Data").Range("B" & i).Value) _
  And Worksheets("Fixed Cost Test Data").Range("C" & i).Value <= #12/31/2016# Then
    If (((Orig2016Total(i) - (Worksheets("Fixed Cost Test Data").Range("B" & i).Value * (12 - Left(Worksheets("Fixed Cost Test Data").Range("C" & i).Value, 2)))) / MonthsWithValues)) < (Orig2016Total(i) - .Range("Y" & i).Value) Then
      .Range("Z" & i).Value = ((Orig2016Total(i) - (Worksheets("Fixed Cost Test Data").Range("B" & i).Value * (12 - Left(Worksheets("Fixed Cost Test Data").Range("C" & i).Value, 2)))) / MonthsWithValues) + Worksheets("Fixed Cost Test Data").Range("B" & i).Value
    End If
  ElseIf .Range("X" & i).Value > 0 And Not IsEmpty(Worksheets("Fixed Cost Test Data").Range("B" & i).Value) _
  And Worksheets("Fixed Cost Test Data").Range("C" & i).Value <= #12/31/2016# Then
    If (((Orig2016Total(i) - (Worksheets("Fixed Cost Test Data").Range("B" & i).Value * (12 - Left(Worksheets("Fixed Cost Test Data").Range("C" & i).Value, 2)))) / MonthsWithValues)) > (Orig2016Total(i) - .Range("Y" & i).Value) Then
      .Range("Z" & i).Value = (Orig2016Total(i) - .Range("Y" & i).Value) + Worksheets("Fixed Cost Test Data").Range("B" & i).Value
    End If
  ElseIf .Range("X" & i).Value > 0 And Not IsEmpty(Worksheets("Fixed Cost Test Data").Range("B" & i).Value) And Worksheets("Fixed Cost Test Data").Range("C" & i).Value > #12/31/2016# _
  And (Orig2016Total(i) / MonthsWithValues) < (Orig2016Total(i) - .Range("Y" & i).Value) Then
    .Range("Z" & i).Value = Orig2016Total(i) / MonthsWithValues
  ElseIf .Range("X" & i).Value > 0 And IsEmpty(Worksheets("Fixed Cost Test Data").Range("B" & i).Value) _
  And (Orig2016Total(i) / MonthsWithValues) < (Orig2016Total(i) - .Range("Y" & i).Value) Then
    .Range("Z" & i).Value = Orig2016Total(i) / MonthsWithValues
  ElseIf .Range("X" & i).Value > 0 And Not IsEmpty(Worksheets("Fixed Cost Test Data").Range("B" & i).Value) And Worksheets("Fixed Cost Test Data").Range("C" & i).Value > #12/31/2016# _
  And (Orig2016Total(i) / MonthsWithValues) > (Orig2016Total(i) - .Range("Y" & i).Value) Then
    .Range("Z" & i).Value = Orig2016Total(i) - .Range("Y" & i).Value
  ElseIf .Range("X" & i).Value > 0 And IsEmpty(Worksheets("Fixed Cost Test Data").Range("B" & i).Value) _
  And (Orig2016Total(i) / MonthsWithValues) > (Orig2016Total(i) - .Range("Y" & i).Value) Then
    .Range("Z" & i).Value = Orig2016Total(i) - .Range("Y" & i).Value
  ElseIf .Range("X" & i).Value = Worksheets("Fixed Cost Test Data").Range("B" & i).Value And Not IsEmpty(Worksheets("Fixed Cost Test Data").Range("B" & i).Value) _
  And Not IsEmpty(Worksheets("Fixed Cost Test Data").Range("C" & i).Value) And Orig2016Total(i) > 0 Then
    If (((Orig2016Total(i) - (Worksheets("Fixed Cost Test Data").Range("B" & i).Value * (12 - Left(Worksheets("Fixed Cost Test Data").Range("C" & i).Value, 2)))) / MonthsWithValues)) < (Orig2016Total(i) - .Range("Y" & i).Value) Then
      .Range("Z" & i).Value = ((Orig2016Total(i) - (Worksheets("Fixed Cost Test Data").Range("B" & i).Value * (12 - Left(Worksheets("Fixed Cost Test Data").Range("C" & i).Value, 2)))) / MonthsWithValues) + Worksheets("Fixed Cost Test Data").Range("B" & i).Value
    End If
  ElseIf .Range("X" & i).Value = Worksheets("Fixed Cost Test Data").Range("B" & i).Value And Not IsEmpty(Worksheets("Fixed Cost Test Data").Range("B" & i).Value) _
  And Not IsEmpty(Worksheets("Fixed Cost Test Data").Range("C" & i).Value) And Orig2016Total(i) > 0 Then
    If (((Orig2016Total(i) - (Worksheets("Fixed Cost Test Data").Range("B" & i).Value * (12 - Left(Worksheets("Fixed Cost Test Data").Range("C" & i).Value, 2)))) / MonthsWithValues)) > (Orig2016Total(i) - .Range("Y" & i).Value) Then
      .Range("Z" & i).Value = (Orig2016Total(i) - .Range("Y" & i).Value) + Worksheets("Fixed Cost Test Data").Range("B" & i).Value
    End If
  ElseIf (IsEmpty(.Range("X" & i).Value) Or .Range("X" & i).Value = 0) And Not IsEmpty(Worksheets("Fixed Cost Test Data").Range("B" & i).Value) _
  And Worksheets("Fixed Cost Test Data").Range("C" & i).Value > #11/30/2016# And Worksheets("Fixed Cost Test Data").Range("C" & i).Value <= #12/31/2016# Then
    If ((Orig2016Total(i) - (Worksheets("Fixed Cost Test Data").Range("B" & i).Value * (12 - Left(Worksheets("Fixed Cost Test Data").Range("C" & i).Value, 2)))) / MonthsWithValues) < (Orig2016Total(i) - .Range("Y" & i).Value) Then
     .Range("Z" & i).Value = ((Orig2016Total(i) - (Worksheets("Fixed Cost Test Data").Range("B" & i).Value * (12 - Left(Worksheets("Fixed Cost Test Data").Range("C" & i).Value, 2)))) / MonthsWithValues) + Worksheets("Fixed Cost Test Data").Range("B" & i).Value
    End If
  ElseIf (IsEmpty(.Range("X" & i).Value) Or .Range("X" & i).Value = 0) And Not IsEmpty(Worksheets("Fixed Cost Test Data").Range("B" & i).Value) _
  And Worksheets("Fixed Cost Test Data").Range("C" & i).Value > #11/30/2016# And Worksheets("Fixed Cost Test Data").Range("C" & i).Value <= #12/31/2016# Then
    If ((Orig2016Total(i) - (Worksheets("Fixed Cost Test Data").Range("B" & i).Value * (12 - Left(Worksheets("Fixed Cost Test Data").Range("C" & i).Value, 2)))) / MonthsWithValues) > (Orig2016Total(i) - .Range("Y" & i).Value) Then
     .Range("Z" & i).Value = (Orig2016Total(i) - .Range("Y" & i).Value) + Worksheets("Fixed Cost Test Data").Range("B" & i).Value
    End If
  ElseIf (IsEmpty(.Range("X" & i).Value) Or .Range("X" & i).Value = 0) And ((Not IsEmpty(Worksheets("Fixed Cost Test Data").Range("B" & i).Value) And Worksheets("Fixed Cost Test Data").Range("C" & i).Value > #12/31/2016#) Or IsEmpty(Worksheets("Fixed Cost Test Data").Range("B" & i).Value)) _
  And (Orig2016Total(i) / MonthsWithValues) > (Orig2016Total(i) - .Range("Y" & i).Value) Then
    .Range("Z" & i).Value = Orig2016Total(i) - .Range("Y" & i).Value
  ElseIf (IsEmpty(.Range("X" & i).Value) Or .Range("X" & i).Value = 0) And ((Not IsEmpty(Worksheets("Fixed Cost Test Data").Range("B" & i).Value) And Worksheets("Fixed Cost Test Data").Range("C" & i).Value > #12/31/2016#) Or IsEmpty(Worksheets("Fixed Cost Test Data").Range("B" & i).Value)) _
  And (Orig2016Total(i) / MonthsWithValues) < (Orig2016Total(i) - .Range("Y" & i).Value) Then
    .Range("Z" & i).Value = Orig2016Total(i) / MonthsWithValues
  End If
End If
Next i
Sub ReduceCost_Percentage()

With Worksheets("Analysis Worksheet")

Dim i As Long
Dim LastRow As Long
LastRow = Range("X" & Rows.Count).End(xlUp).Row
Dim Orig2016Total(68) As Long
Dim MonthsWithValues(68) As Long

For i = 5 To LastRow
Orig2016Total(i) = Excel.WorksheetFunction.Sum(.Range(("BC" & i), ("BN" & i)))
MonthsWithValues(i) = Excel.WorksheetFunction.CountIfs(.Range(("M" & i), ("X" & i)), "<>0", .Range(("M" & i), ("X" & i)), "<>""""")
Next i
函数还原成本百分比()
带工作表(“分析工作表”)
我想我会坚持多久
最后一排一样长
LastRow=范围(“X”和Rows.Count).End(xlUp).Row
Dim ORIG2016总长度(65)等于
Dim MONTHSWITH值与Long值相同
Dim TodayDate作为日期
TodayDate=格式(日期,“DD/MM/YYYY”)
对于i=5到最后一行
Orig2016Total(i)=Excel.WorksheetFunction.Sum(.Range((“BC”和i)、(“BN”和i)))
monthWithValues=Excel.WorksheetFunction.CountIfs(.Range((“M”和“i”)、“0”和“0”)
接下来我
对于i=5到最后一行
如果.Range(“D”&i).Value>0且为空(.Range(“B”&i).Value)且为空(.Range(“C”&i).Value),则
如果.Range(“X”和i).Value>0且不为空(工作表(“固定成本测试数据”).Range(“B”和i).Value)_
和工作表(“固定成本测试数据”)。范围(“C”和i)。值为0,但不为空(工作表(“固定成本测试数据”)。范围(“B”和i)。值)_
和工作表(“固定成本测试数据”).范围(“C”和i).值(原2016年总计(i).范围(“Y”和i).值),然后
.Range(“Z”和i).Value=(Orig2016Total(i)-.Range(“Y”和i).Value)+工作表(“固定成本测试数据”).Range(“B”和i).Value
如果结束
其他范围(“X”和i).值>0且不为空(工作表(“固定成本测试数据”).范围(“B”和i).值)和工作表(“固定成本测试数据”).范围(“C”和i).值>2016年12月31日_
和(原始2016年总计(i)/月数(带值)<(原始2016年总计(i)-.范围(“Y”&i).值),然后
.范围(“Z”和i).值=原始2016年总(i)/月数(带值)
其他范围(“X”&i).值>0且为空(工作表(“固定成本测试数据”).范围(“B”&i).值)_
和(原始2016年总计(i)/月数(带值)<(原始2016年总计(i)-.范围(“Y”&i).值),然后
.范围(“Z”和i).值=原始2016年总(i)/月数(带值)
其他范围(“X”和i).值>0且不为空(工作表(“固定成本测试数据”).范围(“B”和i).值)和工作表(“固定成本测试数据”).范围(“C”和i).值>2016年12月31日_
和(原始2016年总计(i)/月数(带值)>(原始2016年总计(i)-.范围(“Y”和i).值),然后
.Range(“Z”和i).Value=Orig2016Total(i)-.Range(“Y”和i).Value
其他范围(“X”&i).值>0且为空(工作表(“固定成本测试数据”).范围(“B”&i).值)_
和(原始2016年总计(i)/月数(带值)>(原始2016年总计(i)-.范围(“Y”和i).值),然后
.Range(“Z”和i).Value=Orig2016Total(i)-.Range(“Y”和i).Value
ElseIf.Range(“X”和i).Value=工作表(“固定成本测试数据”).Range(“B”和i).Value,而非IsEmpty(工作表(“固定成本测试数据”).Range(“B”和i).Value)_
并且不是空的(工作表(“固定成本测试数据”)。范围(“C”和i)。值)和原始2016年总(i)>0
如果((Orig2016Total(i)-(工作表(“固定成本测试数据”).范围(“B”和“i”).值*(12-Left(工作表(“固定成本测试数据”).范围(“C”和“i”).值,2)))/MonthWithValues))<(Orig2016Total(i)-(范围(“Y”和“i”).值),则
.范围(“Z”和i).值=((Orig2016Total(i)-(工作表(“固定成本测试数据”).范围(“B”和i).值*(12-左侧(工作表(“固定成本测试数据”).范围(“C”和i).值,2)))/月份带值)+工作表(“固定成本测试数据”).范围(“B”和i).值
如果结束
ElseIf.Range(“X”和i).Value=工作表(“固定成本测试数据”).Range(“B”和i).Value,而非IsEmpty(工作表(“固定成本测试数据”).Range(“B”和i).Value)_
并且不是空的(工作表(“固定成本测试数据”)。范围(“C”和i)。值)和原始2016年总(i)>0
如果((Orig2016Total(i)-(工作表(“固定成本测试数据”).范围(“B”和“i”).值*(12-左侧(工作表(“固定成本测试数据”).范围(“C”和“i”).值,2)))/monthWithValues))>(Orig201