
コメントに基づいて、私が何を求めているのかを明確にします。
複数のセルにまたがるネストされた数式を 1 つの数式に平坦化したいと考えています。
次の例は、手動で実行する方法を示したものです。ただし、数式の種類は任意であり、以下の例とはまったく関係ありません。
コード/ツール/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 を使用して開発者ウィンドウを開き、モジュールを挿入してコードを貼り付けます。シートでは次のように使用します。
この場合、生成されるエラーを回避するために、もう少しコーディングが必要になる可能性がありますが、概念を示すには機能するはずです。