2016-08-02 5 views
1

Ich habe eine Excel-Tabelle mit monatlichen Kosten für Januar 2016 bis Dezember 2016 (Spalten M bis X). Es gibt auch zwei Knöpfe auf dem Blatt. Wenn Sie auf die Schaltfläche "Analyse durchführen" klicken, werden die monatlichen Kosten um den in Spalte D eingegebenen Prozentsatz reduziert (d. H., Wenn Sie in Spalte D 15 eingeben, werden die Spalten M (Januar) bis X (Dezember) um 15% reduziert).Excel VBA - Formel bricht nach dem Hinzufügen von Daten in Spreadsheet

Sobald die Spalten M bis X verkleinert sind, werden die Spalten Z (Jan. 2017) bis AK (Dez. 2017) ausgefüllt. Um den Wert der Spalten Z bis AK zu ermitteln, sehe ich, ob die durchschnittlichen monatlichen Kosten für 2016 größer oder kleiner als die Differenz zwischen den ursprünglichen jährlichen Gesamtkosten für 2016 (Spalte Y) und den neu reduzierten Kosten sind. Wenn die Durchschnittskosten größer als die Differenz sind, entspricht Jan. 2017 (Spalte Z) der Differenz zwischen den ursprünglichen Kosten und den reduzierten Kosten. Wenn der Durchschnitt weniger als die Differenz ist, entspricht Jan. 2017 den durchschnittlichen monatlichen Kosten für 2016.

Als Nächstes verwenden wir dieselbe Logik wie oben, um den Wert der Spalte AA (Feb. 2017) zu ermitteln. Diesmal subtrahieren wir den Wert von Januar 2017 von der Differenz zwischen den ursprünglichen jährlichen Kosten für 2016 und den neu reduzierten Kosten. Wenn zum Beispiel die ursprünglichen jährlichen Kosten für 2016 350.000 $ betrugen und die reduzierten Kosten 297.500 $ (reduziert um 15%) betrugen und die durchschnittlichen monatlichen Kosten 45.000 $ (auch die Kosten für Januar 2017) betrugen, würden wir berechnen.

der Wert für Februar 2017 mit den Worten:

Wenn durchschnittlich monatlich Kosten ($ 45,000) größer als ($ 350.000 - $ 297.500 - $ 45.000) Then 2017 Februar = 275.300 $

Else durchschnittlich monatlich Kosten ($ 45.000) weniger als ($ 350.000 - $ 297,500 - $ 45,000) Dann Feb. 2017 = $ 45,000

Dieses Muster fährt bis Dez. 2017, Spalte AK fort.

Mein gesamter Code funktionierte großartig, bis ich in meiner Tabellenkalkulation Zahlen zu Zeile 5 hinzufügte. Nachdem ich die Daten hinzugefügt habe, gibt meine COUNTIFS-Formel das richtige Ergebnis nicht mehr zurück.

Für Zeile 5 sollte 10 gleich 10 sein; Aber jedes Mal, wenn ich den Code jetzt starte, gibt es mir eine 0. Ich habe versucht, es mit Step Into, Break Points/Toggle Points und Watch zu debuggen. Jedes Mal, wenn ich den Code ausführe, sagt es immer, dass der Wert 10 0 ist. Da mein Code eine Formel enthält, durch die ich dividiere durch MonthsWithValues, bekomme ich Laufzeitfehler 11 (Sie können nicht durch 0 dividieren). Hilfe! Der entsprechende Code ist:

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 
+0

Ich denke, dass Sie sie hinzufügen möchten "MonthsWithValues ​​= MonthsWithValues ​​+ Excel ..." – Slai

+2

Der letzte Teil Ihrer Formel sollte stattdessen "" <> "" "" "(oder nur' "<>" ') sein von '" <> "" "' (es sei denn, Sie versuchen, die Existenz eines Anführungszeichens innerhalb des Bereichs zu überprüfen), aber das ist nicht der Grund für Ihr Problem. – YowE3K

+0

Was verwenden Sie für den With-Block, in dem sich Ihr Code befindet? Wenn es ein Arbeitsblatt ist, ist es das mit Ihren Daten? – YowE3K

Antwort

1

Es mir den Fehler gab, weil MonthsWithValues nicht mit einer Zahl initialisiert wurde, so war es der richtige Code auf 0

ausgewertet ist:

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 

Jetzt funktioniert es! Danke für die Hilfe alle!

Verwandte Themen