web-dev-qa-db-ja.com

1つ以上の数式を計算しようとしたときに、Excelでリソースが不足しました

私は「スマート」を行うためのワークブックを持っています-私の経費のグラフ。それは1年間実行されており、今では多くのグラフと費用があります。何かを変更したり、ブックを開いたりすると、Excelがリソース不足エラーをスローするようになりました。実は、私にはlotsのリソースがあり、それらをほとんど使用していません。

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

私は2枚のシートを持っています。Expensesという最初のシートには3列の[Date、Description、Amount]と約1500行のデータがあります。 2番目のシートには、すべて同じで、「説明が一致する日付XとYの間のすべての費用の合計-いくつかの針-」を目的とした数式がたくさんあります(500程度)。私が持っている式はこれです:

=
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にさらにリソースを与えることはできますか? (すべてのRAMを使用して、CPUを数分間動かして満足しています)。

この式を実行するためのより効率的な方法はありますか?

この数式が大きなグリッドを作成し、それで経費リストをマスクしていること、および数式ごとにこのグリッドを作成する必要があることを理解しています。代わりに、これをより効率的に行うためにマクロを作成する必要がありますか?マクロがあったら、どういうわけかセルから呼び出したいと思います。

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

それは可能ですか?

ありがとう。

9
flacnut

いくつかの違いはありますが、現在の方程式がVBAで行うことをうまく再現する関数を作成することにしました。 2枚目のシートの詳細がわからないため、キャッシュはまったく役に立たない可能性があります。

2番目のシートが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
2
NickSlash

同様の問題が発生し、約150行にいくつかの配列数式があり、このエラーが発生しました。計算する数式がそれほど多くないため、非常に困惑しました。私はIT担当者に連絡しましたが、彼は次のことを説明しました。その一部は理解していますが、ほとんどは理解していません。

一般に、コンピューターが大量のデータを処理しようとすると、マルチスレッド計算が使用されます。この計算では、コンピューターがだまして自分が持っていると思わせる8つのプロセッサーすべてを使用します。マルチスレッド計算がオフになっている場合、コンピューターは「Excelのリソースが不足しています...」エラーをスローしません。

マルチスレッド計算をオフにするには、Excelワークブックの[ファイル]タブに移動し、[オプション]を選択します。表示されるボックスの右側で、[詳細設定]を選択し、[数式]の見出しまで下にスクロールします。その見出しの下には、「マルチスレッド計算を有効にする」というチェックボックスがあります。チェックを外し、[OK]を選択して、数式を再計算します。

6
Mackles24

これには多くの原因が考えられます。現時点で、「通常の容疑者」の1人(または複数)がRAM)の犯罪を犯していることをExcelが教えてくれることを願っています。

また、探してください

  1. 循環参照

  2. 断片化された条件付き書式(セルまたは行の切り取り、貼り付け、並べ替え、削除、および追加によって発生します。

  3. #N/A、#REF、#DIV/0になるエラー!等、

  4. 揮発性関数TODAY()、NOW()などの使いすぎ。

  5. 使用されているフォーマットが多すぎます

...この順序で

あなたがそこにいる間、チェックしてください

  1. 壊れたリンク。外部データからの新しい値に依存する数式は、エラーを返す可能性があります。

  2. #REF!を含む数式。あなたの公式がめちゃくちゃであるならば、これらもまた存在するかもしれません。エラーフラグは発生しませんが、報告されていないエラーが発生する可能性があります。数式が以前の条件で満たされている場合、数式の#REFを含む部分!他の条件が適用されるまで評価されません。

1
Mike Benstead