3

ワークシートのすべての単一数式と配列数式のリストを出力する VBA 関数を作成したいと思います。範囲の配列数式を 1 回だけ出力する必要があります。

次のようにすべてを実行するUsedRange.Cellsと、複数のセルをカバーするため、各配列数式が何度も出力されます。これは私が望んでいるものではありません。

 For Each Cell In CurrentSheet.UsedRange.Cells
     If Cell.HasArray Then
        St = Range(" & Cell.CurrentArray.Address & ").FormulaArray = " _
                & Chr(34) & Cell.Formula & Chr(34)
     ElseIf Cell.HasFormula Then
        St = Range(" & Cell.Address & ").FormulaR1C1 = " _
                & Chr(34) & Cell.Formula & Chr(34)
     End If
     Print #1, St
 Next

これを回避する良いアイデアはありますか?

4

3 に答える 3

2

次のコードは、次のような出力を生成します。

$B$7 -> =SUM(B3:B6)
$B$10 -> =AVERAGE(B3:B6)
$D$10:$D$13 -> =D5:D8
$F$14:$I$14 -> =TRANSPOSE(D5:D8)

私はコレクションを使用していますが、それは文字列でもかまいません。

Sub GetFormulas()
    Dim ws As Worksheet
    Dim coll As New Collection
    Dim rngFormulas As Range
    Dim rng As Range
    Dim iter As Variant

    Set ws = ActiveSheet
    On Error Resume Next
    Set rngFormulas = ws.Range("A1").SpecialCells(xlCellTypeFormulas)
    If rngFormulas Is Nothing Then Exit Sub 'no formulas
    For Each rng In rngFormulas
        If rng.HasArray Then
            If rng.CurrentArray.Range("A1").Address = rng.Address Then
                coll.Add rng.CurrentArray.Address & " -> " & _
                    rng.Formula, rng.CurrentArray.Address
            End If
        Else
            coll.Add rng.Address & " -> " & _
                rng.Formula, rng.Address
        End If
    Next rng
    For Each iter In coll
        Debug.Print iter
        'or Print #1, iter
    Next iter
    On Error GoTo 0     'turn on error handling
End Sub

主な違いは、調査中の現在のセルがセル A1 の場合にのみ配列数式をコレクションに書き込むことですCurrentArray。つまり、配列の範囲の最初のセルである場合のみです。

もう 1 つの違いは、 を使用した数式を含むセルのみを見ていることです。SpecialCellsこれは、 を調べるよりもはるかに効率的ですUsedRange

于 2013-07-13T19:37:46.047 に答える