Excel исчерпал ресурсы при попытке вычислить одну или несколько формул

у меня есть книга, чтобы сделать "умные" -графики на мои расходы. Он работает в течение года, и теперь есть много графиков и расходов. Теперь Excel выдает ошибку "вне ресурсов" всякий раз, когда я что-либо изменяю или открываю книгу. Дело в том, что у меня много ресурсов и его не использовать вряд ли любой из них.

Win8 64bit w/ 8 core CPU and 32GB of ram
Office 2013 64bit

у меня есть 2 листа, первый лист называется расходы имеет 3 столбца [дата, описание, сумма] и около 1500 строк данных. Второй лист имеет много (500 или около того) формул, которые все одинаковы и направлены на то, чтобы "суммировать все расходы между датой X и Y, где описание совпадает-некоторая игла-". Формула у меня такая:

=
ABS(
    SUMPRODUCT(
        --(Expenses!A:A >= DATE(2011,12,1)), 
        --(Expenses!A:A < DATE(2012,1,1)), 
        --(ISNUMBER(FIND(C50,Expenses!B:B))),
        Expenses!C:C
    )
)

могу ли я предоставить Excel больше ресурсов? (Я рад, что он использует всю мою ОЗУ и пыхтит мой процессор в течение нескольких минут).

существует ли более эффективный способ сделать эту формулу?

Я понимаю, что эта формула создает большую сетку и маскирует мой список расходов с ней, и что для каждой формулы должна быть создана эта сетка. Должен ли я создать макрос, чтобы сделать это более эффективно? Если бы у меня был макрос, я бы хотел вызвать его из ячейки как-то вроде

=sumExpenses(<startDate>, <endDate>, <needle>)

это возможно?

спасибо.

3 ответов


Я попытался создать функцию, которая, надеюсь, реплицирует то, что делает ваше текущее уравнение в VBA с несколькими различиями. Поскольку я не знаю особенностей вашего второго листа, кэширование может вообще не помочь.

Если ваш второй лист использует тот же диапазон дат для всех вызовов sumExpenses тогда это должно быть немного быстрее, так как он предварительно суммирует все на первом проходе, если ваш диапазон дат изменяется во всем, то он просто делает много работы впустую.

Public Cache As Object
Public CacheKey As String

Public Function sumExpenses(ByVal dS As Date, ByVal dE As Date, ByVal sN As String) As Variant
Dim Key As String
Key = Day(dS) & "-" & Month(dS) & "-" & Year(dS) & "_" & Day(dE) & "-" & Month(dE) & "-" & Year(dE)

    If CacheKey = Key Then
        If Not Cache Is Nothing Then
            If Cache.Exists(sN) Then
                sumExpenses = Cache(sN)
                Exit Function
            End If
            Set Cache = Nothing
        End If
    End If
    CacheKey = Key
    Set Cache = CreateObject("Scripting.Dictionary")

    Dim Expenses As Worksheet
    Dim Row As Integer
    Dim Item As String

    Set Expenses = ThisWorkbook.Worksheets("Expenses")

    Row = 1

    While (Not Expenses.Cells(Row, 1) = "")
        If Expenses.Cells(Row, 1).Value > dS And Expenses.Cells(Row, 1).Value < dE Then
            Item = Expenses.Cells(Row, 2).Value
            If Cache.Exists(Item) Then
                Cache(Item) = Cache(Item) + Expenses.Cells(Row, 3).Value
            Else
                Cache.Add Item, Expenses.Cells(Row, 3).Value
            End If
        End If
        Row = Row + 1
    Wend

    If Cache.Exists(sN) Then
        sumExpenses = Cache(sN)
    Else
        sumExpenses = CVErr(xlErrNA)
    End If

End Function

Public Sub resetCache()
    Set Cache = Nothing
    CacheKey = ""
End Sub

У меня была аналогичная проблема, когда было несколько формул массива около 150 строк, и я получил эту ошибку, которая действительно озадачила меня, потому что на самом деле не так много формул для вычисления. Я связался с нашим ИТ-парнем, и он объяснил следующее, Некоторые из которых я понимаю, большинство из которых я не знаю:

обычно, когда компьютер пытается обработать большие объемы данных, он использует многопоточный расчет, где он использует все 8 процессоров, в которые компьютер обманывает себя думаю, что да. Когда многопоточный расчет выключен, компьютер не выбрасывает " Excel закончились ресурсы...' ошибка.

чтобы отключить многопоточный расчет, перейдите на вкладку "Файл" в книге Excel и выберите "Параметры". В правой части окна выберите "Дополнительно" и прокрутите вниз до заголовка "формул". Под этим заголовком установлен флажок "Включить многопоточный расчет". Снимите его, затем выберите " OK " и пересчитать рецептурный.


там может быть много причин этого. Я просто хочу, чтобы Excel сказал нам, какой из (или более) "обычных подозреваемых" совершает преступление RAM hogging в это время.

искать

  1. циклические ссылки

  2. фрагментированное Условное форматирование (вызванное вырезанием, вставкой, сортировкой, удалением и добавлением ячеек или строк.

  3. ошибки, приводящие к #N/A, #REF, #DIV / 0! и т. д.

  4. чрезмерное использование летучих функций TODAY (), NOW () и т. д.

  5. слишком много различных форматов, используемых

... в таком порядке

пока вы там, проверить

  1. битые ссылки. Формула, полагающаяся на новое значение из внешних данных, может вернуть ошибку.

  2. любые формулы, содержащие #REF!. Если ваши формулы настолько запутаны, то они вполне могут быть присутствовать также. Они не будут вызывать флаг ошибки, но могут вызвать некоторые несообщаемые ошибки. Если ваши формулы удовлетворяются более ранним условием, то часть формулы, содержащая #REF! не будет оцениваться до тех пор, пока не будут соблюдены другие условия.