2013-03-10 10 views
8

Ich habe eine Arbeitsmappe, um 'Smart'-Diagramme auf meine Ausgaben zu tun. Es läuft seit einem Jahr und es gibt jetzt viele Grafiken und Ausgaben. Excel löst jetzt einen Fehler außerhalb der Ressourcen aus, wenn ich etwas ändere oder die Arbeitsmappe öffne. Die Sache ist, ich habe Lose von Ressourcen und seine nicht mit kaum einer von ihnen.Excel lief die Ressourcen beim Versuch, eine oder mehrere Formeln zu berechnen

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

Ich habe 2 Blatt, genannt das erste Blatt Aufwendungen 3 Spalten hat [ein Datum, eine Beschreibung, Betrag] und ungefähr 1500 Zeilen von Daten. Das zweite Blatt hat eine LOT (500 oder so) von Formeln, die alle gleich sind und zielen darauf ab, "Sum alle Ausgaben zwischen Datum X und Y, wo Beschreibung entspricht-eine gewisse Nadel" zu tun. Die Formel I haben, ist dies:

= 
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 
    ) 
) 

Kann ich Excel mehr Ressourcen geben? (Ich bin froh, dass es meinen ganzen Widder benutzt, und tuck meine CPU für ein paar Minuten).

Gibt es einen effizienteren Weg, ich kann diese Formel tun?

Ich verstehe, dass diese Formel ein großes Gitter erstellt und meine Ausgabenliste damit maskiert, und dass für jede Formel dieses Gitter erstellt werden muss. Soll ich stattdessen ein Makro erstellen, um dies effizienter zu machen? Wenn ich ein Makro hätte, würde ich es von einer Zelle irgendwie wie

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

Ist das möglich?

Danke.

+0

Es ist möglich, dass ein einzelnes Objekt zu groß geworden ist. Es gibt Größenbeschränkungen in Sprachen (z. B. .NET), wie groß ein einzelnes Objekt sein kann. –

+0

Ich nehme an. Ich würde erwarten, dass es andere Benutzer mit weitaus größeren und komplizierteren Arbeitsmappen als mich gibt. Ich bin überrascht, dass ich schon bei einem so kleinen Datensatz auf Probleme stoße. – flacnut

+0

Ist das ein schöner hübscher Excel-Popup-Fehler oder ist das ein wütender Windows-Fehler? –

Antwort

2

Ich habe versucht, eine Funktion zu erstellen, die hoffentlich repliziert, was Ihre aktuelle Gleichung in VBA mit ein paar Unterschieden tut. Da ich die Besonderheiten Ihres zweiten Blattes nicht kenne, hilft das Caching vielleicht gar nicht.

Wenn Ihr zweites Blatt den gleichen Datumsbereich für alle Anrufe zu sumExpenses verwendet, sollte es ein bisschen schneller sein, da es alles auf den ersten Durchlauf vorsummiert. Wenn sich Ihr Datumsbereich ändert, dann macht es nur eine Menge Arbeit für nichts.

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

Wenn Sie dies als UDF verwenden möchten, müssen Sie 'Application.Volatile True' als erste Zeile der Funktion festlegen. Sonst würde es nie neu berechnet. Wenn Sie viele flüchtige UDFs verwenden, verlangsamt sich die Arbeitsmappe jedoch wahrscheinlich auf einen Crawlvorgang. Wenn Sie es nicht flüchtig machen, wird es nur neu berechnet, wenn Sie die Formel in einer Zelle bearbeiten, die sie aufruft. Wenn Sie 500 Zellen haben, die diese UDF aufrufen, dann bedeutet das 500 Bearbeitungen. Siehe Referenz [hier] (http://msdn.microsoft.com/en-us/library/ff195441%28v=office.14%29.aspx) – barrowc

+0

Dies ist wirklich nützlich @ NickSlash! Wird der Cache die Objekte für die nächste Funktion beibehalten? Ich dachte daran, eine UDF zu erstellen, in der zuerst alle Ausgaben in eine Sammlung von UserDefinedTypes mit dem [date, desc, amnt] gelesen werden. Die UDF wird prüfen, ob der Cache existiert, wenn dies der Fall ist, basierend auf dem Cache berechnen, wenn nicht, den Cache erstellen und dann basierend darauf berechnen. – flacnut

+0

@NickSlash, ich habe gerade Ausdauer getestet, es funktioniert! Ich werde Ihre Antwort mit ein paar Optimierungen für meine Situation verwenden, danke für Ihre Hilfe - ich war mir der UDFs nicht bewusst. – flacnut

5

Ich hatte ein ähnliches Problem, wo es um etwa 150 Zeilen ein paar Matrixformeln waren und ich habe diesen Fehler, was mich wirklich verblüfft, weil es wirklich nicht so viele Formeln zu berechnen. Ich unsere IT-Mann kontaktiert und er erklärt die folgende, von denen einige verstehe ich, die meisten von denen ich nicht:

Im Allgemeinen, wenn der Computer versucht, große Datenmengen zu verarbeiten, verwendet es Multi-Threaded-Berechnung, wo es verwendet alle 8 Prozessoren, die der Computer sich selbst einfallen lässt. Wenn die Multithread-Berechnung deaktiviert ist, löst der Computer den Fehler "Excel wurde nicht ausgeführt" aus.

Um die Multithreading-Berechnung zu deaktivieren, rufen Sie die Registerkarte "Datei" in Ihrer Excel-Arbeitsmappe auf und wählen Sie "Optionen". Auf der rechten Seite der Box, die erscheint, wählen Sie "Erweitert" und scrollen Sie nach unten zur Überschrift "Formeln". Unter dieser Überschrift befindet sich ein Kontrollkästchen mit dem Hinweis "Multithreading-Berechnung aktivieren". Entfernen Sie den Haken, wählen Sie "OK" und berechnen Sie Ihre Formeln neu.

+0

Gelöst es für mich, große Einsicht! –

1

Es könnte viele Gründe dafür geben. Ich wünschte nur, Excel würde uns sagen, welcher (oder mehr) der "üblichen Verdächtigen" begeht zu diesem Zeitpunkt den Straftatbestand des RAM-Hogging.

Auch für

  1. Circular Referenzen

  2. Fragmented Conditional Formatierung (verursacht durch Ausschneiden, Einfügen, Sortieren, Löschen und Hinzufügen Zellen oder Zeilen.

  3. Fehler führt #N/A, #REF, # DIV/0! Usw.,

  4. Übermäßige Verwendung der flüchtigen Funktionen TODAY(), NOW() usw.

  5. Zu viele verschiedene Formate verwendet

... in dieser Reihenfolge

Während Sie dort sind, überprüfen Sie für

  1. Gebrochene Links. Eine Formel, die auf einem frischen Wert von externen Daten beruht, könnte einen Fehler zurückgeben.

  2. Alle Formeln mit #REF !. Wenn Ihre Formeln so durcheinander sind, können diese auch vorhanden sein. Sie verursachen kein Fehler-Flag, können jedoch einige nicht gemeldete Fehler verursachen. Wenn Ihre Formeln durch eine frühere Bedingung erfüllt sind, enthält der Teil der Formel #REF! wird erst ausgewertet, wenn andere Bedingungen vorliegen.

Verwandte Themen