はじめに
VBAを使う上でセルを扱う、 Range と Cells の使い方は避けて通れません。
Range と Cells はセルを参照するという意味では同じ機能を持ちますが、これからがプログラムでどのように使われるか見ていきます。
Range
Rnage(“セルの位置”)
セルの位置を”A1” などと文字列で指定します。順序は “列行” で書くので “1A” などと書いてはいけません。また単に A1 とすると文字列とは判断しません。
(VBAでは””で囲むと文字列だと判断します。)
Range(“A1”)
という感じで使います。
実際のプログラムでは以下の様に使います。
Sub test1()
Range("A1") = "abc" 'A1 セルに 「abc」 と表示されます。
Range("A2") = 100 'A2 セルに 「100」 と表示されます。100は数値なので ”” が不要です。
End Sub
セルの複数選択
更にRangeは複数のセル範囲を指定できます。
Range(“開始セル” , “終了セル”)
Range(“開始セル : 終了セル”)
開始セルは左上のセル、終了セルは右下のセルになります。
こちらは矩形の選択となります。
Range(“A1″,”B3”)
Range(“A1:B3”)
この2つは、どちらもA1~B3までの矩形となります。
矩形でない複数選択
矩形でない複数選択も可能です。
Range(“セル1 , セル2 , セル3 , セル4”)
とすれば、矩形でなくても個別のセルを同時に選択できます。
標準モジュールに以下の様に書いて実行してみましょう。
Sub test2()
Range("A1", "A3") = 123
Range("B1:B3") = 333
End Sub
Cells
Cells(行番号 , 列番号)
セルを行番号と列番号で指定します。
Cells(1,1) とするとA1のセルを指します。
尚、「列」はアルファベット文字列を使ってもOKです。
Cells(1 , “A”) という書き方もできます。
Cells は基本的に複数選択は出来ません。
ただし、数値で行と列を指定できるためFor文の内部でセルを巡って処理するのに向いています。
実際のプログラムでは以下の様に使います。
Sub test3()
Cells(5, 3) = "5行目C列"
Cells(6, "D") = "6行目D列"
End Sub
第一引数の「行」は数値を指定します。
第二引数の「列」は数値または列を示すアルファベットで指定できます。アルファベットで指定する時は ”” を忘れないようにしましょう。
プロパティを省略した時は Value
VBAでは、省略した場合は初期設定を使うというルールが適用される事があります。
Range(“A1”)
Cells(1,”A”)
は、本来は、以下のように書いたのと同じです。
Range(“A1”).Value
Cells(1,”A”).Value
Valueとは「値」という意味です。
Sub test4()
Range("A1").Value = "abc"
Cells(6, "D").Value = 123
End Sub
本来なら上記のように書くのが正式な書き方ですが、省略して書けるという事です。
Range、Cellsには、Valueの他に様々な属性(プロパティ)があります。
例えば以前出てきた、NumberFormatLocal は書式設定の情報をやり取りできます。
その他にセルの値を文字列として返す Text。
などなど、、、
プロパティについては、登場する際にその都度紹介しますが、
プロパティを省略した場合は、Valueが使われるという事を覚えておいてください。
他のセルに転記
RangeやCellsを使えば、他のセルの値を取得したり、設定したりする事が出来ます。
Range(“B1”) = Range(“A1”) A1の値をB1へ
Cells(2 , 2) = Range(“A1”) A1の値をB2へ
右辺から左辺へ代入されます。
RangeとCellsを混合させて使っても問題ありません。
さて、あえて「コピー&貼り付け」という言葉を使わないのには理由があります。
上の式では、「値」を転記しているだけで、書式設定やフォント、セルの背景色などの情報はやり取りできません。
Excelで言う「コピー&貼り付け」とは、CopyコマンドとPasteコマンドが別に存在します。こちらは書式設定なども含めた情報を全て別のセルにコピーする事が出来ます。
ただ、業務改善などの目的でデータのやり取りをする際は、「値」だけを取り扱いたいというケースが殆どです。「コピー&貼り付け」については別の機会に解説します。
他のシートのセルに転記
他のシートのセルの値を取得・設定したい場合は、シートを指定しなければなりません。
これまでシートの指定は省略して書いてきました。省略した場合は、現在開いているシート(ActiveSheet)が対象となります。
ActiveSheet.Range(“B1”) = ActiveSheet.Range(“A1”) 開いているシートのA1の値をB1へ
単一のシート上で参照する場合はいいのですが、別のシートをアクティブにした時には、そのシートのセルが対象となります。複数のシートにまたがって処理したい場合は、シートを特定しなければいけません。
別シートの指定方法
シートを指定するには、Worksheetオブジェクト(またはSheetオブジェクト)を指定するのですが、それには Worksheets というオブジェクト配列の中から指定する必要があります。(Worksheetsが複数形になっている事に注意)
Worksheetsにはそのブックの中にあるシートが全て格納されています。
ワークシートが3つあれば、
Worksheets(1)
Worksheets(2)
Worksheets(3)
とすれば、各シートを特定できるのですが、これだと判りずらいので、シート名で指定する事が多いです。
シート名で指定する場合は、以下のようにシート名を文字列で指定します。
Worksheets(“Sheet1”)
Worksheets(“Sheet2”)
Worksheets(“Sheet3”)

例えば、Sheet1のA1セルの値を、Sheet2のB2セルに転記したければ、以下のようにします。
Worksheets(“Sheet2”).Range(“B2”) = Worksheets(“Sheet1”).Range(“A1”)
シートを選択してアクティブにする
Selectでシートを選択すると、そのシートがアクティブになりますので以下のような書き方もできます。
Worksheets("Sheet2").Select
Range("B2") = Worksheets("Sheet1").Range("A1")
この方法ではシートの選択を行うため、それまで選択していたシートから表示が変わってしまいます。以下のように書けば表示しているシートの変更は起こりません。
Worksheets("Sheet2").Range("B2") = Worksheets("Sheet1").Range("A1")
他のブックのセルに転記
Excelでは、ブック > シート > セル という段階的な構成になっているので、本来であればブックも指定しなけれいけません。
省略しない場合は、ThisWorkbook を付けます。
ThisWorkbook.Worksheets(“Sheet1”).Range(“A1”)
ブックが2つ以上開いている状態で各ブックを指定するには、Workbook オブジェクトを指定する必要があります。
それには Workbooks というオブジェクト配列の中から指定する必要があります。
(Workbooksが複数形になっている事に注意)
Workbooksにはそのブックの中にあるシートが全て格納されています。
ワークシートと同じように、現在開いているブックは、Workbooks に入っているので、ここから探します。
3つのブックが開いていれば、
Workbooks(1)
Workbooks(2)
Workbooks(3)
となりますが、これでは特定しずらいので、ファイル名で指定します。
(ファイル名が同じ場合はパスも指定します。)
Workbooks(“Book1.xlsm”)
Workbooks(“Book2.xlsm”)
Workbooks(“Book3.xlsx”)

尚、開いていないブックに関しては、ブック(ファイル)を開いてから Workbook オブジェクトを取得することになります。 その方法については、もう少し後で説明したいと思います。
アクティブなブック
新たにブックを開くと、そのブックがアクティブになります。
また、Activateを使えば、そのブックをアクティブにすることができます。
Workbooks(“Book2.xlsm”).Activate
Worksheets(“Sheet1”).Range(“A1”) = “文字列”
とすれば、Book2xlsm の Sheet1 の A1 に文字列が代入されます。
Workbooks("Book2.xlsm").Activate
ThisWorkbook.ActiveSheet.Range("A1") = Worksheets("Sheet2").Range("A1")
転記先がプログラムを実行したシートの場合、他のブックに移っても ThisWorkbook で指定すればブック名を指定しなくても問題ありません。
まとめ
今回は理屈ばかりで演習が少なかったのですが、実際のプログラムではブック、シートの指定が冗長となってしまうので、簡略化して書くようにします。
次回は、簡略化の方法を含めて実際のプログラムに近い形を学習しましょう。
入門講座 目次
・開発環境を整える
・VBAプログラムの基礎
・VBAプログラムの基礎2
・セルの使い方
・ブックやシートの参照
・プログラムでの日付の扱い方
・プロシーシャの使い方
・「マクロの記録」を利用する
・デバッグのやり方
・やりたい事の調べ方と解決方法
・自力でプログラムを書いてみる
・別ブックのデータを集計
・別ブックのデータを集計 2
コメント