勝手に初心者講座。パートのおばさんにもできたんだからあなたにもできる!やってみよう!VBA!
前回はよーーく使う基本構文をやりました。
VBAをやっていくと、別のシート、別のファイルに絡む操作をしたくなります。業務で使うVBAの場合、必ずといっていいほどその必要が出てくるでしょう。
今回は、別のシートの操作をするVBAを書いてみましょう!
■シートを操作するコードを書いてみよう
前回使った点数ファイルを使って、別のシートを操作するVBAを書いてみましょう。
①1シート目をコピーする
②コピーしたシートのシート名を4-6回に変更する。表内をクリアする。
③1シート目のシート名を1-3回に変更する。表内をクリアする。
シートをコピーし、シートを指定し各シートで各種操作をする内容です。
「シート操作」というプロシージャを作成し、以下のように記述します。
最初の行から順番に解説します。
Worksheets(1).Copy After:=Worksheets(1)
シート1をコピーしてシート1の後ろに挿入するという文です。
ActiveSheet.Name = “4-6回”
アクティブなシートの名前を「4-6回」にします、という文です。
コピーしたシートは操作直後にアクティブシートになります。
コピーしたシートは1シート目の後ろに挿入したので2シート目になるので、
WorkSheets(2).Name = “4-6回”
と書いても同じです。
ActiveSheetは単数形ですが(最後にsが付かない)「2番目のシート」と指定するWorkSheets(2)はワークシートの複数形になっていることに気が付きましたか?
指定するシートは単体ですが、「複数あるワークシート(=
WorkSheetsコレクション)のうち2番目のシート」と指定するためWorkSheets(2)と複数形になります。
ActiveSheet.Range(“B2:D6”).ClearContents
アクティブシートのセル範囲B2~D6の値をクリアします。
ActiveSheet.Range(“B2:D6”).Interior.ColorIndex = 0
アクティブシートのセル範囲B2~D6の塗りつぶしを「塗りつぶしなし」にします。
WorkSheets(1).Name = “1-3回”
コピー元の1シート目のシート名を「1-3回」とします。
さて、動かしてみましょう。ちゃんとシートがコピーされましたでしょうか?
■Withを使ってみよう
さて、うごいてやれやれ、ですが、もっと素敵なコードに修正してみましょう。
Withステートメントを使ってみましょう。
Withステートメントを使うと、操作対象となるオブジェクトを省略できます。ひとつの操作対象(オブジェクト)でいくつかの処理をしたいときに便利な書き方です。
上の赤枠内はすべてアクティブシートについて書かれています。
アクティブシートの名前を「4-5回」にする
アクティブシートのセル範囲B2~D6の値をクリアする
アクティブシートのセル範囲B2~D6の色を塗りつぶしなしにする
これをWithステートメントでまとめると
Withの後に対象となるオブジェクトを書き、End With で終わります。その間オブジェクト名を省略できますので、オブジェクトを省略しピリオドからコードを書きます。
アクティブシートの名前を「4-5回」にする
アクティブシートのセル範囲B2~D6の値をクリアする
アクティブシートのセル範囲B2~D6の色を塗りつぶしなしにする
としつこい書き方だったものを
アクティブシートの
名前を「4-5回」にし、
セル範囲B2~D6の値をクリアし、
セル範囲B2~D6の色を塗りつぶしなしにする
アクティブシートに関する記述終わり
という書き方に変えた感じ。
なお、セル範囲B2~D6もかぶっているので、Withを入れ子にして書くこともできます。
With ActiveSheet
.Name = “4-5回”
With .Range(“B2:D6”)
.ClearContents
.Interior.ColorIndex = 0
End With
End With
セル範囲を指定するのにRange(“B2:D6”)のほかにCellsを使って書くこともできますと前回書きました。
WorkSheets(1)のRange(“B2:D6”)をCellsを使って書くと以下のようになります。
WorkSheets(1).Range(WorkSheets(1).Cells(2,2), WorkSheets(1).Cells(6,4)).ClearContents
むむむ!変数を使ってセル範囲を指定するときにCellsは便利ですがさすがにこんな長ったらしいのはいやですね!
Withを使うことですっきりかけます。
With WorkSheets(1)
.Range(.Cells(2,2), .Cells(6,4)).ClearContents
End With
WorkSheets(1)を省略したRange、Cellsの前にはピリオドがつきます。特にCellsの前のピリオドを忘れがちになるのでご注意ください(私はよく忘れてエラーになるので・・・)
Withは使っても使わなくてもよいのですが、処理速度が向上するそうですし、可読性もよくなるので使う場面が出てきたらWithを思い出してみてください。
■ざっくり、オブジェクトを意識したVBAの書き方について
VBAをやっていると「オブジェクト」「プロパティ」「メソッド」等という言葉をよく見かけます。
オブジェクトとは操作される対象。ワークシートやブック、セルなどの、なんとなく一言で言うと「モノ」みたいな感じのものです。
プロパティとはオブジェクトが持つ「状態・様子」といった感じです。
オブジェクトとプロパティをピリオドでつなぎ、オブジェクト.プロパティ=〇〇と書きます。
メソッドとはオブジェクトに対する動作を指定するものです。
対象(オブジェクト)に対する命令という感じです。
オブジェクトとメソッドをピリオドでつないで書きます。
オブジェクト.メソッド 引数1:=〇〇, 引数2:=△△ といった書き方もします。
引数は動作をより詳しく記述するものです。「どのように」動け、の「どのように」の部分です。
例えば、山田.眠れ だと、山田(オブジェクト)に眠れと命令していますがいまいち指示があいまいで、どのくらい寝てていいのかわかりません。その場で30分の昼寝でも、家で12時間爆睡でも。
引数を使って家で6時間寝て来いと細かく指示を出しましょう。
山田.眠れ 場所:=家, 時間:=6時間
と、引数を使うと細かい指示付きの命令が書けます。
上の例のシートコピーでも引数を使っています。
さて、だいぶ話が膨らんでしまいましたがこの会はこれで終わりです。
最後までお読みいただきありがとうございました。
次回はVBAのファイル操作編を予定しています。
☆おさらい☆こんなことをやりました
・シートを操作するコードの書き方
・ワークシートの指定方法
・Withの使い方
・オフジェクトとは「操作される対象」
・プロパティとはオブジェクトの「状態・様子」
・メソッドとはオブジェクトに対する「命令」
・メソッドの引数とは「命令」に「どのように」を付け加えるもの
やってみよう!VBA!シリーズ
コメント