- ベストアンサー
エクセルの数式
すいません。またお力を貸して下さい。 マクロでプログラムを組みたいのですが、 例として シート1のA1セルに「50」、B1セルに 「-5」、C1セルに「0」が入力されていたとします。それをシート2のA1セルに数式として「=50-5+0」と表示させるようにしたいのです。(A1セル自体に単に「45」と表示されるだけでなく。) 「=A1+B1+C1」のような形式では困るのです。 どなたか解決法をお教え下さい。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 一案ですが。 ----------------------------------------------- Sub test() Dim Siki With Sheets("Sheet1") Siki = "=" Call MakeFormula(Siki, .Range("A1").Value) Call MakeFormula(Siki, .Range("B1").Value) Call MakeFormula(Siki, .Range("C1").Value) End With Sheets("Sheet2").Range("A1").Formula = Siki End Sub --------------------------------------- Sub MakeFormula(Siki, Atai) If Siki <> "=" And Atai >= 0 Then Siki = Siki & "+" End If Siki = Siki & Atai End Sub ------------------------------------------ 以上です。
その他の回答 (4)
- Wendy02
- ベストアンサー率57% (3570/6232)
oyasaisanba 様 今回のわたしのマクロは、ちょうど初級コースを終了したレベルです。 ユーザー定義関数 配列(動的配列) 参考本: 『かんたんプログラミング Exce; VBA 応用編』(技術評論社) この前半ぐらいで、ほとんど出てきます。 良い書籍に出会えることを期待しております。
お礼
わざわざ本の推薦までしていただき感謝しております。 早速ご推薦いただいた本を書店で見つけ、購入することができました。読みながら少しずつ勉強していきたいと思います。
- Wendy02
- ベストアンサー率57% (3570/6232)
わたしも考えてみました。 '------------------------------------- '<標準モジュール> '式に表示する関数 Function ShowFormula(セル範囲 As Range, _ Optional r2 As Range, _ Optional r3 As Range) As String '引数はセル1つでも範囲でも可 Dim r1 As Range Dim i As Long Dim buf As String Dim c As Variant Dim myData As Variant Set r1 = セル範囲 If Not r2 Is Nothing Then Set r1 = Union(r1, r2) If Not r3 Is Nothing Then Set r1 = Union(r1, r3) 'Optional r4 と引数を増やすには、同じようにすると良い ReDim myData(r1.Count - 1) For Each c In r1 If VarType(c) = vbDouble Then myData(i) = c.Value Else myData(i) = 0 End If i = i + 1 Next For i = LBound(myData) To UBound(myData) If i = LBound(myData) Then buf = myData(i) Else buf = buf & Mid$("-++", Sgn(myData(i)) + 2, 1) & Abs(myData(i)) End If Next ShowFormula = "=" & buf 'ShowFormula = Application.Sum(Rng) & "=" & buf '答え= 式 End Function '>「45」と表示されるようにしたいのです。 '------------------------------------- '文字列の式を計算するユーザー定義関数 Function myEvaluate(文字列 As Variant) As Double Dim myStr As Variant myStr = 文字列 If VarType(myStr) = vbString And myStr Like "[==]*" Then myEvaluate = Application.Evaluate(StrConv(myStr, vbNarrow)) End If End Function '------------------------------------- 使用例: 式の表示; =ShowFormula(Sheet1!A1:C1) =ShowFormula(Sheet1!A1,Sheet1!B1,Sheet1!C1) 表示; =50-5+0 マクロから与える場合は; ActiveCell.Value = SHOWFORMULA(Sheet1.Range("A1:C1")) 式を計算させる; =myEvaluate(A1) 表示; 45 (なお、式には大文字・小文字の違いありません。見易さだけのためです)
お礼
回答ありがとうございます。 しかし、マクロに挑戦しようと思い入門書を買って勉強しだしてから数日の私には現状ではこのプログラムの仕組みを理解するには難しかったようです。(汗) そもそも最初のFunctionさえ見たことありませんでしたし・・・。ですが、これから勉強していく上できっと大いに参考になるものを見せていただいたと思います。とりあえず手元にある入門書にはほとんど記載されていないのでもう少し上級の参考書を書店で求めようと思います。(笑)
- rio_d
- ベストアンサー率47% (71/149)
こんばんは。 マクロでいいんですよね? 先頭を『'=』と、シングルクォーテーションを付けないと数式扱いされるみたいですね。 Sub ほにゃらら() Dim sTmp As String sTmp = "'=" & Trim(Str(Cells(1, 1))) If Cells(1, 2) < 0 Then sTmp = sTmp & Trim(Str(Cells(1, 2))) Else sTmp = sTmp & "+" & Trim(Str(Cells(1, 2))) End If If Cells(1, 3) < 0 Then sTmp = sTmp & Trim(Str(Cells(1, 3))) Else sTmp = sTmp & "+" & Trim(Str(Cells(1, 3))) End If Sheets("シート2").Cells(1, 1) = sTmp End Sub シート表現等は、あまり考慮しませんでしたが、 こんな感じでよいかと思います。
補足
早速の回答ありがとうございます。 おかげさまで基本的には私の悩みのほとんどは 解決したのですが、欲を言えばセル上には (数値の設定は上記の例のままだとすると)「45」と表示されるようにしたいのです。それで上の欄(?)には「50-5+0」というように中身が分かるようにしたいのです。よろしければお答えいただきたい のですが・・・。
- dober-o
- ベストアンサー率59% (260/439)
マクロを使うまでもなく = "=" & A1 & IF ( B1 >= 0, "+", "") & B1 & IF( C1 >= 0, "+", "") & C1 とシート2のA1セルに入力すればOKです 符号を気にしない場合は if(...)はなくてかまいません
補足
早速の回答ありがとうございました。 マクロのプログラムの中の一部として使いたいので VBA形式(?)で答えていただきたかったのです。
お礼
回答ありがとうございます。 おかげさまでこのとおりにすることで私が表示したいと思ったとおりのものが表示されました。