Range Object の指定は、どうしても長くなります。コードを書く場合の効率上でも、また、アドレス等を変更する場合の手間を最小限にする意味でも、With の活用は欠かせません。しかし、With も気をつけて使わなければならないキーワードの一つです。
Sheet1.Range("D6").Font.Name = "Arial"
Sheet1.Range("D6").Font.Size = 18
With Sheet1.Range("D6").Font
.Name = "Arial"
.Size = 18
End With
With Sheet1.Range("D6:F8").Range("A1").Font
.Name = "Arial"
.Size = 18
End With
Set x = Sheet1.Range("D6:F8").Range("A1").Font
x.Name = "Arial"
x.Size = 18
With は、コンパイル時に解釈されるため、最初の2つは、まったく同一のものとなります。つまり、With は、コード作成者にとっての便宜に過ぎなく、実行コードには影響しないのです。3つ目の場合、Range Object のネストが入っています。このコードの実行速度は最初の2つに比べて、やや劣るでしょう。その理由は Object を参照する回数が増えるからです。一般に . が増えるごとに、何らかの Object を参照するわけですから、スピードは遅くなります。ただし、最初に書いた理由から、その回数は With を展開した後のもので数えることなります。
たくさんの . を使った参照を見やすく、かつ効率良く使うテクニックの一つに、「 Set を使う」というものがあります。最後の例では、Set により x の参照先が確定した後は、効率良くアドレスを参照することができます。ただし、Set 文という余分な操作が入るため、上の例のように利用回数が少なければ、かえって効率が悪くなることもあります。