Excel のセルの数式を取得し、セルへのすべての参照をその内容を持つ別の数式に置き換えます。

Excel のセルの数式を取得し、セルへのすべての参照をその内容を持つ別の数式に置き換えます。

コメントに基づいて、私が何を求めているのかを明確にします。

複数のセルにまたがるネストされた数式を 1 つの数式に平坦化したいと考えています。

次の例は、手動で実行する方法を示したものです。ただし、数式の種類は任意であり、以下の例とはまったく関係ありません。

コード/ツール/Excel自体を使用して次のことが可能かどうか興味がありました - 数式を表示したExcel

画像からわかるように、in hours数式は非常に単純ですが、実際には他のセルの数式が多数含まれています。1 つの巨大な数式内のすべての数式を使用して生成された 1 つの数式を取得することで、中間計算を省くことができるかどうか疑問に思っていました。

この方法では大規模な数式を設計およびデバッグするのは簡単ですが、実稼働環境では、初心者のユーザーがシートを変更しようとして数式の一部を簡単に破壊してしまう可能性があります。シートをロックし、他のものをロック解除することで保護することもできますが、数式の範囲を拡張したり、新しい行を追加したりできなくなるなど、意図しない副作用もあります。

そのため、生産においては、このように構成されたものに対して単一の数式の答えを得ることが可能かどうか疑問に思いました。

上記の例では、文字列の時間から数値の時間を計算しようとしています。

in hours = in seconds / 3600 = O2 / 3600
in seconds = HOURS * 3600 + MINUTES * 60 + SECONDS
HOURS = extract digits if they exist between 'h' and beginning of string
MINUTES = extract digits if they exist between 'h' and 'm'
SECONDS = extract digits if they exist between 'm' and end of string

数式を手動で代入すると次のようになります

in hours = (HOURS * 3600 + MINUTES * 60 + SECONDS) / 3600 
= (extract digits if they exist between 'h' and beginning of string * 3600 + extract digits if they exist between 'h' and 'm' * 60 + extract digits if they exist between 'm' and end of string) / 3600

ご覧のとおり、この例は非常に単純ですが、他の複雑な複合関数でも実行できるかどうか疑問に思いました。

Excelはすでに何らかの方法でこの計算をすべて自動で行っていますASTすでに循環依存関係などを検出していると思います。それでは、自分でそれを実行する方法があるはずです。または、Excel の基盤に接続して同じ数式を抽出しますか?

答え1

おそらく、あなたが求めていることは実現可能ですが、UDF を使用できる場合は、それの方がきれいかもしれません。

Option Explicit

Function MyHrs(MyType As String, target As String) As Single

Dim x As Long, y As Long, z As Long
Dim Hrs As Long, Mns As Long, Ss As Long
On Error Resume Next

x = InStr(target, "h")
y = InStr(target, "m")
z = InStr(target, "s")

Hrs = Left(target, x - 1)
Mns = Mid(target, x + 1, y - x - 1)
Ss = Mid(target, y + 1, z - y - 1)

If MyType = "h" Or MyType = 1 Then MyHrs = Hrs + Mns / 60 + Ss / 3600
If MyType = "m" Or MyType = 2 Then MyHrs = Hrs * 60 + Mns + Ss / 60
If MyType = "s" Or MyType = 3 Then MyHrs = Hrs * 3600 + Mns * 60 + Ss

End Function

ALT + F11 を使用して開発者ウィンドウを開き、モジュールを挿入してコードを貼り付けます。シートでは次のように使用します。 ここに画像の説明を入力してください

この場合、生成されるエラーを回避するために、もう少しコーディングが必要になる可能性がありますが、概念を示すには機能するはずです。

関連情報