VisualBasic for Applications (Microsofot Excel編)
第2回
はじめに
今回はシートを操作するWorksheetオブジェクトを使ってみます。あるシートを参考に別シートへコピーすることがよくあると思いますが、Worksheetオブジェクトを使えばこれが可能です。早速やってみましょう。
Worksheetオブジェクト
Worksheetオブジェクトはたくさんのプロパティとメソッドとイベントを持っています。
プロパティとはワークシートの設定に関するもので、名前を設定したり取得したり、表示(表示・非常時)を設定したり設定を取得したりできます。
メソッドとはオブジェクトが持っている命令のことで、アクティブにしたり削除したりコピーしたり動かしたりできます。
イベントとはユーザーがそのオブジェクトに対して行った動作を監視(?)して、その動作に対してVBAを実行させることができます。
ここではオブジェクトの詳しい内容についてはヘルプを参考にしてください。
シートをアクティブにしてみます。シートを選ぶには、シート名を指定する方法とシート番号で指定する方法があります。また、以下の方法ではアクティブBookが対象になります。
(例1)シート名Sheet1をアクティブにします。
Sub Test6( )
Worksheets("Sheet1").Activate
End Sub
(例2)1つめのシートをアクティブにします。
Sub Test7( )
Worksheets(1).Activate
End Sub
WorksheetとRangeオブジェクトを組み合わせて使用してみます。
(例3)1つめのシートのセル範囲A1:C3の値を2つめのシートのセル範囲A1:C3にコピーします。
Sub Test8( )
Worksheets(2).Range("A1:C3").Value=Worksheets(1).Range("A1:C3").Value
End Sub
WorksheetとRangeオブジェクトとCellsプロパティを使ってみます。少し複雑に見えますがよく見れば簡単です。
(例4)1つめのシートのセル範囲1行1列〜3行3列目の値を2つめのシートのセル範囲1行1列〜3行3列目にコピーします。
Sub Test9( )
Range(Worksheets(2).Cells(1,1),Worksheets(2).Cells(3,3)).Value=Range(Worksheets(1).Cells(1,1),Worksheets(1).Cells(3,3)).Value
End Sub
(例5)以下はエラーが発生する間違いの例です。Cellsを単体で指定するとあくまでアクティブシートのセルを指定することになるからです。
Sub Test10( )
Worksheets(2).Range(Cells(1,1),Cells(3,3)).Value=Worksheets(1).Range(Cells(1,1),Cells(3,3)).Value
End Sub
上記のコードは非常に見づらいのでRangeオブジェクト変数を使ってみやすくしてみます。(コードは長くなりますが・・・。)
(例6)例4と同じで1つめのシートのセル範囲1行1列〜3行3列目の値を2つめのシートのセル範囲1行1列〜3行3列目にコピーします。
Sub Test11( )
Dim My_Range1 As Range
Dim My_Range2 As Range
Set My_Range1 =
Range(Worksheets(1).Cells(1,1),Worksheets(1).Cells(3,3))
Set My_Range2 =
Range(Worksheets(2).Cells(1,1),Worksheets(2).Cells(3,3))
My_Range2.Value = My_Range1.Value
End Sub
更にWorksheetオブジェクト変数を使ってみます。(コードは長くなりますが・・・。)
(例7)例4・例6と同じで1つめのシートのセル範囲1行1列〜3行3列目の値を2つめのシートのセル範囲1行1列〜3行3列目にコピーします。
Sub Test12( )
Dim My_Ws1 As Worksheet
Dim My_Ws2 As Worksheet
Dim My_Range1 As Range
Dim My_Range2 As Range
Set My_Ws1 = Worksheets(1)
Set My_Ws2 = Worksheets(2)
Set My_Range1 = Range( My_Ws1.Cells( 1 , 1 ) , My_Ws1.Cells( 3 ,
3 ) )
Set My_Range2 = Range( My_Ws2.Cells( 1 , 1 ) , My_Ws2.Cells( 3 ,
3 ) )
My_Range2.Value = My_Range1.Value
End Sub
オブジェクト変数を使うとオブジェクトを違う名前であつかう事ができるので便利です。