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 в это время.
искать
циклические ссылки
фрагментированное Условное форматирование (вызванное вырезанием, вставкой, сортировкой, удалением и добавлением ячеек или строк.
ошибки, приводящие к #N/A, #REF, #DIV / 0! и т. д.
чрезмерное использование летучих функций TODAY (), NOW () и т. д.
слишком много различных форматов, используемых
... в таком порядке
пока вы там, проверить
битые ссылки. Формула, полагающаяся на новое значение из внешних данных, может вернуть ошибку.
любые формулы, содержащие #REF!. Если ваши формулы настолько запутаны, то они вполне могут быть присутствовать также. Они не будут вызывать флаг ошибки, но могут вызвать некоторые несообщаемые ошибки. Если ваши формулы удовлетворяются более ранним условием, то часть формулы, содержащая #REF! не будет оцениваться до тех пор, пока не будут соблюдены другие условия.