- ベストアンサー
Excel2010で簡単にコードを作る方法
- Excel2010で表の中のデータの一部を合計するコードを作成する方法を紹介します。
- マクロの記録機能を使用して、表の特定の範囲を選択し、合計するコードを作成します。
- また、より短いコードを使用して、選択せずに表のデータを合計する方法も紹介します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは セル選択やスクロールのコードは不要です。 整理すると、 Sub 問10SUM() With Range("B1007:AW1007") .FormulaR1C1 = "=SUM(R[-13]C:R[-1]C)" End With With Range("AW994:AW1007") .FormulaR1C1 = "=SUM(RC[-47]:RC[-1])" End With With Range("B1020:AW1020") .FormulaR1C1 = "=SUM(R[-9]C:R[-1]C)" End With With Range("B1020:AW1020") .FormulaR1C1 = "=SUM(R[-9]C:R[-1]C)" End With With Range("AW1011:AW1020") .FormulaR1C1 = "=SUM(RC[-47]:RC[-1])" End With End Sub です。
その他の回答 (2)
- kagakusuki
- ベストアンサー率51% (2610/5101)
考え方としては以下の様なものになります。 まず、 Range("B1007").Select の所でB1007セルが選択されます。 選択されているセル範囲の中の左上の隅のセルがActiveCellになるのですから、 Range("B1007").Select ActiveCell.FormulaR1C1 = "=SUM(R[-13]C:R[-1]C)" という2行は次の様に1行に書き換える事が出来ます。 Range("B1007").FormulaR1C1 = "=SUM(R[-13]C:R[-1]C)" その次の Range("B1007").Select Selection.AutoFill Destination:=Range("B1007:AW1007"), Type:=xlFillDefault という2行では、B1007セルを選択してから、そのセルをB1007:AW1007の範囲でドラッグしいる訳ですから、要するにB1007セルに入っている内容である "=SUM(R[-13]C:R[-1]C)" という関数をB1007:AW1007の範囲にコピーしている事になります。 同じ関数を入力する際には、「.FormulaR1C1」の前の所でRangeで指定されているセルを、 Range("B1007") の様な単一のセルで指定するのではなく、最初から Range("B1007:AW1007"), の様にセル範囲で指定しておく事で、B1007:AW1007のセル範囲内の全てのセルに対して同時に同じ関数を入力する事が出来ます。 ですから、 Range("B1007").Select ActiveCell.FormulaR1C1 = "=SUM(R[-13]C:R[-1]C)" Range("B1007").Select Selection.AutoFill Destination:=Range("B1007:AW1007"), Type:=xlFillDefault の4行は、次の様に1行でまとめる事が出来ます。 Range("B1007:AW1007").FormulaR1C1 = "=SUM(R[-13]C:R[-1]C)" さて、 "=SUM(R[-13]C:R[-1]C)" という関数は、行の参照の仕方も列の参照の仕方も相対参照となっていますが、この場合、この関数を入力するセル範囲であるB1007:AW1007は、1007行目のみという横1行だけのセル範囲なのですから、R[-13]のところは1007-13=994で、必ず994行目のセルが先頭のセルとなり、R[-13]のところは1007-1=1006で、必ず1006行目のセルが最後のセルとなりますから、この関数を「行の参照が絶対参照で、列の参照は相対参照」という参照方式の関数と置き換えても同じ結果を得る事が出来ます。 "=SUM(R[-13]C:R[-1]C)" という関数を「行の参照が絶対参照で、列の参照は相対参照」という参照方式の関数とした場合、次の様な関数となります。 "=SUM(R994C:R1006C)" こちらの方が、994行目~1006行目の範囲の数値を合計するという事が解りやすくなるかと思います。 つまり、 Range("B1007").Select ActiveCell.FormulaR1C1 = "=SUM(R[-13]C:R[-1]C)" Range("B1007").Select Selection.AutoFill Destination:=Range("B1007:AW1007"), Type:=xlFillDefault の4行は、次の様な1行で置き換える事が出来ます。 Range("B1007:AW1007").FormulaR1C1 = "=SUM(R994C:R1006C)" 次に、 Selection.AutoFill Destination:=Range("B1007:AW1007"), Type:=xlFillDefault の下にある Range("B1007:AW1007").Select という箇所ではB1007:AW1007というセル範囲を選択していますが、その後で関数を入力するなどといった、何らかの変更や計算を行う様な類の処理を特に行う事もなく、その直後に Range("AW994").Select という、AW994セルを選択する処理をしているのですから、要するにただ意味もなくB1007:AW1007を選択した後で、すぐに別のセルを選択している事になりますから、 Range("AW994").Select という箇所は必要のない部分という事になります。 同じく、 ActiveWindow.ScrollColumn というのは、単に画面をスクロールしているだけで、何らかの変更や計算を行う様な類の処理ではありませんから、これもまた省略する事が出来ます。 それから、 Range("AW994").Select ActiveCell.FormulaR1C1 = "=SUM(RC[-47]:RC[-1])" Range("AW994").Select Selection.AutoFill Destination:=Range("AW994:AW1007"), Type:=xlFillDefault という箇所と Range("AW1011").Select ActiveCell.FormulaR1C1 = "=SUM(RC[-47]:RC[-1])" Range("AW1011").Select Selection.AutoFill Destination:=Range("AW1011:AW1020"), Type:=xlFillDefault という箇所では、どちらも同じAW列のセルに関数を入力していて、しかもそこへ入力する関数もどちらも同じ "=SUM(RC[-47]:RC[-1])" という関数になっていますから、これらの4行×2=8行は、次の様な1行にまとめる事が出来ます。 Range("AW994:AW1007,AW1011:AW1020").FormulaR1C1 = "=SUM(RC2:RC48)" この様にして省略可能な箇所を省略し、まとめる事が可能な所をまとめますと、以下の様な3行(「Sub 問10SUM_整理()」と「End Sub」を入れても5行)にまとめる事が出来ます。 Sub 問10SUM_整理() Range("B1007:AW1007").FormulaR1C1 = "=SUM(R994C:R1006C)" Range("AW994:AW1007,AW1011:AW1020").FormulaR1C1 = "=SUM(RC2:RC48)" Range("B1020:AV1020").FormulaR1C1 = "=SUM(R1011C:R1019C)" End Sub
お礼
素晴らしく短くありがとうございます。
- ushi2015
- ベストアンサー率51% (241/468)
こんにちは マクロの記録で出来たコードを修正してまとめるのは初歩的な作業です。 ご自分のコードと見比べれば、どう整理すれば良いか分かると思います。
お礼
そうですね。
お礼
ありがとうございます。出来ました。 この Range()は手動で入力ですよね?