Microsoft 製品に組み込まれている Visual Basic の実装。
こんにちは。
> ブックを開くと特定のセル(A9)に移動するマクロは「絶対参照」で記録してはダメなのでしょうか?
常に同じセルへ移動するのであれば絶対参照で記述します。
【A1セルにカーソルを置いた状態で記録開始、「C4セルをクリック」】
のマクロの結果は下記になります。
相対参照オフ: Range("C4").Select
相対参照オン: ActiveCell.Offset(3, 2).Range("A1").Select
「相対参照で記録」のポップアップヘルプに書いてある通り、
上のマクロでは、マクロ実行時のカーソル位置がどこであってもC4セルに飛びますが、
下のマクロでは、マクロ実行時にカーソルがB3セルにあれば、B3セルを基点とした
C4セル位置(B3から下へ3&右へ2)、即ちD6セルに飛びます。
> ActiveCell.Offset(3, 2).Range("A1").Select
上記の書き方だけでなく、
Range("C4").Range("A1") や Range("E5:G10").Range("A1")
も相対参照の記述です。
最初に記述するセル(それがセル範囲であれば、その範囲の左上隅のセル)を
基点(A1セルと見立てて)として、2番目の記述で、その基点からの
相対セル位置を記述します。
実を言えば、
> Range("C4").Select
これも、
Range("A1").Range("C4").Select
「A1セルを基点としたC4セル」という相対参照のひとつとも言えます。
マクロで相対参照を利用するシーンとしては、
シート上に、同じレイアウトの範囲が複数あり、
その個々の範囲内は、全て同じレイアウトで、
個々の範囲に対して行なう処理も同じ。
というものですね。
例としては、七曜暦(通常の横7×縦6の暦)や、住所シールなどが
あるでしょう。
ひとつの範囲の処理だけマクロ化しておけば、残りの範囲の処理は
基点セルを切り替えるだけで繰り返し利用できます。
A1・D1・G1・J1……を基点とした範囲で
Range("A1").Value = ……
Range("A3").Value = ……
Range("C5").Value = ……
こういう同じ処理が個々の範囲で必要ならば、相対参照を利用して、
下記のようにひとまとめにしたマクロとすることができます。
Dim rng As Range
For Each rng In Range("A1,D1,G1,J1")
With rng
.Range("A1").Value = ……
.Range("A3").Value = ……
.Range("C5").Value = ……
End With
Next
または、
Dim j As Integer
For j = 1 To 10 Step 3
With Cells( 1, j )
.Range("A1").Value = ……
.Range("A3").Value = ……
.Range("C5").Value = ……
End With
Next