EB000006_VBAエキスパート(ExcelVBAベーシック)合格講座/第六回:セルのプロパティとメソッド

VBAエキスパート(ExcelVBAベーシック)合格講座/第六回:セルのプロパティとメソッド ExcelVBA Basic
  1. このページの内容について
  2. セルの値や式を参照するためのプロパティ
    1. Valueプロパティ
      1. セルに入力されている値の書き換えと読み取り
        1. サンプルコード(クリックでコピー)
        2. 実行結果
      2. Valueプロパティの省略
        1. サンプルコード(クリックでコピー)
        2. 実行結果(省略版)
    2. Textプロパティ
      1. セルに表示されている文字列の読み取り
      2. サンプルコード(クリックでコピー)
      3. 実行結果
    3. Fomulaプロパティ
      1. セルに入力されている式の書き換えと読み取り
      2. サンプルコード(クリックでコピー)
      3. 実行結果
  3. セルの状態を取得するプロパティ
    1. Rowプロパティ
      1. セルの行番号の読み取り
      2. サンプルコード(クリックでコピー)
      3. 実行結果
    2. Columnプロパティ
      1. セルの列番号の読み取り
      2. サンプルコード(クリックでコピー)
      3. 実行結果
  4. セルを操作するためのメソッド
    1. Activateメソッド
      1. 指定したセルをアクティブにする
      2. サンプルコード(クリックでコピー)
      3. 実行結果
    2. Selectメソッド
      1. 指定したセルを選択状態にする
      2. サンプルコード(クリックでコピー)
      3. 実行結果
    3. Copyメソッド
      1. セルのデータを別のセルへコピーする
      2. 書式
      3. サンプルコード(クリックでコピー)
      4. 実行結果
    4. メソッドの実行について
      1. メソッドの実行方法はいくつか種類がある
      2. Call
        1. サンプルコード(クリックでコピー)
        2. 実行結果
      3. 引数の指定方法
        1. サンプルコード(クリックでコピー)
        2. 実行結果
    5. ClearContentsメソッド
      1. セルのデータをクリアします
      2. 書式
      3. サンプルコード(クリックでコピー)
      4. 実行結果
    6. Withステートメント
      1. 同じオブジェクトを繰り返し使用する場合の省略記法
      2. 書式
      3. オブジェクト変数の省略
        1. サンプルコード(クリックでコピー)
        2. 実行結果
      4. オブジェクトの省略
        1. サンプルコード(クリックでコピー)
        2. 実行結果
    7. Deleteメソッド
      1. セルのデータをクリアします
      2. 書式
      3. 定数一覧
      4. サンプルコード(クリックでコピー)
      5. 実行結果

このページの内容について

このページは、VBAエキスパート(ExcelVBAベーシック)試験合格講座の第六回記事です。前回に引き続き第公式テキスト第6章「セルの操作」の内容について解説します。1時間の講義でお話する程度の分量です。講座受講者の復習での利用を想定しています。

セルの値や式を参照するためのプロパティ

ここからはRangeを使用してセルを操作するためのプロパティの内、代表的なもの(試験に登場するもの)について1つずつ解説をしていきます。

Valueプロパティ

セルに入力されている値の書き換えと読み取り

Valueプロパティは前述の通りValueに値を代入すると、セルに格納されている値を書き換えることができます。また逆にセルに入っている値を読み取ることもできます。

サンプルコード(クリックでコピー)
Private Sub Test_ValueProperty()

Dim rng As Range

Set rng = ThisWorkbook.Worksheets(1).Range("A1") '①
rng.Value = "これは文字列です" '②
Debug.Print rng.Value '③

Set rng = ThisWorkbook.Worksheets(1).Range("A2") '④
rng.Value = 100 '⑤
rng.Value = rng.Value * rng.Value '⑥

End Sub
実行結果

上記サンプルコードを実行すると、
 ①セル「A1」を表すRangeをオブジェクト変数に格納
 ②Rangeが格納されたオブジェクト変数を使用してセル「A1」に文字列を格納
 ③セル「A1」に格納された値を読み取りイミディエイトウィンドウに出力
 ④オブジェクト変数に格納されたRangeを「A2」を表すRangeに書き換え
 ⑤Rangeが格納されたオブジェクト変数を使用してセル「A2」に数値を格納
 ⑥セル「A2」に格納された値を読み取りかけ合わせて、セル「A2」に格納
という処理がされます。

Valueプロパティで数式や関数が入力されているセルを読み取る場合は、数式や関数の式ではなく結果の値を読み取ります。

Valueプロパティの省略

セルを操作するプロパティやメソッドの中でもValueプロパティは特別なプロパティで、省略して記述することが認められています。さきほどのサンプルを省略記法で書き直してみます。

サンプルコード(クリックでコピー)
Private Sub Test_ValueShorthand()

Dim rng As Range

Set rng = ThisWorkbook.Worksheets(1).Range("A1") '①
rng = "これは文字列です" '②
Debug.Print rng '③

Set rng = ThisWorkbook.Worksheets(1).Range("A2") '④
rng = 100 '⑤
rng = rng * rng '⑥

End Sub
実行結果(省略版)

上記サンプルコードを実行すると前述の結果とまったく同じ結果になります。

「.Value」を省略すると、コード全体がすっきりして読みやすくなりました。しかし文脈によってオブジェクトへの操作なのか、プロパティへの操作なのかを読み取る必要があるため、省略することが常に読みやすさにつながるわけではありません。場面に応じて使い分けましょう。

Textプロパティ

セルに表示されている文字列の読み取り

Valueプロパティがセルに入力されている値を読み取るのに対し、Textプロパティではセルに表示されている書式を反映した文字列を読み取ります。例えば3桁区切りの書式を設定したセルに「10000」が入力されている場合、Valueは「10000」を読み取り、Textは「10,000」を読み取ります。

サンプルコード(クリックでコピー)

Private Sub Test_Text()

Dim rng As Range

Set rng = ThisWorkbook.Worksheets(1).Range("A1")
Call MsgBox(rng.Value)

End Sub

実行結果

Value

Valueプロパティ

Text

Textプロパティ

Textプロパティは読み取り専用で、Valueプロパティのように書き換えはできません。

Fomulaプロパティ

セルに入力されている式の書き換えと読み取り

Valueプロパティがセルに入力されている値の読み書きができるのに対し、Fomulaプロパティはセルに入力されている式(数式や関数)の読み書きができます。

サンプルコード(クリックでコピー)

Private Sub Test_Fomula()

Dim ws As Worksheet
Dim rng As Range

Set ws = ThisWorkbook.Worksheets(1)
Set rng = ws.Range("A4")

ws.Cells(1, 1).Value = 100
ws.Cells(2, 1).Value = 200
ws.Cells(3, 1).Value = 300

rng.Formula = "=Sum(A1:A3)"

End Sub

式を代入したいときは、式を文字列で指定する必要があります。マクロ内の記述なのかセルに入力したい式なのかをVBAが判定できないためです。

実行結果

セルの状態を取得するプロパティ

Rowプロパティ

セルの行番号の読み取り

Rowプロパティはセルの行番号を取得することができます。10行目なら「10」2行目なら「2」が取得できます。読み取り専用です。

サンプルコード(クリックでコピー)

Private Sub Test_RowProperty()

Dim rng As Range

Set rng = ThisWorkbook.Worksheets(1).Range("A1")
Debug.Print rng.Row

End Sub

実行結果

イミディエイトウィンドウにセル「A1」の行番号を出力します。

Columnプロパティ

セルの列番号の読み取り

Columnプロパティはセルの列番号を取得することができます。D列なら「4」AX列なら「50」が取得できます。読み取り専用です。

サンプルコード(クリックでコピー)

Private Sub Test_ColumnProperty()

Dim rng As Range

Set rng = ThisWorkbook.Worksheets(1).Range("AX1")
Debug.Print rng.Column

End Sub

実行結果

イミディエイトウィンドウにセル「A1」の行番号を出力します。

セルを操作するためのメソッド

Activateメソッド

指定したセルをアクティブにする

指定したセルへ操作対象を移します(アクティブにします)。

サンプルコード(クリックでコピー)

Private Sub Test_Activate()

Dim rng As Range

Set rng = ThisWorkbook.Worksheets(1).Range("B2")
Call rng.Activate

End Sub

上記のようなブック・シートを指定したセルに対して、別のシートを開いた(アクティブな)状態でActivateメソッドと後述するSelectメソッドを実行するとエラーが発生します。

実行結果

上記のサンプルを実行すると、セル「B2」がアクティブになります。

Selectメソッド

指定したセルを選択状態にする

指定したセルを選択状態にします。Activateメソッドとの違いは、Selectメソッドはマウスでセルをクリックする動作を模した機能であるという点です。例えば、範囲選択された状態で範囲内のセルをアクティブにしても範囲選択は解除されませんが、Selectだと範囲選択が解除されます。

サンプルコード(クリックでコピー)

Private Sub Test_Select()

Dim rng As Range

Set rng = ThisWorkbook.Worksheets(1).Range("B2")
Call rng.Select

End Sub

実行結果

上記のサンプルを実行すると、セル「B2」が選択状態になります。

Copyメソッド

セルのデータを別のセルへコピーする

メソッドは関数のようなもので、引数を必要とするものがあります。「Activate」「Select」は引数不要のメソッドでした。Copyメソッドは指定したセルの中身を引数で指定した別のセルへコピーします。

書式

Call セルを表すオブジェクト.Copy(Destination:=コピー先のセルを表すオブジェクト)

サンプルコード(クリックでコピー)

Private Sub Test_Copy()

Dim rng As Range

Set rng = ThisWorkbook.Worksheets(1).Range("B2")
rng.Value = 10000

Call rng.Copy(rng.Offset(0, 2))

End Sub

ActivateメソッドやSelectメソッドは別のシートを開いているとエラーになりましたが、Copyメソッドはセルの選択状態を変化させないので、別のシートを開いた状態で実行してもエラーになりません。

実行結果

上記のサンプルを実行すると、セル「B2」に値「10000」を入力したのち、セル「B2」から0行・+2列移動したセル(D2)にセル「B2」のデータをコピーしています。

Copyメソッドは「Ctrl」+「c」⇒「Ctrl」+「v」を押した時と同じ動作をします。そのため数式が入力されていれば数式がコピーされ、絶対参照($)を指定していなければ、移動先のセルに合わせて数式の内容が自動で書き変わります。

メソッドの実行について

メソッドの実行方法はいくつか種類がある

メソッドを実行するためにこの記事では「Call」を付けて引数を「()」で囲うようにしています。これは、私が最も可読性の高い書き方であると考えているためです。ここでCopyメソッドを例に、メソッドの呼び出し方のバリエーションについて説明します。

Call

戻り値がない関数やメソッドの実行に適しています。

サンプルコード(クリックでコピー)
Private Sub Test_CallCopy()

Dim rng As Range

Set rng = ThisWorkbook.Worksheets(1).Range("C3")
rng.Value = 10000

Call rng.Copy(rng.Offset(0, 2))
rng.Copy rng.Offset(2, 0)

End Sub
実行結果

「Call」を付けてもつけなくても実行結果は同じです。Callを付けない場合は、引数を「()」で囲う必要もありません。

引数の指定方法

引数(ひきすう)には必ず名前が付いています。複数の引数があり一部を省略することができる場合、指定したい引数だけをメソッドや関数に渡し、他の記述は省略できると便利です。Copyメソッドは下記のように「Destination」という名前の省略可能な引数を受け取ります。

引数の名前が「[](大カッコ)」で囲われていますが、これはこの引数が省略可能であることを表しています。

サンプルコード(クリックでコピー)
Private Sub Test_CopyArgument()

Dim rng As Range

Set rng = ThisWorkbook.Worksheets(1).Range("C3")
rng.Value = 10000

Call rng.Copy(Destination:=rng.Offset(-2, 0))
rng.Copy Destination:=rng.Offset(0, -2)

End Sub
実行結果

結果はこれまで同様です。セル「C3」のデータがコピーされます。

Copyメソッドは引数を一つしか持っていないでので引数名を指定するメリットをあまり感じませんが複数の省略可能な引数を持つメソッドに対して使用するとコードの可読性向上が見込めます。

ClearContentsメソッド

セルのデータをクリアします

ClearContentsメソッドはセルに入力されている値や式をクリアします。この時、書式設定などはそのままになります。この動きはExcelで「Delete」キーを押した動きと同じです。

書式

Call セルを表すオブジェクト.ClearContents

サンプルコード(クリックでコピー)

Public Sub Test_ClearContents()

Dim rng As Range
Set rng = ThisWorkbook.Worksheets(1).Range("C3")

rng.Value = "データ"
Call rng.Copy(rng.Offset(1, 1))
Call rng.ClearContents

End Sub

実行結果

上記のサンプルを実行すると、セル「C3」に値「データ」を入力したのち、その内容をセル「D4」へコピーします。最後にコピー元であるセル「C3」の値をクリアします。

ここでは解説しませんが、
 Clear     ・・・ 書式もふくめてすべてクリア
 ClearFormats ・・・ 書式のみクリア
というメソッドもあります。

Withステートメント

同じオブジェクトを繰り返し使用する場合の省略記法

たとえば、同じセルに対して複数の処理を適用する場合、なんどもオブジェクト名を記述していると・・疲れます。VBAにはそんなときのために省略記法が用意されています。Withステートメント(「With」~「End With」)内では、With句で指定したオブジェクト名を省略して記述することができます。

書式

With なにかオブジェクト
.メソッド
.プロパティ
End With

オブジェクト変数の省略

サンプルコード(クリックでコピー)
Public Sub Test_WithClearContents1()

Dim rng As Range
Set rng = ThisWorkbook.Worksheets(1).Range("C3")

With rng
.Value = "データ"
Call .Copy(.Offset(1, 1))
Call .ClearContents
End With

End Sub
実行結果

前項で使用した「ClearContents」のサンプルコードをWithステートメントを使用して書き直したものです。実行結果は同じです。Withステートメントで省略可能なものはオブジェクトです。変数「rng」はオブジェクトが格納された変数なので、省略することができます。

オブジェクトの省略

サンプルコード(クリックでコピー)
Public Sub Test_WithClearContents2()

With ThisWorkbook.Worksheets(1).Range("C3")
.Value = "データ"
Call .Copy(.Offset(1, 1))
Call .ClearContents
End With

End Sub
実行結果

先ほどはオブジェクト変数を省略しましたが、この長さのコードであればわざわざ変数を使用する必要もないかもしれません。今度はWith句に変数「rng」の代わりに「ThisWorkbook.Worksheets(1).Range(“C3”)」を直接指定しています。このコードの方が何を省略しているかわかりやすくなりました。実行結果は同じです。

読みやすさ(可読性)の向上にはまだ世の中に正解がありません。Withステートメントは便利な機能ですが、使うべき場面もあれば、使わなくていい場面もあります。都度、自身が記述したコードと向き合って考えましょう。

Deleteメソッド

セルのデータをクリアします

Deleteメソッドは指定したセルを削除します。Excelで右クリックして「削除(D)」を選んだ時の動作です。

書式

Call セルを表すオブジェクト.Delete(Shift:=削除後の動きを表す定数)

定数一覧

定数与えられた意味
xlToLeftセルを削除後、左方向にシフトする
xlShiftToLeftセルを削除後、左方向にシフトする(xlToLeftと同じ)
xlUpセルを削除後、上方向にシフトする
xlShiftUpセルを削除後、上方向にシフトする(xlToUpと同じ)

サンプルコード(クリックでコピー)

Public Sub Test_Delete()

Dim rng As Range
Set rng = ThisWorkbook.Worksheets(1).Range("C3")

Call rng.Delete(xlToLeft)

End Sub

実行結果

上記のサンプルを実行すると、セル「C3」を削除し、空欄のセルには右のセルが1列ずつ左にシフトしてきます。

Comment