このページの内容について
このページは、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プロパティは特別なプロパティで、省略して記述することが認められています。さきほどのサンプルを省略記法で書き直してみます。
サンプルコード(クリックでコピー)
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
実行結果(省略版)
上記サンプルコードを実行すると前述の結果とまったく同じ結果になります。
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
Text
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
実行結果
セルの状態を取得するプロパティ
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
実行結果
上記のサンプルを実行すると、セル「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
実行結果
上記のサンプルを実行すると、セル「B2」に値「10000」を入力したのち、セル「B2」から0行・+2列移動したセル(D2)にセル「B2」のデータをコピーしています。
メソッドの実行について
メソッドの実行方法はいくつか種類がある
メソッドを実行するためにこの記事では「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」のデータがコピーされます。
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」の値をクリアします。
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”)」を直接指定しています。このコードの方が何を省略しているかわかりやすくなりました。実行結果は同じです。
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