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

我有一个Excel电子表格,包含2016年1月到2016年12月的月费(列M到X)。 工作表上还有两个button。 当您点击“执行分析”button时,它将按照在D列中input的百分比降低每个月的成本(即如果在列D中input15,M(1月)到X(12月)中的列数减less15%)。

一旦列M到X减less,那么填充Z(2017年1月)到AK(2017年12月)的列。 为了确定Z到AK的价值,我看看2016年的平均月度成本是大于还是小于2016年原来的年度总成本(Y列)和新减less的成本之间的差额。 如果平均成本大于差额,那么2017年1月(Z栏)等于原始成本与降低成本之间的差额。 如果平均数小于差额,则2017年1月相当于2016年的平均月度成本。

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

例如,如果2016年的原始年度成本为35万美元,减less的成本为297,500美元(减less15%),平均每月成本为45,000美元(也是2017年1月的成本),那么我们将计算2月的价值。2017说:

如果平均每月成本($ 45,000)大于($ 350,000 – $ 297,500 – $ 45,000)那么2017年2月= $ 275,300

否则平均每月成本($ 45,000)低于($ 350,000 – $ 297,500 – $ 45,000)Then Feb. 2017 = $ 45,000

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

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

对于第5行, MonthsWithValues应该等于10; 但是,每次我运行代码时,它给了我一个0.我已经尝试使用Step Into,断点/切换点和观察来debugging它。 每次运行代码时,都会说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 

这是给我的错误,因为MonthsWithValues没有被初始化一个数字,所以它被评估为0。

正确的代码是:

 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 

现在它工作! 感谢大家的帮助!