2016-08-28 2 views
0

Мы помогаем компаниям снизить плату за потребление энергии, для этого мы используем накопитель энергии (10 ', 20' или 40 'контейнеров) с огромным мозгом, который имеет передовые алгоритмы, чтобы знать, что такое лучшее действие, основанное на их историческом использовании. У нас есть макрос, который помогает нам найти правильный размер uGrid (Energy Storage Solution) в зависимости от их 15-минутных инкрементных данных. Основная часть нашего расчета - это код GoalSeek, но это занимает много времени.Код GoalSeek, который нуждается в оптимизации

Каждая итерация GoalSeek проходит через данные за каждый месяц, состоящий из 96 разделенных точек данных в день. Таким образом, набор данных за полный год содержит 35 040 строк интервальных данных.

В листе есть много других расчетов, из которых мы получаем понимание того, какую систему нам нужно проектировать.

Какие идеи у вас есть, чтобы сделать это более эффективным?

If Range("H1") > 1 Then 
     Application.EnableEvents = False 'Prevent looping based on the 'change' caused by multiplication 
     Cells(16, 7) = Cells(16, 7) * Range("H1") 
     Application.EnableEvents = True 'allow events again 
End If 
     If Range("E3") = Range("SetNumberkW") Then 
     'Range("D3").Value = 0 
    Else: 
     Range("D3").Value = 0 
     Range("G3").GoalSeek Goal:=Range("SetNumberkWh"), ChangingCell:=Range("D3") 
    End If 
    If Range("E4") = Range("SetNumberkW") Then 
     Range("D4").Value = 0 
    Else: 
     Range("D4").Value = 0 
     Range("G4").GoalSeek Goal:=Range("SetNumberkWh"), ChangingCell:=Range("D4") 
    End If 
    If Range("E5") = Range("SetNumberkW") Then 
     Range("D5").Value = 0 
    Else: 
     Range("D5").Value = 0 
     Range("G5").GoalSeek Goal:=Range("SetNumberkWh"), ChangingCell:=Range("D5") 
    End If 
    If Range("E6") = Range("SetNumberkW") Then 
     Range("D6").Value = 0 
    Else: 
     Range("D6").Value = 0 
     Range("G6").GoalSeek Goal:=Range("SetNumberkWh"), ChangingCell:=Range("D6") 
    End If 
    If Range("E7") = Range("SetNumberkW") Then 
     Range("D7").Value = 0 
    Else: 
     Range("D7").Value = 0 
     Range("G7").GoalSeek Goal:=Range("SetNumberkWh"), ChangingCell:=Range("D7") 
    End If 
    If Range("E8") = Range("SetNumberkW") Then 
     Range("D8").Value = 0 
    Else: 
     Range("D8").Value = 0 
     Range("G8").GoalSeek Goal:=Range("SetNumberkWh"), ChangingCell:=Range("D8") 
    End If 
    If Range("E9") = Range("SetNumberkW") Then 
     Range("D9").Value = 0 
    Else: 
     Range("D9").Value = 0 
     Range("G9").GoalSeek Goal:=Range("SetNumberkWh"), ChangingCell:=Range("D9") 
    End If 
    If Range("E10") = Range("SetNumberkW") Then 
     Range("D10").Value = 0 
    Else: 
     Range("D10").Value = 0 
     Range("G10").GoalSeek Goal:=Range("SetNumberkWh"), ChangingCell:=Range("D10") 
    End If 
    If Range("E11") = Range("SetNumberkW") Then 
     Range("D11").Value = 0 
    Else: 
     Range("D11").Value = 0 
     Range("G11").GoalSeek Goal:=Range("SetNumberkWh"), ChangingCell:=Range("D11") 
    End If 
    If Range("E12") = Range("SetNumberkW") Then 
     Range("D12").Value = 0 
    Else: 
     Range("D12").Value = 0 
     Range("G12").GoalSeek Goal:=Range("SetNumberkWh"), ChangingCell:=Range("D12") 
    End If 
    If Range("E13") = Range("SetNumberkW") Then 
     Range("D13").Value = 0 
    Else: 
     Range("D13").Value = 0 
     Range("G13").GoalSeek Goal:=Range("SetNumberkWh"), ChangingCell:=Range("D13") 
    End If 
    If Range("E14") = Range("SetNumberkW") Then 
     Range("D14").Value = 0 
    Else: 
     Range("D14").Value = 0 
     Range("G14").GoalSeek Goal:=Range("SetNumberkWh"), ChangingCell:=Range("D14") 
    End If 
    ' Start the kW offset part of the programming 
    If Range("F3") <= Range("SetNumberkW") Then 
     Range("D19").Value = 0 
    Else: 
     Range("D19").Value = 0 
     Range("F19").GoalSeek Goal:=Range("SetNumberkW"), ChangingCell:=Range("D19") 
    End If 

    If Range("F4") <= Range("SetNumberkW") Then 
     Range("D20").Value = 0 
    Else: 
     Range("D20").Value = 0 
     Range("F20").GoalSeek Goal:=Range("SetNumberkW"), ChangingCell:=Range("D20") 
    End If 

    If Range("F5") <= Range("SetNumberkW") Then 
     Range("D21").Value = 0 
    Else: 
     Range("D21").Value = 0 
     Range("f21").GoalSeek Goal:=Range("SetNumberkW"), ChangingCell:=Range("D21") 
    End If 

    If Range("F6") <= Range("SetNumberkW") Then 
     Range("D22").Value = 0 
    Else: 
     Range("D22").Value = 0 
     Range("f22").GoalSeek Goal:=Range("SetNumberkW"), ChangingCell:=Range("D22") 
    End If 

    If Range("F7") <= Range("SetNumberkW") Then 
     Range("D23").Value = 0 
    Else: 
     Range("D23").Value = 0 
     Range("f23").GoalSeek Goal:=Range("SetNumberkW"), ChangingCell:=Range("D23") 
    End If 

    If Range("F8") <= Range("SetNumberkW") Then 
     Range("D24").Value = 0 
    Else: 
     Range("D24").Value = 0 
     Range("F24").GoalSeek Goal:=Range("SetNumberkW"), ChangingCell:=Range("D24") 
    End If 

    If Range("F9") <= Range("SetNumberkW") Then 
     Range("D25").Value = 0 
    Else: 
     Range("D25").Value = 0 
     Range("F25").GoalSeek Goal:=Range("SetNumberkW"), ChangingCell:=Range("D25") 
    End If 

    If Range("F10") <= Range("SetNumberkW") Then 
     Range("D26").Value = 0 
    Else: 
     Range("D26").Value = 0 
     Range("F26").GoalSeek Goal:=Range("SetNumberkW"), ChangingCell:=Range("D26") 
    End If 

    If Range("F11") <= Range("SetNumberkW") Then 
     Range("D27").Value = 0 
    Else: 
     Range("D27").Value = 0 
     Range("F27").GoalSeek Goal:=Range("SetNumberkW"), ChangingCell:=Range("D27") 
    End If 

    If Range("F12") <= Range("SetNumberkW") Then 
     Range("D28").Value = 0 
    Else: 
     Range("D28").Value = 0 
     Range("F28").GoalSeek Goal:=Range("SetNumberkW"), ChangingCell:=Range("D28") 
    End If 

    If Range("F13") <= Range("SetNumberkW") Then 
     Range("D29").Value = 0 
    Else: 
     Range("D29").Value = 0 
     Range("F29").GoalSeek Goal:=Range("SetNumberkW"), ChangingCell:=Range("D29") 
    End If 

    If Range("F14") <= Range("SetNumberkW") Then 
     Range("D30").Value = 0 
    Else: 
     Range("D30").Value = 0 
     Range("F30").GoalSeek Goal:=Range("SetNumberkW"), ChangingCell:=Range("D30") 
    End If 
+1

Если рабочий код, который вы хотите рецензирование для того, чтобы оптимизировать ваш вопрос должен быть размещен на [codereview.se]. Этот сайт предназначен для вопросов с проблемным кодом. –

ответ

0

Немного зацикливание и кода, по крайней мере, быть более управляемым ...

Dim c As Range, rw As Range 

If Range("H1") > 1 Then 
     Application.EnableEvents = False 'Prevent looping based on the 'change' caused by multiplication 
     Cells(16, 7) = Cells(16, 7) * Range("H1") 
     Application.EnableEvents = True 'allow events again 
End If 

For Each c In Range("E3:E14") 
    Set rw = c.EntireRow 
    If c.Value = Range("SetNumberkW") Then 
     rw.Cells(4).Value = 0 
    Else 
     rw.Cells(4).Value = 0 
     rw.Cells(7).GoalSeek Goal:=Range("SetNumberkWh"), ChangingCell:=rw.Cells(4) 
    End If 
Next c 

For Each c In Range("F3:F14") 
    Set rw = c.Offset(16, 0).EntireRow 
    If c.Value <= Range("SetNumberkW") Then 
     rw.Cells(4).Value = 0 
    Else 
     rw.Cells(4).Value = 0 
     rw.Cells(5).GoalSeek Goal:=Range("SetNumberkWh"), ChangingCell:=rw.Cells(4) 
    End If 
Next c 
+0

Тим спасибо за ваше время. Я просто невежественный новичок, взламывающий свой путь через VGA, чтобы обеспечить лучшее обслуживание клиентов и более быстрый и более точный дизайн. Я проведу вечер, узнав о новых терминах, о которых я не знаком, и о внесении изменений. Еще раз спасибо за то, что нашли время, ваши знания, очевидно, широки. – user2585179

Смежные вопросы