【ExcelVBA】セルの操作
セルの操作
VBAからセルを操作するには、RangeまたはCellsを使います。
まずはRangeから使い方を見ていきましょう。
Range("A2") '' セルA2 Range("A2:B3") '' セル範囲A2:B3
括弧の中にセルのアドレスを指定することで、そのセル(もしくはセル範囲)を表すオブジェクトとなります。オブジェクトは第2回VBAの基本構文を参照してください。
次にCellsの使い方になります。
Cells(2, 1) '' セルA2
こちらはセルの行番号と列番号をカンマ区切りで指定することで、そのセルを表すオブジェクトとなります。1つ目の数値が行番号、2つ目の数値が列番号になります。
こちらの方法では、セル範囲を指定することはできません。やや高度な使い方になりますが、Cellsを使用してセル範囲を指定する場合には、Rangeと組み合わせる必要があります。
Range(Cells(2, 1), Cells(3, 2)) '' セル範囲A2:B3
Rangeの括弧の中にCellsが入れ子(ネスト)状態になっています。
「Range(“A2”)」と「Cells(2, 1)」はどちらもセルA2を表します。全く同じです。どちらを使っていただいても同じアドレスのセルオブジェクトを表すことになり、この後に紹介するプロパティは同様に使用することができます。
どちらの結果も同じセルを表すということは、実際にプログラムを作るときにはどちらを使用するか判断しなければいけません。その判断はどのように考えればいいのでしょうか。プログラムで「Aの次」と「1の次」を求めるには圧倒的に「1の次」の方がプラス1すればいいだけのため簡単です。「Aの次」を求めることも可能ですが少し工夫が必要になります。そのため「あるアドレスを計算によって求める」ケースではCells、「計算する必要がない」ケースではRangeを使用するという使い分け方法が1つの基準になります。
しかしこれはあくまでも1つの基準であり、ここでは紹介しませんが別の基準では逆のこともありえます。「どちらを使うことが正解」という明確な答えはありません。
Valueプロパティ
Valueはセルオブジェクトのプロパティで、使い方は2通りあります。
第4回でHelloWorldプログラムを作りました。ここからは実際に動作するプログラムを作っていきましょう。
VBEを起動しModule1を表示します。前回作成したプログラムの下に次のプログラムを入力してください。
※Subの中にSubを記載しないように気を付けてください。「End Sub」の後に入力してください。
1.セルに値を設定する
Sub VBA基礎第5回_1() Range("A2").Value = "VBA基礎" End Sub
このようにValueプロパティの後ろに「=」、その後ろに設定したい値をダブルクォーテーションで囲んで指定します。
実行して頂くと次のようにセルA2に「VBA基礎」と設定されるはずです。このような「=」を使った構文を代入式と呼びます。数学では「=」記号は右辺と左辺の値が等しいことを表しましたが、プログラムの世界ではこのように右辺の値を左辺に設定する(=代入する)という意味となります。
繰り返しプログラムを実行してみてください。何度実行してもセルA2に表示されている値は変化がないはずです。これは、プログラム実行する前に既に「VBA基礎」が設定されてしまっているので、プログラムの実行結果と差異がない(=変化がないように見える)ということになります。変化を再度確認したい場合には、セルA2の値をクリアしてから再度プログラムを実行する必要があります。
2.セルの値を取得する
Sub VBA基礎第5回_2() Debug.Print Range("A2").Value End Sub
代入式にせずにValueプロパティを使用するとそのセルの値を取得することができます。
このようにDebug.Printの後ろに「Range(“A2”).value」を指定します。ダブルクォーテーションの位置に注意してください。このように複数の処理が1行で記述されている場合は基本的に左から順に見ていきます。そしてDebug.Printの引数にさらにRangeが記載されているので、引数の中を先に実行(処理)していきます。
処理の流れを表すと以下のようになります。
Debug.Print Range("A2").Value ↓ Debug.Print "VBA基礎" ↓ イミディエイトに「VBA基礎」が表示
1行の中にこのように2つ以上の処理をいれてることはとてもよく使うテクニックですので徐々になれていきましょう。どのような順で処理されていくのかを意識していくことが大切です。
Copyメソッド
セルをコピーする場合はCopyメソッドを使用します。
書式は次のようになります。
[コピー元].Copy Destination:=[コピー先]
Copyはセルオブジェクトのメソッドなので、コピー元にはRangeかCellsを使います。Destination引数にコピー先を指定します。こちらもセルオブジェクトです。
使用例は次のようになります。今回はRangeを使ってみます。
Sub VBA基礎第5回_3() Range("A2").Copy Destination:=Range("C2") End Sub
実行結果は次のようになります。
[005-【ExcelVBA】セルの操作-002.png]このCopyメソッドは、Excel上でのコピー&ペーストと同じと思っていただいて構いません。今回はコピー元のセルに値が入っているだけでしたが、書式や罫線が設定されていればそれも含めてコピーされます。
宿題
1.B2からC4のセル範囲をRangeを用いて表現してみましょう。
2.1の範囲をCells(とRange)を用いて表現してみましょう。
3.1の範囲をE2からF4にコピーしてみましょう。