2014/02/01

【VBA】選択範囲の絶対参照、相対参照を相互変換する

 セル内に「=A1」、「=A1+A2」と入力したあとに、参照先はそのままでコピーして他の場所で使いたいときがある。
だがセルを相対的に参照しているため、移動した時点で参照先が変わってしまい結果がおかしくなってしまう。

解決するには、「=$A$1」、「=$A$1+$A$2」のように全て絶対参照に修正すればよい。


反対に、絶対参照で数式を入力したあとに、やっぱり相対参照がよかった。
なんてこともよくあることだ。

しかし、「=A1+A2」と「=$A$1+$A$2」を毎回手作業で修正するのは馬鹿らしい。


それを一括で行うマクロが以下になる。
※以下の例は、行・列ともに全て変換する方法だ。
   行のみ、列のみは「マクロの内容説明」を参照してほしい。




選択範囲を絶対参照に変換する


Sub 選択範囲を絶対参照に変換()
    Dim myRange As Range
    
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    
    For Each myRange In Selection
        If myRange.HasFormula Then
            myRange.Formula = Application.ConvertFormula( _
                    Formula:=myRange.Formula _
                    , fromReferenceStyle:=xlA1 _
                    , ToAbsolute:=xlAbsolute)
        End If
    Next
    
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub



選択範囲を相対参照に変換する


Sub 選択範囲を相対参照に変換()
    Dim myRange As Range
    
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    
    For Each myRange In Selection
        If myRange.HasFormula Then
            myRange.Formula = Application.ConvertFormula( _
                    Formula:=myRange.Formula _
                    , fromReferenceStyle:=xlA1 _
                    , ToAbsolute:=xlRelative)
        End If
    Next
    
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub



マクロの内容説明



「Application.EnableEvents」と「Application.ScreenUpdating」はマクロ実行時に画面のちらつき防止や処理速度向上のためのおまじない。



行のみ、列のみなどの詳細な参照方法指定は以下の通り。

ToAbsolute:=

  • xlAbsolute       … 行列ともに絶対参照(例:=$A$1) 
  • xlAbsRowRelColumn  … 行だけ絶対参照(例:=A$1) 
  • xlRelRowAbsColumn  … 列だけ絶対参照(例:=$A1) 
  • xlRelative        … 行列ともに相対参照(例:=A1)




以上

0 件のコメント :

コメントを投稿