VBAを活用して、絶対/相対参照を自在に変更してみよう!

 エクセルで数式を入力する際、セル参照を「絶対参照」と「相対参照」の使い分けは非常に重要です。特に、VBA(Visual Basic for Applications)を使うと、繰り返し行う作業を自動化でき、効率的に作業を進めることができます。今回は、選択した範囲のセル参照を絶対参照や相対参照に変えるVBAコードを紹介します!

絶対参照・相対参照とは?

 エクセルには「絶対参照」、「相対参照」と「複合参照」という参照方法があります。

 ■絶対参照: セルをコピー・移動しても参照先が変わらない。
  絶対参照は、セル参照の前に「$」マークが付きます。例えば、「$A$1」という形になります。

 ■相対参照: セルをコピー・移動したときに、参照先のセルが変わる。
  例えば、A1を参照しているセルをコピーすると、コピー先のセルに合わせて参照先も変わります。

 ■複合参照: 行・列別々に絶対参照・相対参照を使用する。
  例えば、行を絶対参照する場合は「A$1」、列を絶対参照する場合は「$A1」となります。

これらの参照方法をVBAで効率的に変更する方法を紹介します。

絶対参照に変更するVBAコード

 ■絶対参照に変更する場合

 このコードは、選択した範囲内のセルが数式を含んでいる場合、その数式を絶対参照に変換します。

sub 絶対参照に変換()

  Dim cell as Range
  '選択範囲のセルを1つずつ処理
  For Each cell In Selection
    'セルの数式を絶対参照に変換
    if cell.HasFormula Then
      cell.Formula = Application.ConvertFormula(cell.Formula,xlA1,xlA1,xlAbsolute)
    End If
  Next cell
  End Sub

 VBAコードの実行方法は、以下手順で実行します。

  ・エクセルを開いた状態で「Alt」+「F11」キーを押し、VBAエディタを開く
   ↓
  ・「挿入」タブより「標準モジュール」を選択
   ↓
  ・VBAコードをコピペして、上書き保存
   ※新規ブックで作成される場合、「ファイルの種類」を「Excelマクロ有効ブック」で保存することを忘れずに!
   ↓
  ・エクセルの画面で、「Alt」+「F8」キーで実行したいマクロを選択し、実行する
   ↓
  ・相対参照が、無事に絶対参照に変換された!

相対参照に変更するVBAコード

 ■相対参照に変更する場合

 このコードは、選択した範囲内のセルが数式を含んでいる場合、その数式を相対参照に変換します。

sub 相対参照に変換()

  Dim cell as Range
  '選択範囲のセルを1つずつ処理
  For Each cell In Selection
    'セルの数式を相対参照に変換
    if cell.HasFormula Then
      cell.Formula = Application.ConvertFormula(cell.Formula,xlA1,xlA1,xlRelative)
    End If
  Next cell
  End Sub

複合参照に変更するVBAコード

 ■複合参照に変更する場合(行のみ絶対参照)

sub 行だけ絶対参照に変換()

  Dim cell as Range
  '選択範囲のセルを1つずつ処理
  For Each cell In Selection
    'セルの数式を絶対参照に変換
    if cell.HasFormula Then
      cell.Formula = Application.ConvertFormula(cell.Formula,xlA1,xlA1,xlAbsRowRelColumn)
    End If
  Next cell
  End Sub

 ■複合参照に変更する場合(列のみ絶対参照)

sub 列だけ絶対参照に変換()

  Dim cell as Range
  '選択範囲のセルを1つずつ処理
  For Each cell In Selection
    'セルの数式を絶対参照に変換
    if cell.HasFormula Then
      cell.Formula = Application.ConvertFormula(cell.Formula,xlA1,xlA1,xlRelRowAbsColumn)
    End If
  Next cell
  End Sub

<補足>Application.ConvertFormulaとは?

 今回は対象範囲の参照スタイルを変更するために、「Application.ConvertFormula」メソッドを使用しました。こちらを使用することで、絶対参照や相対参照に変換することが可能です!記述方法と説明は以下の通りです。

=Application.ConvertFormula(Formula,FromReferenceStyle,[ToReferenceStyle],[ToAbsolute],RelativeTo)

それぞれの説明は以下の通りです!

 参照形式は、「A1」と「R1C1」があります(いずれも同じセルを識別)が、見慣れた参照形式を指定することで問題ないです!(私はA1形式が見慣れているので、今回はこちらの参照形式を指定)

 実際のVBAコードにも記載しましたが、セルの参照スタイル(XlReferenceType)は以下のとおり4種類あります!

<応用>複数シートを一気に変更する場合

 各シートをループすることにより、選択したシート・選択したセル範囲全ての数式を一気に絶対参照にすることもできます!複数シートを一気に変更するVBAコードは以下の通りです。

Sub 選択したシートの選択したセルを絶対参照にする()

  Dim ws As Worksheet
  Dim cell As Range
  Dim formulaStr As String

  'アクティブウインドウにある選択した複数シートをループ
  For Each ws In ActiveWindow.SelectedSheets
    'シートの選択したセル範囲をループ
    For Each cell In ws.Range(Selection.Address)
      '数式があるセルがある場合
      if cell.HasFormula Then
        'セル内の数式を取得し、絶対参照に変更
        cell.Formula = Application.ConvertFormula(cell.Formula,xlA1,xlA1,xlAbsolute)
      End If
    Next cell
  Next ws
End Sub

 状況によっては(複雑な数式や名前付き範囲など)うまく動作しない可能性あるため、そのような場合はちゃんと参照変換されるか確認の上、ご活用ください!
 うまく活用すれば自動化による作業効率化にもつながりますので、ぜひ活用してみてください!

 今回の内容が少しでも参考になれば幸いです。
ご覧いただき、ありがとうございました!

コメント

タイトルとURLをコピーしました