セルの使い方

VBA入門講座

はじめに

 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文の内部でセルを巡って処理するのに向いています。

両者の行、列の順番に注意しましょう。
Rangeは “列 行” 、Cellsは(行,列)と記述が逆になります。

実際のプログラムでは以下の様に使います。

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

本来なら上記のように書くのが正式な書き方ですが、省略して書けるという事です。

 RangeCellsには、Valueの他に様々な属性(プロパティ)があります。
 例えば以前出てきた、NumberFormatLocal 書式設定の情報をやり取りできます。
 その他にセルの値を文字列として返す Text
 などなど、、、

 プロパティについては、登場する際にその都度紹介しますが、
 プロパティを省略した場合は、Valueが使われるという事を覚えておいてください。

他のセルに転記

 RangeCellsを使えば、他のセルの値を取得したり、設定したりする事が出来ます。

 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 に文字列が代入されます。

ブックを複数開いてどのブックをActivateしても、プログラムを実行したブックはThisWorkbook である点に注目しましょう。

Workbooks("Book2.xlsm").Activate
ThisWorkbook.ActiveSheet.Range("A1") = Worksheets("Sheet2").Range("A1")

 転記先がプログラムを実行したシートの場合、他のブックに移っても ThisWorkbook で指定すればブック名を指定しなくても問題ありません。

まとめ

 今回は理屈ばかりで演習が少なかったのですが、実際のプログラムではブック、シートの指定が冗長となってしまうので、簡略化して書くようにします。
 次回は、簡略化の方法を含めて実際のプログラムに近い形を学習しましょう。

コメント

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