web-dev-qa-db-ja.com

マクロを使用して、セル参照をF9のない値に置き換えます

これはExcelマクロの質問です。次のような一連の式が与えられます。

= A1 + A2
= B2 + B2

など、.。

セル全体を置き換えることなく、これらの各セル参照を値に置き換えたいと思います。

= 1 + 2
= 3 + 4

これを手動で行う方法は、数式内の各参照を強調表示して、を押すことです。 F9 参照を値に置き換えます。しかし、私は何千ものセルに対してこれをしなければなりません。これを自動的に実行するマクロはありますか?

4
Neil Grigg

次のモジュールは範囲を取り、セル参照を参照されたセルで見つかった値に置き換えます。 _Range.Precedents_を使用して参照されるセルアドレスを文字列に取得し、Splitを使用してそれをセルアドレスの配列に変換します。次に、この配列を使用して、ターゲットセルの数式内の一致するテキストを検索して置換します。

使用法

  • コード全体をVisualBasicEditorの標準コードモジュールにコピーします。
  • Call ReplaceReferencesWithValues(yourRange)を使用してサブルーチンを呼び出します。

Testマクロは、サブルーチンを呼び出して、選択した範囲の参照を置き換えます。

コード

_Option Explicit


Sub Test()
    Call ReplaceReferencesWithValues(Selection)
End Sub


Sub ReplaceReferencesWithValues(rng As Range)
    Dim cl As Range
    Dim ws As Worksheet
    Dim strTemp As String
    Dim strRef() As String
    Dim intIndex As Integer

    For Each cl In rng
        Set ws = cl.Worksheet
        strTemp = cl.Formula
        strRef() = ReferenceArray(cl)

        For intIndex = LBound(strRef) To UBound(strRef)
            strTemp = Replace(strTemp, strRef(intIndex), _
                ws.Range(strRef(intIndex)).Value)
        Next

        cl.Formula = strTemp
    Next
End Sub


Function ReferenceArray(rngSource As Range) As Variant
    Dim rngRef As Range
    Dim strTemp As String
    On Error Resume Next

    For Each rngRef In rngSource.Precedents.Cells
        strTemp = strTemp & ", " & rngRef.Address(False, False)
    Next
    If Len(strTemp) > 0 Then strTemp = Mid(strTemp, 3)

    ReferenceArray = Split(strTemp, ", ")
End Function
_

懸念事項

  • 置換はStringとして行われるため、数式にcell "A1"への参照と他のテキストの両方が含まれる場合「A1」を含めると、一致するテキストもcell「A1」の値に置き換えられます。
  • SUMなど、関数に範囲を必要とする数式は、参照をセル値に置き換えようとすると壊れます。
2
natancodes