エクセル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 メソッドですが、これが速度を落としている可能性があると考えています。シート全体のセル。
- これを高速化することは可能ですか?
- 次の更新まで結果を「固定」するにはどうすればよいですか?
ありがとうございました。