• ベストアンサー

VBAで関数式の値をセルに入力できるようにしたい。

こんなマクロをマクロの記録で作ったのですが SUMIF関数の数式をセルに入力するのでなく 値だけを入力するしたいのですがどのように すればいいでしょうか? Sub Macro4() Columns("O:O").Select Selection.Insert Shift:=xlToRight Range("N3").Select Selection.AutoFill Destination:=Range("N3:O3"), Type:=xlFillDefault Range("N3:O3").Select Range("O5").Select ActiveCell.FormulaR1C1 = "=SUMIF(出荷貼付け!C1,RC1,出荷貼付け!C5)" ←ここのところを値だけをセルに入力したい。 Selection.AutoFill Destination:=Range("O5:O978") Range("O5:O978").Select Range("O4").Select End Sub

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

  • ベストアンサー
  • matsu_jun
  • ベストアンサー率55% (146/265)
回答No.8

matsu_junです。会社に行く前に読んでいます。 katope007さん、quit123さん、ご指摘ありがとうございます。おっしゃるとおりです。恥ずかしい。昨夜は少し寝ぼけていたようですね。以後注意します。 お二人のご指摘の通り、いままでのやり方では、セルO5からO978まで同じ値が入ってしまいます。どんどん複雑になっていきますが、今後のために「For~Next」文を覚えるという意味合いを込めて、ご活用ください。 #5の回答を、以下のように書き換えてみてもらえませんか? For i# = 5 To 978 Cells(i, 15).Value = Application.WorksheetFunction _ .SumIf(Worksheets("出荷貼付け").Range("A1:A5"), Worksheets("別シート").Cells(i, 1).Value, Worksheets("出荷貼付け").Range("E1:E5")) Next i 上の式は、iの値を5から978まで1ずつ変化させながら、For文の下の行からNextの上の行までの処理を複数回実施する。という意味です。なお今回、Range("A1") というのを Cells(i, 1)と書き換えています。これは、前者ではセルの位置を文字として認識させているのに対し、後者では数式として認識させているという違いがあります。マクロの中でセルの参照を色々変化させたい時に用いると便利です。注意点は、「A1」が、列-行という書き順になっているのに対し、「Cells(i, 1)」は行-列の順に並べているという点と、Aは1、Bは2、Cは3といったように、アルファベットを数字で表記するという点です。 だらだらと、大変失礼いたしました。こうなると実際の記述としては、#1のpapayukaさんや#7のKenKen_SPの方法を利用された方が良いかもしれませんね。実際KenKen_SPの回答は私もいつも拝見しているのですが、舌を巻くことがしょっちゅうです。私のような"なんちゃって"と違って、きちんとされている方だと思います。私もよく参考にしています。

cocoku
質問者

お礼

いろいろな方法を考えて頂いて感謝しています。 ありがとうございます。 こんな初心者にもわかるように。 おかげ様でよくわかりました。 これからも度々質問させて頂くことと思いますが よろしくお願い致します。

cocoku
質問者

補足

返答が遅くなってすみません。 初心者の私にとても、とても、親切に教えて頂きありがとうございます。 私はsumif関数をエラーはでるのでが、範囲設定をすると何かと設定し直さなければならないので次様にしていました。これが原因の様でした。 =SUMIF(出荷貼付け!$A:$A,$A5,出荷貼付け!$E:$E) ウィザードでは#NUM!のエラーはでるのでが、 ちゃんとできるのです。 列を選択にしておくと何行入っても大丈夫だったので・・・。 そのために変な関数がマクロの記録に出たようです。

その他の回答 (7)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.7

#1 papayuka さんの回答のように、一度計算させたあと、値に変換する方が簡単では? オリジナルに一行手を入れるだけです。 Range("O5:O978").Select Range("O4").Select End Sub この部分を Range("O5:O978").Select Selection.Value = Selection.Value Range("O4").Select End Sub のように、 Selection.Value = Selection.Value の一行を追加します。 奇妙に見えるかもしれませんが、セルがSelectされているなら、これで計算式の結果を値に変換できます。

cocoku
質問者

お礼

ありがとうございます。 大変勉強になりました。 これからもよろしくお願い致します。 使わせて頂きます。

  • quit123
  • ベストアンサー率21% (4/19)
回答No.6

matsu_junさん、こんばんは。 いつも素晴らしい回答拝見しています。 ちょっと気になったので一言。 > Range("O5:O978").Value = Application.WorksheetFunction _ > .SumIf(Worksheets("出荷貼付け").Range("A1:A5"), Worksheets("別のシート").Range("A1").Value, Worksheets("出荷貼付け").Range("E1:E5")) これって、Range("05:0978")に全部同じ値が入りませんか? 勘違いでしたらご容赦願います。

cocoku
質問者

お礼

ありがとうございました。 とても勉強になりました。 これからもよろしくお願い致します。

  • matsu_jun
  • ベストアンサー率55% (146/265)
回答No.5

#2、#4のmatsu_junです。失礼しました。#4で結構とんちんかんな事を言っています。半分寝ていますね。私 > どちらにしても、SUMIF関数の利用方法については問題ないと思いますよ。記述としては以下のようになります。ついでに下の行とまとめてみました。 > Range("O5:O978").Value = Application.WorksheetFunction _ > .SumIf(Worksheets("出荷貼付け").Range("A1:A5"), Worksheets("別のシート").Range("A1").Value, Worksheets("出荷貼付け").Range("E1:E5")) この部分だけ信用してください。失礼しました。

  • matsu_jun
  • ベストアンサー率55% (146/265)
回答No.4

#2のmatsu_junです。 私も少々思い違いをしていたようで、cocoku様の補足を見た後にもう一度質問のマクロを眺めていたら、補足で言うところの「別のシート!$A1」の値が、このシートのセルO5に入っていたのかと想像するのですが。 どちらにしても、SUMIF関数の利用方法については問題ないと思いますよ。記述としては以下のようになります。ついでに下の行とまとめてみました。 Range("O5:O978").Value = Application.WorksheetFunction _ .SumIf(Worksheets("出荷貼付け").Range("A1:A5"), Worksheets("別のシート").Range("A1").Value, Worksheets("出荷貼付け").Range("E1:E5")) 最初の質問の「セルO5」を生かすのであれば、 Range("O5:O978").Value = Application.WorksheetFunction _ .SumIf(Worksheets("出荷貼付け").Range("A1:A5"), ActiveSheet.Range("A1").Value, Worksheets("出荷貼付け").Range("E1:E5")) となると思います。

  • katope007
  • ベストアンサー率10% (1/10)
回答No.3

間違っていたらすいません。自分で状況をマクロにあわせたら、集計はできました。 matsu_junさんのを見てみたんですが、 ActiveCell.FormulaR1C1 = Application.WorksheetFunction.SumIf(Worksheets("出荷貼付け").Range("C1:C5"), "=0", Worksheets("出荷貼付け").Range("D1:D5")) これは出荷貼付けのセルC1からC5がゼロに対するD1からD5の中の該当セルの値を集計するになります。 cocokuさんの ActiveCell.FormulaR1C1 = "=SUMIF(出荷貼付け!C1,RC1,出荷貼付け!C5)"と多少違いますので、データの設定のせいでは?と思います。RC1がエラーのような。 無理やり解釈すると、C1セルがRC1セルと同じなら、C5セルを集計せよです。 Range("O5").AutoFill Destination:=Range("O5:O978") あとは、これでうめちゃうと同じ値になりませんか? 結果は値になるので、関数コピーのようにはなりませんから。 どうでしょう? マクロなら、SUMIFにもよりますが、AutoFIllじゃなくて、O978までmatsu_junさんの肝を順にセットしていかないとできないと思います。

cocoku
質問者

お礼

ありがとうございます。 上記に記入して頂いた方たちも含めて感謝しています。 本で得られない勉強になりました。 一つ一つ自分もものにできる様に努力します。 これからもよろしくお願い致します。

  • matsu_jun
  • ベストアンサー率55% (146/265)
回答No.2

SUMIF文が正しくないような気がするのですが、これでよいのでしょうか? もしSUMIF文の実際の値が =SUMIF(出荷貼付け!C1:C5,"=0",出荷貼付け!D1:D5) だとしたら、以下のようになります。 ActiveCell.FormulaR1C1 = Application.WorksheetFunction.SumIf(Worksheets("出荷貼付け").Range("C1:C5"), "=0", Worksheets("出荷貼付け").Range("D1:D5")) キモは、VBA内でExcelの関数を利用するためのおまじない   Application.WorksheetFunction. を利用することと、他のシートを参照する時に「(参照シート名)!」と書くところを   Worksheets("シート名").Range("セル範囲") と書き換えることです。 なお、cocoku様のマクロを多少シェイプアップしました。コードをすっきりさせると共に、動作も高速化します。 Sub Macro4() Application.ScreenUpdating = False '画面の書き換えを抑制します。 Columns("O:O").Insert Shift:=xlToRight Range("N3").AutoFill Destination:=Range("N3:O3"), Type:=xlFillDefault Range("O5").Value = Application.WorksheetFunction _ .SumIf(Worksheets("出荷貼付け").Range("C1:C5"), "=0", Worksheets("出荷貼付け").Range("D1:D5")) Range("O5").AutoFill Destination:=Range("O5:O978") Application.ScreenUpdating = True '画面の書き換えを許可します。 End Sub よろしければご利用ください。

cocoku
質問者

補足

ありがとう御座います。 キモの意味がよくわかりました。 しかしながら、うまく行きません。 matsu_junさんのすっきりとしたコードを ハイシャクしましたが、数式は消えたのですが 値がすべて"0"になってしまいます。 "出荷貼付け"のsheetには B列は 品番 C列は カラー D列は サイズ E列は 数量 が記入され A列には、=CONCATENATE($B2,$C2,$D2)の品番・カラー・サイズが入力されています。 別のシートの A列に 品番・カラー・サイズ O列に行を挿入してsumif関数で数量の集計をしていたのですが。 =sumif(出荷貼付け!A:A,別のシート!$A1,出荷貼付け!E:E) という物を作ったつもりなのです。 マクロの記録でなんとか、ダラダラマクロをでやって きましたが、数式ばかりが入ってしまい 10シートぐらいになり重く見くいものとなってしまいました。 それでなんとかならいないものかとご相談に。 sumif関数が変なんでしょうか?

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.1

計算させてから、コピーして値で貼り付けするとか。 Sub Test()  Columns("O:O").Insert shift:=xlToRight  Range("N3").Copy Destination:=Range("O3")  Range("O5:O978").Value = "=SUMIF(出荷貼付け!C1,RC1,出荷貼付け!C5)"  Range("O5:O978").Copy  Range("O5:O978").PasteSpecial xlPasteValues  Range("O4").Select  Application.CutCopyMode = False End Sub

関連するQ&A

  • ExcelのVBAのAutoFillの使い方について

    Excel97のマクロでAutoFillを使おうとしているのですが、エラーが出て実行できません。 何も表示されていないシートでコマンドボタンを押すと、AutoFillを使ってA1セル~E1セルとA2セル~E2セルに数字の1~5が表示されるようにしたいと考えています。 下記のようにマクロを書いたところ、A1~E5はうまくできたのですが、 「Selection.AutoFill Destination:=ActiveCell.Range("A2:E2"), Type:=xlFillSeries」 の行でエラーが発生します。 「実行時エラー:1004 RangeクラスのAutoFillメソッドが失敗しました。」と表示されます。 Private Sub CommandButton1_Click()   ActiveSheet.Range("A1").Select   ActiveCell.FormulaR1C1 = "1"   Selection.AutoFill Destination:=ActiveCell.Range("A1:E1"), Type:=xlFillSeries   ActiveSheet.Range("A2").Select   ActiveCell.FormulaR1C1 = "1"   Selection.AutoFill Destination:=ActiveCell.Range("A2:E2"), Type:=xlFillSeries End Sub どなたかエラーの原因を教えていただけないでしょうか? よろしくお願いいたします。

  • エクセルのマクロ

    こんばんは、宜しくお願いします。 エクセルで行を挿入し前行の数式をコピーするマクロの記録を行ったのが下記の内容です。 Sub Sounyu() ' ' Sounyu Macro ' Rows("4:4").Select Selection.Insert Shift:=xlDown Range("B3:C3").Select Selection.AutoFill Destination:=Range("F3:F4"), Type:=xlFillDefault Range("F3:F4").Select Range("G3").Select Selection.AutoFill Destination:=Range("G3:G4"), Type:=xlFillDefault Range("G3:G4").Select Range("A2").Select End Sub 最後の Range("A2").Selectを挿入した行のAのセルへ カーソルがいくようにするにはどのように変更したら 良いのでしょうか? 教えてください。

  • EXCELマクロで左列に値のある行まで選択

    EXCELのマクロの記録を利用して簡単なマクロを作りたいのですが、 やりたいことは、表の最上部のセルにVLOOKUP関数を設定し、 フィルハンドルでWクリックするように表の最下部までコピーしたいのですが、 マクロの記録では、貼り付けする先のセルが固定されてしまい、 表の行数が変動する場合はそのまま使えません。 左列に値のあるセルを判断してその行番号までを選択できれば解決するのですが、 お詳しいかたお教えください。 ちなみにマクロの記録の構文では <フィルハンドルでクリックする場合> ActiveCell.FormulaR1C1 = "=VLOOKUP(RC7,'10FY'!R2C1:R1321C2,2,0)" Selection.AutoFill Destination:=Range("H3:H27") Range("H3:H27").Select End Sub <範囲選択しコピー貼り付けする場合> ActiveCell.FormulaR1C1 = "=VLOOKUP(RC7,'10FY'!R2C1:R1321C2,2,0)" Selection.Copy Range("H4:H27").Select ActiveSheet.Paste End Sub

  • エクセルVBAの保存

    毎月異なった新しいエクセルファイルに同じような加工を施すため、VBAを書きました。対象はActivesheetとしています。 で、質問は、この新しいエクセルファイルの標準モジュールにいちいちこのVBAをコピーペーストせずに実行する方法です。 きっと何かあるとは思うのですが・・・・。 VBAは次のような簡単なものです。 Sub 加工1() Dim e As Integer, s As String, n As String e = Range("A4").End(xlDown).Row s = Replace(Mid(Range("A2"), 8, 5), "年", "") & "-" n = Replace(Mid(Range("A2"), 19, 5), "年", "") & "-" Range("A1:C2").MergeCells = False Columns("B:B").Select Selection.Insert Shift:=xlToRight Columns("A:A").Select Selection.Insert Shift:=xlToRight Columns("C:C").Select Selection.NumberFormatLocal = "G/標準" Range("B3").Select Selection.AutoFill Destination:=Range("B3:C3"), Type:=xlFillDefault Range("B3").Select ActiveCell.FormulaR1C1 = "商品番号1" Range("C4").Select ActiveCell.FormulaR1C1 = "=LEFT(RC[-1],10)" Range("C4").Select Selection.AutoFill Destination:=Range("C4:C" & e), Type:=xlFillDefault Range("A3").Select ActiveCell.FormulaR1C1 = "抽出年月日" Range("A4").Select ActiveCell.FormulaR1C1 = s & n & 1 Range("A4").Select Selection.AutoFill Destination:=Range("A4:A" & e), Type:=xlFillDefault Rows("3:3").Select Selection.Insert Shift:=xlDown Range("B1:E1").MergeCells = True Range("B2:E2").MergeCells = True ActiveSheet.Name = "提出用" End Sub

  • エクセルVBAでボタンを作ったシートとVBAを実行するシートを変えたい

    シート1にボタンを作成し、 そのボタンを押すと実行するVBAを作成しました。 そこで、VBAを実行するシートの指定はできるのでしょうか。 例えば、ボタンを押すと、 10行から20行まではシート2で実行させ、 30行から40行まではシート3で実行させたいと考えています。 可能でしょうか。 どうぞ宜しくお願いします。 *********************************************** 作成したVBA。ボタンはシート1にあります。 *********************************************** Private Sub CommandButton1_Click() *********************************************** ここからはシート2で実行させたい *********************************************** Range("E2").Select ActiveCell.FormulaR1C1 = "10" Range("E2").Select Selection.AutoFill Destination:=Range("E2:E101"), Type:=xlFillDefault Range("E2:E101").Select *********************************************** ここからはシート3で実行させたい *********************************************** Range("A2").Select ActiveCell.FormulaR1C1 = "100" Range("A2").Select Selection.AutoFill Destination:=Range("E2:E101"), Type:=xlFillDefault Range("A2:A101").Select End Sub

  • 【Excel2002VBA】Destinationを変数に

    Range("A1").Select Selection.AutoFill Destination:=Range("A1:A10"), Type:=xlFillSeries Range("A1:A10").Select の2行目のDestinationの次のセル範囲(Range("A1:A10")の部分) を変数で表現したいのですが 書き方が分かりません… ご存知の方、どうか教えてくださいm(_ _)m

  • エクセル Rank関数をマクロで

    こんにちは いつもお世話になっています。 Rank関数を作ることが多いのでマクロを作ることにしました。 例えば、C3からc23まで数字が入っています。c3-c23を選択した状態でマクロを動かしたいです。 実際は、特定列の一列の選択されたセルを対象にしたいです。 D列には別のデータが入っているのでC列とD列の間に新規に列を挿入し、新規のD3-D23にRankをいれます。つまり、選択セルの右側に新規の列を挿入したいです。 引数の数値はD3にはC3、D4にはC4…D23にはC23。参照は選択セルのC3からC23。順序は降順です。 一応、マクロ記録してみましたが Sub Macro1() ' ' Macro1 Macro ' Columns("D:D").Select Selection.Insert Shift:=xlToRight Range("D3").Select ActiveCell.FormulaR1C1 = "=RANK(RC3,R3C3:R23C3)" Selection.AutoFill Destination:=Range("D3:D23"), Type:=xlFillDefault Range("D3:D23").Select End Sub よろしくお願いします。

  • マクロについて教えてください

    マクロ初心者です。 A~D列の表が少ない時100行、多い時400行あり、同じ操作を何回か繰り返すため、できればマクロで処理したいと思っています。 マクロ記録で作成したのですが、最終行が一定ではないため行数が増えると上手く作動しません。 どこを修正したらいいでしょうか。ご教示いただければ幸いです。 Sub Macro1() ' ' Macro1 Macro ' ActiveCell.FormulaR1C1 = "=SUBSTITUTE(RC[-1],""集計"","""")" Range("G2").Select Selection.AutoFill Destination:=Range("G2:G4"), Type:=xlFillDefault Range("G2:G4").Select Range("H2").Select ActiveCell.FormulaR1C1 = "=SUMIF(R2C1:R13C1,RC[-1],R2C2:R13C2)" Range("H2").Select Selection.AutoFill Destination:=Range("H2:H4"), Type:=xlFillDefault Range("H2:H4").Select Range("H5").Select ActiveCell.FormulaR1C1 = "=SUM(R[-3]C:R[-1]C)" Range("H6").Select End Sub ちなみに作成したいマクロ 1.F列にA列の「集計」を取り出して、G列にF列の「集計」文字を取り除く。 2.H列にB列「数」を計算する 3.H列の最終行に合計を出す。

  • エクセルVBAでのオートフィル

    Range("A1").Select Selection.AutoFill Destination:=Range("A1:A11"), Type:=xlFillCopy Range("A1:A11").Select 上記のスクリプトで、 Rangeのところを 隣あった列の最下段まで と、言うような指定はどうすればいいのでしょうか? B列の最後の行と隣り合ったセルまで、 A1のセルをコピーしたい場合です。

  • 指定するセルのRange書き込み変更

    Sub 移動と削除() Range("A1").Select Selection.Cut Destination:=Range("E1") Range("A1").Select Selection.Delete Shift:=xlUp End Sub 自動マクロで作った上記の記録があります。これをA1固定ではなくA列の指定するセルにし E1もA列で指定したセルと同じ行のE列にしたいのですが書き換える方法をおしえてください。

専門家に質問してみよう