_基本

RangeとCellの使いわけ【VBA基本】

VBAではセルを指定する方法として「Range」と「Cells」の二種類があります、
どちらもRangeオブジェクトでセルを指定するものです。
下記にコードの記載方法をRange、Cellそれぞれサンプルで記載します。

Rangeの書き方

  '■単独セル
    Range("C1")
  '■複数セル 
    Range("A1:D10")
  '■複数行 (1行目から3行目すべて)
    Range("1:3")
  '■複数列 (A列からC列すべて)
    Range("A:C")

“C1″や”A1:D10″のようなエクセルの表現(A1形式)の為、馴染みがあり理解しやすいです。

Cellsの書き方

  '■単独セル セル10行目、3列目→セル「C10」
   Cells(10, 3)
  '■単独セル セル10行目、C列→セル「C10」 
   Cells(10, "C")
  '■複数セルはRangeで表現必要。例はA1~A5
   Range(Cells(1, 1),Cells(5,1)) 
   Range(Cells(1, "A"),Cells(5,"A")) 

(10,”C”)はまだしも、(10,3)のような表現は通常エクセルでは表現されないR1C1形式です。
VBAを学び始めたばかりだと、この部分が理解しずらい概念だと思います。
しかし、VBAマクロで優先的に覚えてもらいたいのはこちらの「Cells」です。

Rangeは基本使わない!Cellsを使う

プログラムは変数で処理をする場合、Rangeだと使いづらいです。
VBA初心者だとエクセルのように使えるRangeを使いがちですが、
メンテナンスを考えるとCellsで記載すべきです。

下記例の場合、Range、CellsどちらもA1~A10に1~10の数値を入れています。

  Dim i as long
  For i = 1 To 10
    '■Rangeで設定したセルにiを入れていく。
    Range("A" & i) = i
    '■Cellsで設定したセルにiを入れていく。
    Cells(i, 1) = i
  Next i

上記だけ見るとRange(“A” & i) のがわかりやすいのでは?と思いがちですが、
メンテナンスがしずらいプログラムの為、避けるべきです。

メンテナンスがしずらい理由
A列の処理をB列に変更する場合は、
プログラムの中からコードを全て確認する必要性が出てきます。

実は上記のCells(i,1)の記載方法も、メンテナンスがしずらいコードの為、上記だけであればCellsを優先的に覚える必要はありません。Cellsを有効にするには定数をうまく使う事が大事です。

Cellsと定数を上手に使う

下記例の場合、定数を使用していない・使用しているパターン共にA1~A10に1~10の数値を入れています。

  Dim i as long
  Const COL_NUMBER As Long = 1  '■定数宣言

  For i = 1 To 10
    '■Cellsで設定したセルにiを入れていく。
    Cells(i, 1) = i
    '■Cellsで設定したセルにiを入れていく。 (定数を使用)       
    Cells(i, COL_NUMBER) = i 
  Next i

Cells(i, 1)では何をしているかコードだけでは判断できませんでしたが、
Cells(i, COL_NUMBER)の表記で、ナンバーの列に1~10の値を入れていると判断が出来るようになりました。

Rangeでも表現できますがNG
定数にアルファベットを入れて、Range(COL_NUMBER & i)のような表現でも動作はしますが、COL_NUMBER をループで回そうと思うとアルファベットより数字のが有効です。
=Cellsを積極的に使いましょう
メンテナンス面でもCellsは有効
上記のように定数宣言をしている為、A列からB列に変更する場合は
定数の値を「1」から「2」に変更するだけで済みます。

上記のように、Cellsの概念と定数を上手に使用する事が、マクロを自由に使う第一歩です。

Rangeを使うケース

下記のように名前定義をしているセルを参照する際は、Rangeでないとエラーになります。
マクロの組み方にもよるので、積極的に使う必要性はないと考えています。
※実際には「合計数値」の名称も定数化が望ましいですね。

    Range("A100").CurrentRegion.Name = "合計数値"
    Range("合計数値").Select
End Sub

コメント

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