- ベストアンサー
エクセルに途中式を簡単に表示させる方法
エクセルに途中式を表示させたいです。 例えばセルA1=「1」、A2=「2」、A3=「3」、B1=「合計」と入力しておき C1セルに「=1+2+3=」、D1セルに合計の値を表示させるとします D1セルに「=A1+A2+A3」 C1セルに「="="&A1&"+"&A2&"+"&A3&"="」 と”&&”を手入力することで無理やり表示はできましたが計算式が複雑になると手間がかかりすぎます。 ・簡単に途中式をセルに入力する方法はないでしょうか(先端と終端の「=」は合ってもなくても構いません)
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
済みません、ミスです。 RegExp.Pattern = "(\w+!)?[A-Z]{1,3}\d+" に変更して下さい。 制限付きですが、別シートも対応します。 (シート名は英数字に限る)
その他の回答 (5)
- kkkkkm
- ベストアンサー率66% (1719/2589)
No5は式中にセルのシート指定が2か所以上あったらダメダメでしたので無視してください。
- kkkkkm
- ベストアンサー率66% (1719/2589)
長くなりましたが、シート名は全角でもOKだと思います。また、他のシートを開いた状態で実行しても指定したシート(この場合はシート1)を対象にします。 +-*/^%の演算子に対応しています。 以下ではシート1のE1,E3,E5を対象としていますので適宜変更してください。対象セルのすぐ下のセルに式を書き出します。 標準モジュールでテストしています。 Sub Test() Dim c As Range, Ws1 As Worksheet Dim myStr As String, tmp As String Dim Match As Object, Matches As Object Dim RAddress As String, RAddress1 As String Dim flg As Boolean: flg = False Set Ws1 = Worksheets("シート1") 'Set Ws1 = ActiveSheet '選択したセルやアクティブなシートを対象にする場合はこちらで With CreateObject("VBScript.RegExp") .Pattern = "([^\^\+\*-=\(\)%]\S+!)*?[$A-Z]{1,4}[0-9]*" .Global = True For Each c In Ws1.Range("E1,E3,E5") 'For Each c In Selection '選択したセルにしたい場合こちらで myStr = c.Formula If Len(myStr) > 0 Then Set Matches = .Execute(myStr) For Each Match In Matches If Len(Match.Value) = 1 Then tmp = Match.Value flg = True Else If flg = True Then RAddress = tmp & Match.Value flg = False Else RAddress = Match.Value If InStr(RAddress, "!") < 1 Then RAddress1 = "'" & Ws1.Name & "'!" & RAddress Else RAddress1 = RAddress End If flg = False End If myStr = Replace(myStr, RAddress, Range(RAddress1).Value) End If Next Match Ws1.Cells(c.Row + 1, c.Column).Value = "'" & myStr & "=" End If Next c End With End Sub
- SI299792
- ベストアンサー率47% (772/1616)
>計算式が複雑になると という事は、足し算だけでなく、いろいろな計算に対応しなければならないのですね。 VBA でないと無理です。 ユーザー定義関数です。 C1: =FormulaVal(D1) と入力して下さい。 Option Explicit ' Function FormulaVal(Cell As Range) As String Dim Formula As String Dim RegExp As Object Dim Execute As Object ' Formula = Replace(Cell.Formula, "$", "") Set RegExp = CreateObject("VBScript.RegExp") RegExp.Pattern = "[A-Z]{1,3}\d*" Set Execute = RegExp.Execute(Formula) ' Do While Execute.Count = 1 Set Execute = Execute(0) FormulaVal = FormulaVal & _ Left(Formula, Execute.FirstIndex) & Range(Execute & "") Formula = Mid(Formula, Execute.FirstIndex + Execute.Length + 1) Set Execute = RegExp.Execute(Formula) Loop FormulaVal = FormulaVal & Formula End Function
お礼
VBAを考えてくださりありがとうございます。 VBAはあまり触ったことが無いので今の自分では内容を理解できないです。 時間が取れる時にこのプログラムを利用して計算書を作ってみます
- imogasi
- ベストアンサー率27% (4737/17069)
すでに、出ている回答の通りだが、数式バー部の式をコピーして、張り付けるときに’(アポストロフィ)を先頭に入れて、その後に数式を張り付けるのがよいだろう。 小生も、数式を「見える化」したい場合に重宝している。 ーーー それをセル番地でなく、「セルの値」におきかえて、表示したいのだろうが、こんな質問をした人は 今まで、なかったと思う。 ソートのセルを見れば,または書き出せば、判るじゃないか。 どういうニーズでこんな質問をするのかな。 ーー 単純な、+だけの演算で、1列のデータで、セル数が少ないときは、下記のようなVBAでできそうだが、これを見た人に笑われそうなコードだ。 色んな関数の色んな式においても正しく実現するのは、相当なプログラムのベテランでもむつかしそうだ(普通に素人がやるとグダグダになる)。 こんなことはあきらめたらどうか。 ーー Sub test01() Dim s As Variant f = Range("c1").Formula s = Split(f, "+") i = 0 st = "" For Each k In s st = st & s(i) & "+" MsgBox st i = i + 1 Next Range("d1") = "'" & Left(st, Len(st) - 1) End Sub Sub test02() Dim s As Variant f = Range("c1").Formula s = Split(f, "+") i = 0 st = "=" For Each k In s st = st & Range(s(i)) & "+" MsgBox st i = i + 1 Next Range("d2") = "'" & Left(st, Len(st) - 1) End Sub 1例の結果 D1は =A1+A2+A3+A4+A5+A6+A7 D2は =1+2+3+21+5+26+7
お礼
機械設計の強度計算書をエクセルで書いており、結果を印刷して上司に見せることがあるので途中式がセルの値で簡単に表記できる方法があればいいなと思い質問しました。 計算は複雑なものが多いので諦めます。 回答ありがとうございました。
- q4330
- ベストアンサー率27% (768/2786)
お礼
VBAを考えてくださりありがとうございます。 VBAはあまり触ったことが無いので今の自分では内容を理解できないです。 VBAの必要性を近頃感じますので時間がある時に勉強して使いこなせるようになろうと思います。