VBAでは,Excelで使用されるワークシートやセルなどを総称してオブジェクトと呼んでいる.VBAではこれらオブジェクトを操作したり,オブジェクトの属性を変更することができる.すなわち,オブジェクトを操作したり,オブジェクトの属性を変更することでいろいろな処理を自動化,プログラミングすることができる.
オブジェクトは,プロパティ(属性)とメソッド(操作)から構成されている.属性とはオブジェクトが持つ値や性質のことである.例えば,Excelのセルは、数値の「3」とか文字列の「授業」といった値(データ)を持っているが,その他にもセルの幅,高さ,フォントの種類などといった性質も持っている.これらのことをプロパティとよぶ.また,オブジェクトは,それ自身を操作することができる.それをメソッドとよぶ.例えば,セルをクリップボードにコピーするという操作は,コピー対象のセル自身が持っており,その操作を呼び出すことで,コピーという動作が実行される.
VBAでは,オブジェクトのプロパティは変数のように振舞い,オブジェクトのメソッドは関数のように振舞う.オブジェクトが名前で識別されるように,プロパティやメソッドも名前で識別される.それぞれの使い方は以下のようになる.
オブジェクト.プロパティ
オブジェクト.メソッド
また,VBAでオブジェクトを変数として利用するためには,オブジェクト型の変数を宣言し,その変数に値を設定しなければならない.オブジェクト型の変数の宣言,およびオブジェクト型変数への値の設定は以下のようになる.
Dim 変数名 As Object
Set 変数名 = メソッド
------------------------------------------------------------
Sub sample1()
Dim targetRange As Object
Set targetRange = Range("Sheet1!A1")
targetRange.Value = "値"
End Sub
------------------------------------------------------------
この例題では,targetRangeという名前の変数を宣言し,その変数にセルを設定している.Range("Sheet!A1")
とは現在開いているブックの「Sheet1」という名前のシートの「A1」というセル(オブジェクト)を返すメソッドである.つまり,targetRangeにはSheet1のA1セルが格納さえている.そしてそのセルの「Value」というプロパティに「値」を代入している.Valueプロパティはそのセルが保持している値である.従って,このプロシージャはA1セルに「値」という文字列を格納する.
------------------------------------------------------------
Sub sample2()
Range("Sheet1!B1:C1").Value = Application.InputBox("数値を入れてください")
End Sub
------------------------------------------------------------
VBAではオブジェクトを変数に格納しなくても,メソッドを呼び出したり,プロパティを変更することができる.この例題では,変数を使わない例を示している.Range("Sheet!B1:C1")
とは現在開いているブックの「Sheet1」という名前のシートの「B1:C1」というセル範囲で示されるセル(オブジェクト)を返すメソッドである.それらのセルの値にApplication.InputBox
の返値を代入している.
------------------------------------------------------------
Sub sample3()
Dim targetRange As Object
Dim i As Integer
Set targetRange = Range("Sheet1!A1:A10")
For i = 2 To 10
targetRange.Cells(i, 1).Value = i - 1
Next i
End Sub
------------------------------------------------------------
Rangeメソッドは複数のセルの集合を返すことができる.このように複数のセルの集合を表すオブジェクトに対してその集合の中の特定のセルを指定する場合には,Cells
メソッドを用いる.このメソッドの第一引数は行番号を表し,第二引数は列番号を表す.この例題では,始めに複数のセル集合を変数に格納し,そのセル集合の各々に順番に値を格納するプロシージャである.
------------------------------------------------------------
Sub sample4()
Dim targetRange As Object
Dim i As Integer
Set targetRange = Range("Sheet1!A1:B10")
For i = 2 To 10
targetRange.Cells(i, 2).Value = targetRange.Cells(i, 1).Value _
* targetRange.Cells(1, 2).Value
Next i
End Sub
------------------------------------------------------------
プロパティは代入するだけではなく,参照することもできる.この例題ではすでに値が格納されているセルの値を用いて新たにセルの値を定めている.
------------------------------------------------------------
Sub sample5()
Range("Sheet1!C2:C10").Formula = "=A2*C$1"
End Sub
------------------------------------------------------------
例題4ではすでに格納されているセルの値を参照し,VBAで値を計算し,その結果をセルに格納していた.Excelではセル自身に他のセルを参照する計算式を格納することで,他のセルを参照した計算値を入れることができる.セルに格納されている計算式はFormulaプロパティで参照できる.
例題1,例題2,例題3,例題4,例題5を順に実行すると,どのワークシートにどんな表ができるのか,説明せよ.
例題1,例題2,例題3,例題4,例題5 を順に実行した時の表を表Aとする.表Aができた後,例題2を実行する(ただし例題2の2回目の実行では1回目の実行で入力した値とは異なる値を入力すること).この時以下の問に答えよ
例題2のプロシージャのプログラムは表のどの部分を書き換えるのか?
それ以外にどの部分の値が変化したか?
変化した部分と変化しなかった部分とができた理由は何か?
例題1から4および手引書などを参考にして,ワークシートSheet2に九九段の表を作成するプロシージャを作成せよ.プロシージャ名はexam3とすること.Sheet2の内容が全てクリアされている状態で、このプロシージャを呼び出して九九のかけ算表が作成されることを確認せよ.
Excel上で繰り返し同じ作業を行う場合,マクロにしておくと便利である.しかし,そのマクロを今まで学習したプログラミングで記述するのは大変である.Excelには,自分が行なった操作をマクロとして記録する機能がある.記録されたマクロは自分で作成したプログラムと同様に編集することができる.
マクロを記録するには,[ツール]メニューの[マクロ]から,[新しいマクロの記録]を選ぶ.「マクロの記録」ダイアログボックスが表示されるので,記録するマクロ名やマクロの保存先などを決め,[OK]ボタンを押す.自動化したい処理を行ったのち,[ツール]メニューの[マクロ]から[記録停止]を選ぶ.
ワークシートsheet3がアクティブになっている状態で、以下の操作をマクロに記録する.マクロ名はexam4とする.
A1にAを,B1に1を,C1に1を書き込む.
A2にBを,B2に2を,C2に3を書き込む.
A1からC2までをマウスでドラッグして選択状態にする.
選択範囲の右下にポインタを移動すると,ポインタが「+」に変わる.そのままマウスの左ボタンを押しながらC10までドラッグする(A3からC10まで値が自動的に書き込まれる).
セルの選択状態はそのままツールバーにある「グラフボタン」を押し、棒グラフを作成する(種類は自由とする).ただし,グラフは別のシートとする.
新たに作成されたグラフシートを削除して、Sheet3の内容をクリアした後、記録したマクロを実行したら、表とグラフが作成されることを確認すること.
例題1,例題2,例題3,例題4,例題5 および問3,問4の作業を1つのExcalファイルで行い,そのExcelファイルを電子メールに添付すること.電子メールの本文には,問1と問2の解答を書くこと.
提出期限 | 2003年11月25日午前10時 | |
---|---|---|
宛先 | akira-report-09@ipe.tsukuba.ac.jp | 佐藤 |
件名 | Report 09 | 全て半角で入力 |
CC | 自分のアドレス | 自分にもメールが届く |
電子メール以外での提出は採点対象にならない.
授業のページに戻る
第8回のページへ戻る
第10回のページへ進む