4

次のVBA関数は、指定された範囲の数式を含むセルの数をカウントします。VBAサブから呼び出された場合は正しく機能します。Excelから呼び出されると、範囲内のセルの総数が返されます。

Excelからの呼び出しはです。これは=CountFormulas(A1:C7)、数式を含む2つのセルのみが範囲内にある場合でも、21を返します。

この不一致の原因は何ですか?

Public Function CountFormulas(ByRef rng As Range) As Long
    CountFormulas = rng.SpecialCells(xlCellTypeFormulas).Count
End Function

Public Sub CountFormulasFromSub()
    Dim rng As Range
    Dim res As Integer
    Set rng = Sheet1.Range("a1:c7")
    res = CountFormulas(rng)
End Sub
4

2 に答える 2

3

これは不可能です。次のリンクには、UDF内では機能しないものがあります。
ここで-http://support.microsoft.com/kb/170787

編集:しかし、手動で数える方法は機能します。

Public Function CountFormulas(rng As Range) As Integer
Dim i As Integer
Dim cell As Range

For Each cell In rng
    If cell.HasFormula Then
        i = i + 1
    End If
Next

CountFormulas = i
End Function

32767を超えると思われる場合はに変更Integerしてください。Long

于 2013-01-03T15:32:17.227 に答える
0

ワークシート.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

よろしくお願いいたします。ご返信ありがとうございます。

フォッシー

于 2013-01-04T08:05:05.613 に答える