• ベストアンサー

VBA 数式ではなく計算結果をセルに入れたい

毎度毎度お世話になります。 Office2003でのVBAに関しての質問です。 例えば、Sheet1のC3セルとSheet2のC3セルの合計をSheet3のC3セルに表示したい場合に現在下記のように記述しています。 Sheets("Sheet3").Range("C3").Select ActiveCell.FormulaR1C1 = "=SUM('Sheet1'!RC + 'Sheet2'!RC)" 結果、ちゃんとSheet1のC3セルとSheet2のC3セルの合計をSheet3のC3セルに表示できるのですがこれだとSheet1やSheet2のシート削除するとSheet3の値が崩れますよね。計算式をSheet3のセルに入れているのだから当たり前なんですが・・・ そこで、Sheet3のセルに値を入れる時に、計算式ではなく計算結果を入れたいのですがどのように書けばよいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんにちは。 R1C1方式の便利な方法は活かして、 Sub TestSample()    With Sheets("Sheet3").Range("C3")   .FormulaR1C1 = "=SUM('Sheet1'!RC,'Sheet2'!RC)"   .Value = .Value  End With End Sub もっと多くのシートがある場合は、以下のようなスタイルになります。  .FormulaR1C1 = "=SUM('Sheet1:Sheet2'!RC)"

tree1975
質問者

お礼

ご回答有難うございます。 なるほど、跡で値だけ挿入しなおすのですね。 ただこれだと、数式は残りませんか?確かめてみます。

その他の回答 (6)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

#5 です。 >ただこれだと、数式は残りませんか? .Value = .Value は、基礎的なテクニックですから、良く覚えてくださいね。 Rangeオブジェクトのプロパティには、いくつかあります。 Formula プロパティと Valueプロパティとは、入力する時点では、同義ですが、出力の段階では、別です。これは、Text プロパテイに対しても同じです。他にも、FormulaLocal とFormula の違い、ValueとValue2 との違い、Text とValue の違いなど、ひとつずつ試しながら覚えるしかありません。FormulaR1C1は、通常は使いません。それは、数式が限定されるからです。それは、同じく、FormulaA1 も同じことです。 それから、経験的に、数式を大量に、VBE上では、抱えないほうがよいです。メモリ食いになります。今回のような場合は、ある意味特別です。VBAで、シートをループするよりも、かなり早く解が出るものだと思います。

  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.6

よく事情が呑み込めないのですが・・・ VBAでシートを指定して計算して、シートを削除すれば・・・当然、VBAを動作させた際も、エラーになります そのために、VBAを作るのではなく、コピー&形式貼り付けで、値を貼り付けた方が良いような気がするのですが・・・ テンプレートの様に使用して、保管する際は別のファイル名とかにするのでしょうか? もう少し補足を出したほうが良いような気がしますが?

  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.4

Sub Macro1() Worksheets("Sheet3").Range("C3").Consolidate _ Sources:=Array("Sheet1!R3C3", "Sheet2!R3C3"), _ Function:=xlSum End Sub

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.3

Sub tes01() Sheet3.Range("C3") = Sheet1.Range("C3") + Sheet2.Range("C3") End Sub でもいいですね。

tree1975
質問者

お礼

ご回答有難うございます。 こんなやり方もあるのですね、Valueへ入れても、セル指定で入れても同じなのですね。 勉強になりました。

  • fly_moon
  • ベストアンサー率20% (213/1046)
回答No.2

#1です ActiveCell.Value = Sheets("Sheet1").Range("C3") + Sheets("Sheet2").Range("C3") の間違いです。

tree1975
質問者

お礼

ご回答有難うございます。 Valueプロパティに結果を入れ込めばよいのですね。 上手くいきました。有難うございます。

  • fly_moon
  • ベストアンサー率20% (213/1046)
回答No.1

こんにちは。 >"=SUM('Sheet1'!RC + 'Sheet2'!RC)" もともと、このSUM関数は意味がないと思います。 ActiveCell.FormulaR1C1 = "=Sheet1!RC + Sheet2!RC" でも同じ答えです。でもこれでは、数式が入力されてしまうので ActiveCell.Value = Sheets("Sheet1").Range("C1") + Sheets("Sheet2").Range("C1") に変更すればいいと思います。

関連するQ&A

  • VBAで計算結果のみ表示させたい

    VBA作成中です。 SUMIF関数なのですが、 ActiveCell.FormulaR1C1 = "=SUMIF(R2C1:R14C1,RC[-1],R2C4:R14C4)"  このままだと計算式が入るので、これを計算結果のみ表示させたいのですが、値のみ貼り付け以外で方法はありますか?

  • ワークシート関数にVBAでセルを指定するには?

    FormulaR1C1ではなく Range形式でVBAでワークシート関数をセルにいれるコードを書くにはどうすればいいでしょう? Sub Macro() ActiveCell.FormulaR1C1 = "=LEN(RC[-1])" End Sub これを Sub Macro() ActiveCell.FormulaR1C1 = "=LEN(a1)" End Sub こうすると、 数式バーには、=LEN('a1')と入っており、 セルの値は#NAME? になります。 アポストロフィーが余計なのですがどうすれば取れますか?

  • エクセルVBAでの関数

    下記、コードでセルに関数を入れるようにしてるのですが 関数で得られた値をセルに反映されるようにしたいのですが Dimを使用してもどう指定してよいのかわからず苦戦しております。 宜しくお願い致します。 Range("F1").Select Do Until ActiveCell.Offset(0, -1).Value = ""       With ActiveCell .FormulaR1C1 = "=MID(RC[-1],2,3)" .Offset(1, 0).Select End With Loop Range("A1").Select Do Until ActiveCell.Offset(0, 2).Value = "" With ActiveCell .FormulaR1C1 = "=RC[11]&RC[5]&Rc[8]&rc[9]&rc[3]" .Offset(1, 0).Select End With Loop

  • エクセルマクロ セルの貼り付けについて

    マクロ初心者でわからないことばかりで困っております。 For i = 1 To 721 Step 80 Sheets("Sheet2").Activate Range("G3").Select ActiveCell.FormulaR1C1 = i Range("A1:D80").Select   Selection.Copy Sheets("Sheet3").Activate このあとにコピーしたもの「Range("A1:D80").Select」をセルに貼り付ける時に一回ごとに80行ずつずらして貼り付けたいのですが、そのような場合は どのようにRange指定して貼り付ければよろしいのですか? sheet2で演算した結果をsheet3のセルA1からA721まで貼り付けたいのです。一回の演算で80行まで計算されます。 わかりずらくて申し訳ありません。

  • マクロで時間の合計・平均計算

    いつもお世話になっています。 Excel2000でセルに表示された時間の平均を計算するマクロを作っています。 セルB4・B5・B6にはそれぞれ"00:00:01"・"00:32:54"・"02:33:12"が表示されています。 セルの書式設定はユーザ定義型で"hh:mm:ss"です。 B4からB6の合計時間を求めて、B7(書式設定は標準)に表示させるまでは    Worksheets("Sheet1").Select       Range("B7").Select       ActiveCell.FormulaR1C1 = "=sum(R[-3]C:R[-1]C)" で"03:06:07"と表示できたのですが、"=average(R[-3]C:R[-1]C)"とすると "09:02:02"と合計でも平均でもない値が表示されてしまいました。 "=sum(R[-3]C:R[-1]C)/3"とすると"0.3764"と小数で表示されてしまいます。 それならばと、上記述の下に"MyTime=ActiveCell.Value"や"MyTime=Range("B7").Value"と記述してみたのですが、小数で値が入ってきてしまいます。 "03:06:07"さえ取れれば、あとは文字列を数値に変換して無理やり計算しようと 思っているのですが、それすらできず、困っています。 割り切れない秒数は切り上げにするとして、 B4からB6の時間の平均"01:02:03"を出すにはどうしたらよいのでしょう? どなたかご存知の方、教えてください!!

  • エクセルVBAについての質問です。

    エクセルVBAについての質問です。  動作環境は  OS:WINDOWS XP  エクセル2003  です。 今、Book1.xlsというエクセルファイルがあります。 このファイルの中に、【sheet1】,【sheet2】,【sheet3】の3つのシートが存在しています。 【sheet1】および【sheet2】には、A列=ユニーク番号、B列=データ1、C列=データ2・・・・n列=データnの値が約1500行(各行で、データの値は異なります。)入っています。 この【sheet1】と【sheet2】のデータの内容を照合して【sheet3】にその結果を反映(TRUEまたはFALSE)します。 仮に【sheet3】のあるセル(仮にD3)の値がTRUEとなったら、【sheet1】のセル(D3)の値を【sheet3】のセル(D3)に代入する。 逆に【sheet3】のあるセルの値がFALSEとなったら、そのセルはFLASEのままにする。プログラムは以下の様にしたのですが、全てを処理するまでに相当時間がかかっています。 VBAのプログラムは今回初めて書いたので、プログラムが悪いのか、プログラムの思想が悪いのかがわかりません。 どなたかご教授していただけませんか?多分、コードの書き方もキレイではないと思います(悲) Private Sub データ照合ボタン_DblClick(ByVal Cancel As MSForms.ReturnBoolean) Dim i As Long Dim area As Range Dim A As Variant Dim WrkRange As String '----シート(1)とシート(2)の各セルの値を比較---- With Sheets("sheet1") WrkRow = .Cells(Rows.Count, 3).End(xlUp).Row End With Sheets("sheet3").Select For i = 12 To WrkRow WrkRange = Range("C" & i).Select ActiveCell.FormulaR1C1 = "=EXACT('sheet1'!RC,'sheet2'!RC)" WrkRange = Range("D" & i).Select ActiveCell.FormulaR1C1 = "=EXACT('sheet1'!RC,'sheet2'!RC)" '・           '・           '・ Next i A = i - 1 Sheets("sheet1").Select For i = 12 To A WrkRange = Range("C" & i).Select Selection.Copy Range("C" & i).PasteSpecial xlPasteValues Sheets("sheet3").Select If Range("C" & i) = True Then Sheets("sheet1").Select Range("C" & i).Copy Sheets("sheet3").Select Range("C" & i).Select ActiveSheet.Paste Else: End If Next i A = i - 1 Sheets("sheet1").Select For i = 12 To A WrkRange = Range("D" & i).Select Selection.Copy Range("D" & i).PasteSpecial xlPasteValues Sheets("sheet3").Select If Range("D" & i) = True Then Sheets("sheet1").Select Range("D" & i).Copy Sheets("sheet3").Select Range("D" & i).Select ActiveSheet.Paste Else: End If Next i          '・          '・          '・    End Sub

  • Excel VBAで表組みしたらデバック発生

    Excel VBAの初心者です。Windows Vistaで Excel2007を使っています。 表をマクロの実行で作成したいと思っています。 何もないエクセルブックより 「開発」→「マクロの記録」→「相対参照」 →「表の作成」→「記録終了」→「相対参照で記録の解除」 →「エクセルマクロ有効ブックで保存」 ところがこのマクロ記録が入ったブックを再度立ち上げ、 表をオールクリアにし、マクロボタンより表作成を実行 させようとすると、次のエラーメッセージがでました。 『実行時エラー'9' インデックスが有効範囲にありません。』 デバックからModule1をみると以下の記述となっていました。 Sub 表組み() ' ' 表組み Macro ' ' ActiveCell.Range("A1:E5").Select Selection.Copy Windows("Book1").Activate ActiveSheet.Paste ActiveCell.Columns("A:A").EntireColumn.Select ActiveCell.Rows("1:1").EntireRow.RowHeight = 11.25 ActiveCell.Rows("1:5").EntireRow.Select Selection.RowHeight = 21.75 ActiveCell.Columns("A:A").EntireColumn.ColumnWidth = 14.88 ActiveCell.Offset(0, 4).Range("A1").Select Application.CutCopyMode = False With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter .WrapText = False .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = False End With ActiveCell.Offset(1, -3).Range("A1:D4").Select Selection.NumberFormatLocal = "#,##0_ " ActiveCell.Select ActiveCell.FormulaR1C1 = "78000" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "102000" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "9800" ActiveCell.Offset(-2, 1).Range("A1").Select ActiveCell.FormulaR1C1 = "65000" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "204000" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "500" ActiveCell.Offset(-2, 1).Range("A1").Select ActiveCell.FormulaR1C1 = "86000" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "151000" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "10200" ActiveCell.Offset(-2, 1).Range("A1").Select ActiveCell.FormulaR1C1 = "=SUM(RC[-3]:RC[-1])" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "=SUM(RC[-3]:RC[-1])" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "=SUM(R[-2]C:R[-1]C)" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "=SUM(R[-3]C:R[-1]C)" ActiveCell.Offset(0, -3).Range("A1").Select ActiveCell.FormulaR1C1 = "=SUM(R[-3]C:R[-1]C)" ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell.FormulaR1C1 = "=SUM(R[-3]C:R[-1]C)" ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell.FormulaR1C1 = "=SUM(R[-3]C:R[-1]C)" ActiveCell.Offset(-4, -2).Range("A1:D1").Select Selection.AutoFilter End Sub 上から9行目(?)のWindows("Book1").Activateに 黄色い矢印が示され、また行全体が黄色く四角に 覆われていました。 おそらくこの記述に問題があると思いますが、 どんな記述に変えたらいいのか分かりません。 Excel VBAにお詳しい方ご教示願います。 なお、マクロで作成したい図を添付いたします。 参考にしていただければ幸いです。

  • Excel VBA 複数のSheet の合計

    Excel VBA  超超 初心者です。見よう見まねで、複数のSheet の L11:Q1000 ,T1:AW100 セル範囲にある文字 "~" を計算できたのですが、 更に各Sheet で計算された合計をしたいのですが、さっぱり判りません。Sheet 名は、バラバラです。合計は、最初か最後のsheet のどこかのセルに表示させたいです。どなたかヒントをてください。よろしくお願いします。 Sub すべてのシートでマクロ実行() Application.ScreenUpdating = False Dim シート As Worksheet For Each シート In Worksheets シート.Select Range("H3").Select ActiveCell.FormulaR1C1 = "=COUNTIF(R[8]C[4]:R[997]C[9],""*~*"")" Range("I3").Select ActiveCell.FormulaR1C1 = "=COUNTIF(R[-2]C[11]:R[997]C[40],""*~*"")" Range("I4").Select Next Application.ScreenUpdating = True End Sub

  • VBA)範囲指定した全セルに関数を入れたいのですが。。。

    当方、始めてのマクロ作成に奮闘中の身です。 ご教授いただきたく、質問させていただきます。 ◎質問 範囲指定した全セルに関数を入力したいのですが、アクティブセルのみにしか関数が入らず困っています。    Dim abc As Integer       abc = Sheets("シート名").Range("A1").CurrentRegion.Rows.Count    Range(Cells(2, 12), Cells(abc, 12)).Select    ActiveCell.FormulaR1C1 = "=COUNTIF(R1C1:RC[-11],RC[-11])" 一番下の部分の関数を入力したいのですが、アクティブセルのみの入力になってしまい、下から2番目の指定範囲には反映されません。 下から2番目の指定範囲セル全てに適用するにはどうしたら良いでしょうか。 よろしくお願いいたします。

  • Excel VBAで…。

    データーシート(1)のデータをレイアウトシート(2)に転記するのに 例えば sheets(1).range("A1").value=sheets(2).range("C5").value sheets(1).range("B1").value=sheets(2).range("C6").value sheets(1).range("C1").value=sheets(2).range("C7").value と言うように配置しているのですが もし、シート(1)セルB1の値が空白ならば シート(1)セルC1の値はシート(2)のセルC6に配置・・・ と言うように データがない場合は、転記後の配置は詰めて配置したいのです。 どうすればよろしいでしょうか?

専門家に質問してみよう