文系seの備忘録

Excelの改行でひたすらスペースを打っていた機械音痴の文系seが日々の備忘録を綴る。

【Excelv VBA】 RangeとCellsって何が違うの?


この記事にて、セルに値を入力する簡単な例を書きましたが、

samooooon.hatenablog.com

この例では「Range」を使用してセル入力を行いました。

ただ、セル入力の方法にはもう一つあります。

Cells」です。


このふたつって何が違うんでしょう。
・・・私もよくわかってないので、グーグル先生に教えてもらいつつ違いを整理してみます。






■ Range

まずRange。


1. 表や枠組みが決まってるときに使う


英語の意味の通り、範囲を指定したり、設定する位置が決まっているときに使うことが多いようです。
例えば以下の伝票のように枠組みが決まってるような場合

f:id:ron623:20180701114032p:plain

こういう、毎回おんなじテンプレで出すようなものは値のみ変わりますので
Rangeを使用して変数のみ変えてあげればOKそうです。



2.範囲が複数セルにまたがる際に使う

MicrosoftVBA リファレンスによると、範囲を指定すると書いてあったのはRangeだけでした。
名前の通り、忠実に使用すれば問題ないってことですね。






つづいてCells。

■ Cells



1.単一セルを変数で指定して参照するときに使う


以下に、ファイルからテキストを読み込んでセルに書き出すサンプルを記載します。

Sub Sample()
  Dim buf As String, tmp As Variant, n As Long
  Open "C:\Data\Sample.csv" For Input As #1
    Do Until EOF(1)
      Line Input #1, buf
      Rem カンマの位置でデータを区切る
      tmp = Split(buf, ",")
      n = n + 1
Rem セルにデータを入力
Cells(n, 1).Value = tmp(0)
Cells(n, 2).Value = tmp(1)

    Loop
  Close #1
End Sub


→ 上記の場合、Rangeのときと違って伝票のきまった枠に書き出すわけでなく、読み込んだデータによって中身は様々ですので
変数で指定してあげるのが適切です。







(補足)

msdnによると
・Worksheet.Range プロパティ (Excel)
ワークシートのすべてのセル (現在使用されていないセルも含む) を表す Range オブジェクトを返します。
・Worksheet.Cells プロパティ (Excel)
ワークシートのすべてのセル (現在使用されていないセルも含む) を表す Range オブジェクトを返します。

→ Cellsオブジェクトっていうのはないんですよね。

f:id:ron623:20180701121428p:plain

どっちにも「セル」とあるように、普段はあまり意識せずセルの入力はRange、Cellsどちらでもできるかと思います。
ただ、パフォーマンスや用途を考えるようになったときに、考慮するとよいかと思われます。




<参考>
msdn
https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/worksheet-range-property-excel

https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/worksheet-cells-property-excel