1

エクセル2010、ウィンドウズ7

遅い UDF があります。現在 4,500 セルで使用されており、これはおそらく問題です...しかし、数回以上効率的に使用できない場合、UDF は何の役に立つでしょうか? とにかく、シートの計算には 33 秒もかからず、結果が「固執」しないため、シートを離れてからシートに戻ると、セルはすべて空白になり、再計算する必要があります。UDF は次のとおりです。

    Function SumEmployee(EmployeeName As String, ProgramCode As String, Optional bVolatile As Boolean) As Double
'Written tightly to keep execution as fast as possible. Search every sheet for the first instance of the given employee name and the first instance of
'the given program gl-code.  This will give a row-column (the intersection of the row & column) and the value in that cell location
'will be added up for each sheet in the workbook.  The final summed result is returned.
Dim lRow As Long, lCol As Long, wksSheet As Worksheet

Application.Volatile (bVolatile)  'http://msdn.microsoft.com/en-us/library/office/bb687891.aspx
SumEmployee = 0
For Each wksSheet In Worksheets
    With wksSheet
        If InStr(1, .Name, gTS_Sheet, vbTextCompare) > 0 And bVolatile Then  'Only pull from the TS Summary sheets when HS is visible
            On Error Resume Next  'Errors are part of the routine so this is purposeful
            lRow = .Range("A2:D100").Find(ProgramCode, , xlValues, xlWhole).Row
            lCol = .Range("C2:DA12").Find(EmployeeName, , xlValues, xlWhole).Column
            'If there were no errors then the items were found so sum new value otherwise skip and move to the next sheet
            If Err.Number = 0 Then
                SumEmployee = SumEmployee + .Cells(lRow, lCol).Value2  'No errors so get the value in the cell & add to the running total
            Else
                Err.Clear
            End If
            On Error GoTo 0  'Resume normal error handling
        End If
    End With
Next wksSheet
End Function

UDF が使用されているシートのコードは次のとおりです。

Option Explicit

Private Sub Worksheet_Activate()
'Sheet is active so allow the UDF to function.
    ActiveWorkbook.Names("IsVolatile").RefersToR1C1 = "=TRUE"
End Sub

Private Sub Worksheet_Deactivate()
'Leaving sheet so turn off UDF updating so rest of the wkbk won't lag.
    ActiveWorkbook.Names("IsVolatile").RefersToR1C1 = "=FALSE"
End Sub

これは、UDF がセル内でどのように見えるかです (UDF が隣接するセルに配置されると、最初の 2 つのパラメーターが変化することに注意してください)。

=SumEmployee(D$5,$A6,IsVolatile)

最初のパラメーターは検索する従業員の名前で、2 番目のパラメーターは検索する財務 GL コードです。3 番目のパラメーター IsVolatile は、(アプリケーションのコンテキストで) シートが表示されている場合にのみ関数を実行するように指示します。

UDF はシート「Master」にあります。他のシートは、上部に従業員名 (列ごとに 1 つの従業員名) があり、左側に GL コード (行ごとに 1 つの GL コード) がある月のデータであり、グリッドを形成しています。行/列の交点は、従業員がその GL コード (特定のプログラム) のために働いた時間数です。UDF は従業員とプログラムを検索します。これらは月ごとに異なる可能性があるためです。つまり、新しいプログラムが年の途中で開始される可能性があるため、以前のシートには含まれていません。従業員と同じように、月単位で出入りできるため、.Find メソッドですが、これが速度を落としている可能性があると考えています。シート全体のセル。

  1. これを高速化することは可能ですか?
  2. 次の更新まで結果を「固定」するにはどうすればよいですか?

ありがとうございました。

4

0 に答える 0