【问题标题】:Excel VBA - Formula Breaks After Adding Data in SpreadsheetExcel VBA - 在电子表格中添加数据后公式中断
【发布时间】:2016-08-02 22:27:52
【问题描述】:

我有一个 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 年的原始年度成本为 350,000 美元,减少后的成本为 297,500 美元(降低 15%),平均每月成本为 45,000 美元(也是 2017 年 1 月的成本),那么我们将计算2017 年 2 月的值:

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

其他平均每月费用 ($45,000) 低于 ($350,000 - $297,500 - $45,000) 那么 2017 年 2 月 = $45,000

这种模式一直持续到 2017 年 12 月,AK 栏。

在我将数字添加到电子表格的第 5 行之前,我的所有代码都运行良好。添加数据后,我的 COUNTIFS 公式不再返回正确的结果。

对于第 5 行,MonthsWithValues 应等于 10;但是,现在每次运行代码时,它都会给我一个 0。我尝试使用 Step Into、Break Points/Toggle Points 和 Watch 对其进行调试。每次我运行代码时,它总是说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 = MonthsWithValues + Excel...
  • 公式的最后一部分应该是"&lt;&gt;"""""(或只是"&lt;&gt;")而不是"&lt;&gt;"""(除非您试图检查范围内是否存在引号),但这不是您的问题的原因。
  • 您的代码所在的 With 块使用什么?如果是工作表,是不是上面有你的数据?
  • 没有足够的数据来重现您的错误。请阅读How do I Ask a Good Question 和How to create a Minimal, Complete, and Verifiable example 的帮助主题
  • @RonRosenfeld,我已经重新格式化了我上面的问题并添加了相关代码。如果我需要添加或澄清任何内容,请告诉我。

标签: vba excel


【解决方案1】:

它给了我错误,因为 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

现在可以了!感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 2011-12-14
    相关资源
    最近更新 更多