11

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

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

私は 2 つのシートを持っています。Expensesという最初のシートには、[日付、説明、金額] の 3 つの列と約 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>)

それは可能ですか?

ありがとう。

4

3 に答える 3

8

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

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

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

于 2015-07-22T20:50:57.837 に答える
2

現在の方程式が 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
于 2013-03-11T01:44:01.627 に答える
1

これには多くの原因が考えられます。現時点で RAM ホギングの違反を犯している「通常の容疑者」の 1 人 (またはそれ以上) を Excel が教えてくれることを願っています。

こちらもお探しください

  1. 循環参照

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

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

  4. 揮発性関数 TODAY()、NOW() などの過剰使用。

  5. あまりにも多くの異なるフォーマットが使用されています

...その順序で

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

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

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

于 2016-07-17T05:55:02.807 に答える