ワークシート.cellsを関数に送信すると、ワークシート全体のすべてのセルがチェックされ、非常に多く、非常に遅くなります。Excel2007+は16384*1048576行をサポートしていますが、実際に使用されたセルのみがメモリにロードされます。チェックするために他の170億個のセルすべてを調べる必要はありません。これらを特定するのに最も近いのは、Worksheet.UsedRangeを使用して任意の範囲の入力を制限することでした。ただし、遠く離れたセルを使用した場合は、完全ではありません。たとえば、セルA1とXFD1048576にデータが含まれている場合、ワークシート全体がUsedRangeに含まれます。実際に使用されるセル(上記の例では2つのセル)に範囲を制限する方法に関するヒントをいただければ幸いです。
UsedRangeを利用して、他の誰かがそれを利用できる場合に備えて共有する関数を作成しました。
Public Function CountIfFormula(ByRef rng As Range, Optional ByVal matchStr As String) As Long
'Counts the number of cells containing a formula and optionally a specific string (matchStr) in the formula itself.
Dim i As Long
Dim isect As Range
'Restricts the range to used cells (checks only cells in memory)
Set isect = Application.Intersect(rng, rng.Parent.UsedRange)
For Each cell In isect
If cell.HasFormula Then
If InStr(1, cell.Formula, matchStr) Then i = i + 1
End If
Next
CountIfFormula = i
End Function
関数の使用:
Sub GetNrOfCells()
Dim i As Long
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
i = i + CountIfFormula(ws.Cells, "=SUM(")
Next
'i will now contain the number of cells using the SUM function
End Sub
よろしくお願いいたします。ご返信ありがとうございます。
フォッシー