こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

excel2010 簡単にするコード

Sub 問10SUM()
'
' 問10SUM Macro
'
Range("B1007").Select
ActiveCell.FormulaR1C1 = "=SUM(R[-13]C:R[-1]C)"
Range("B1007").Select
Selection.AutoFill Destination:=Range("B1007:AW1007"), Type:=xlFillDefault
Range("B1007:AW1007").Select
Range("AW994").Select
ActiveCell.FormulaR1C1 = "=SUM(RC[-47]:RC[-1])"
Range("AW994").Select
Selection.AutoFill Destination:=Range("AW994:AW1007"), Type:=xlFillDefault
Range("AW994:AW1007").Select
ActiveWindow.ScrollColumn = 20
ActiveWindow.ScrollColumn = 19
ActiveWindow.ScrollColumn = 18
ActiveWindow.ScrollColumn = 17
ActiveWindow.ScrollColumn = 16
ActiveWindow.ScrollColumn = 14
ActiveWindow.ScrollColumn = 13
ActiveWindow.ScrollColumn = 12
ActiveWindow.ScrollColumn = 11
ActiveWindow.ScrollColumn = 10
ActiveWindow.ScrollColumn = 9
ActiveWindow.ScrollColumn = 8
ActiveWindow.ScrollColumn = 7
ActiveWindow.ScrollColumn = 6
ActiveWindow.ScrollColumn = 5
ActiveWindow.ScrollColumn = 4
ActiveWindow.ScrollColumn = 3
ActiveWindow.ScrollColumn = 2
ActiveWindow.ScrollColumn = 1
Range("B1020").Select
ActiveCell.FormulaR1C1 = "=SUM(R[-9]C:R[-1]C)"
Range("B1020").Select
Selection.AutoFill Destination:=Range("B1020:AW1020"), Type:=xlFillDefault
Range("B1020:AW1020").Select
Range("AW1011").Select
ActiveCell.FormulaR1C1 = "=SUM(RC[-47]:RC[-1])"
Range("AW1011").Select
Selection.AutoFill Destination:=Range("AW1011:AW1020"), Type:=xlFillDefault
Range("AW1011:AW1020").Select
ActiveWindow.ScrollColumn = 22
ActiveWindow.ScrollColumn = 21
ActiveWindow.ScrollColumn = 18
ActiveWindow.ScrollColumn = 15
ActiveWindow.ScrollColumn = 10
ActiveWindow.ScrollColumn = 9
ActiveWindow.ScrollColumn = 8
ActiveWindow.ScrollColumn = 7
ActiveWindow.ScrollColumn = 6
ActiveWindow.ScrollColumn = 4
ActiveWindow.ScrollColumn = 3
ActiveWindow.ScrollColumn = 2
ActiveWindow.ScrollColumn = 1
End Sub
これはマクロの記録で作ったものです。AWにオートサムでBからAVを選択して右下の+を下に引っぱりました。。
ドラッグして選択せずにすむコード、もっと短くする方法を教えてください。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
     A     B    中略   AV     AW
993行  ラベル  北海   ~     沖     合計
994行  魚    2    ~     9     1100
中略 
1006行  他    6    ~     空欄    2000
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
簡単に載せると表はこうなっています。

投稿日時 - 2016-10-25 10:03:35

QNo.9247312

困ってます

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

こんにちは
セル選択やスクロールのコードは不要です。
整理すると、
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
です。

投稿日時 - 2016-10-25 10:16:47

お礼

ありがとうございます。出来ました。
この Range()は手動で入力ですよね?

投稿日時 - 2016-10-25 10:38:07

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

考え方としては以下の様なものになります。


 まず、

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

投稿日時 - 2016-10-25 13:56:20

お礼

素晴らしく短くありがとうございます。

投稿日時 - 2016-10-25 13:59:25

ANo.2

こんにちは
マクロの記録で出来たコードを修正してまとめるのは初歩的な作業です。
ご自分のコードと見比べれば、どう整理すれば良いか分かると思います。

投稿日時 - 2016-10-25 11:07:27

お礼

そうですね。

投稿日時 - 2016-10-25 11:48:57

あなたにオススメの質問