• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルVBAでSUM関数の位置をずらす)

エクセルVBAでSUM関数の位置をずらす

このQ&Aのポイント
  • エクセルVBAを使用して、SUM関数の位置をずらす方法について教えてください。
  • VBAで指定した列番号までSUM関数の範囲を変更する方法を教えてください。
  • エクセル2013のVBAを使用して、SUM関数の範囲をずらす方法について教えてください。

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

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.2

こんにちは。 課題としては、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

hinoki24
質問者

お礼

できました。ありがとうございました。 今回はおすすめのを採用することにしました。

その他の回答 (2)

回答No.3

こんにちは。 マクロで、数式をいじるのは、面倒極まりないですね。 最初から、マクロで値を出したほうが楽です。 以下は、常識的なエラー対処はされています。 '// 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 '//

hinoki24
質問者

お礼

できました。ありがとうございました。

  • mshr1962
  • ベストアンサー率39% (7417/18945)
回答No.1

列の変更に対して、列を絶対参照にする必要性が意味ないと思うけど。。。 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

hinoki24
質問者

お礼

できました。ありがとうございました。