- ベストアンサー
エクセルVBAでSUM関数の位置をずらす
- エクセルVBAを使用して、SUM関数の位置をずらす方法について教えてください。
- VBAで指定した列番号までSUM関数の範囲を変更する方法を教えてください。
- エクセル2013のVBAを使用して、SUM関数の範囲をずらす方法について教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 課題としては、R1C1形式での参照を利用するのが、直球と思います。 (行を指定せずとも相対参照できますし、、、。) パッと思い付いた内の、状況によって使い分けできるようなものだけ、4例挙げてみます。 お奨めはSub Re8896257c、現在の数式の参照先を基準にしていますので応用が利きます。 Sub Re8896257dだけはA1形式での参照です。 Sub Re8896257a() ' 列数38固定、38-1=37列手前の列から始まる範囲をR1C1参照する Dim end_col As Long end_col = Cells(3, Columns.Count).End(xlToLeft).Column Range("J192").FormulaR1C1 = "=SUM(RC" & end_col - 37 & ":RC" & end_col & ")" End Sub Sub Re8896257c() ' 列数可変、現在の[数式の参照先]の列数を基準に範囲をR1C1参照する Dim end_col As Long Dim cnt_col As Long end_col = Cells(3, Columns.Count).End(xlToLeft).Column With Range("J192") cnt_col = .Precedents.Areas(1).Columns.Count .FormulaR1C1 = "=SUM(RC" & end_col - cnt_col + 1 & ":RC" & end_col & ")" End With End Sub Sub Re8896257d() ' 列数可変、現在の[数式の参照先]の最右の列位置を基準にOffsetで範囲をA1参照する Dim end_col As Long Dim fml_end_col As Long Dim ref As String end_col = Cells(3, Columns.Count).End(xlToLeft).Column With Range("J192") With .Precedents.Areas(1) fml_end_col = .Columns(.Columns.Count).Column ref = .Offset(, end_col - fml_end_col).Address(RowAbsolute:=False, ColumnAbsolute:=True) End With .Formula = "=SUM(" & ref & ")" End With End Sub Sub Re8896257j() ' 列数可変、現在の[数式文字列]から先頭列・最後列を求めR1C1参照する Dim end_col As Long Dim fml_1st_col As Long Dim fml_end_col As Long Dim fml As String end_col = Cells(3, Columns.Count).End(xlToLeft).Column With Range("J192") fml = .FormulaR1C1 fml_1st_col = Val(Mid(fml, InStr(fml, "C") + 1)) fml_end_col = Val(Mid(fml, InStrRev(fml, "C") + 1)) .FormulaR1C1 = "=SUM(RC" & fml_1st_col + end_col - fml_end_col & ":RC" & end_col & ")" End With End Sub
その他の回答 (2)
- WindFaller
- ベストアンサー率57% (465/803)
こんにちは。 マクロで、数式をいじるのは、面倒極まりないですね。 最初から、マクロで値を出したほうが楽です。 以下は、常識的なエラー対処はされています。 '// Sub TestSetFormula() Dim EndCol As Long Dim i As Long Dim r As Range Dim r1 As Range Dim r2 As Range Dim sAdr As String With ActiveSheet Set r = Range("J192") EndCol = .Cells(3, Columns.Count).End(xlToLeft).Column If EndCol < 2 Then MsgBox "データがありません。", 48: Exit Sub If Not r.HasFormula Then MsgBox r.Address & " には数式がありません。", 48: Exit Sub sAdr = r.DirectPrecedents.Address Set r1 = Range(sAdr) i = r1.Columns.Count 'または、38の固定した定数なら、リテラルに書くか、定数を置きます。 If EndCol >= i Then Set r2 = .Cells(r1.Row, EndCol).Offset(, -i + 1).Resize(, i) r.FormulaLocal = "=SUM(" & r2.Address & ")" End If End With End Sub '//
お礼
できました。ありがとうございました。
- mshr1962
- ベストアンサー率39% (7417/18945)
列の変更に対して、列を絶対参照にする必要性が意味ないと思うけど。。。 Sub test() Dim end_col As Long Cells(3, Cells(3, Columns.Count).End(xlToLeft).Column).EntireColumn.Select end_col = Selection.Column Cells(192,10).Formula = "=SUM("& Cells(192,end_col - 37).Address(RowAbsolute:=False) & ":" & Cells(192,end_col).Address(RowAbsolute:=False) & ")" End Sub
お礼
できました。ありがとうございました。
お礼
できました。ありがとうございました。 今回はおすすめのを採用することにしました。