ロボットなどの「物」をコンピュータで制御するために,「物」をプログラムの中でイメージ化したのがオブジェクトである.プログラムの中ではオブジェクトが何らかの操作の対象となる.「物」とオブジェクトは,「物」の状態が変化するとオブジェクトの状態も変化し,オブジェクトを操作すると「物」の状態が変化するという関係にある.
Excel内のVBAでは,ブック,ワークシート,セルといったものがオブジェクトとして用意されており,次のような名称が付けられている.
これらオブジェクトを使いこなすことで,ワークシート上の多彩な操作をプログラムの中に取り入れることができる.
オブジェクトが持つ性質や特性をプロパティという.例えば,ロボットを表わすオブジェクトのプロパティとしては,大きさや重さ,現在位置などが考えられる.プロパティは次のような方法で変数のように値を取得(参照)したり,値を代入したりできる.
変数名 = オブジェクト.プロパティ ' 変数にプロパティの値を代入 オブジェクト.プロパティ = 値または式 ' プロパティに値を代入
例:x = Robot.Color ' 変数 x にロボットの色を代入
オブジェクトに対する操作をメソッドという.例えば,ロボットを表わすオブジェクトに対するメソッドとしては,前進や回転などが考えられる.メソッドは次のような方法でSubプロシージャのように記述・使用される.
オブジェクト.メソッド メソッドの条件
例:Robot.Advance "2m" ' ロボットを 2m 前進させる
セルの持つ値を表わすプロパティはValueプロパティである.値の取得や代入はプログラム中で次のように記述する.
変数名 = セルを表わすオブジェクト.Value ' セルの持つ値の取得 セルを表わすオブジェクト.Value = 値または式 ' セルへの値の代入
セルを表わすオブジェクトを指定(取得)する基本的なプロパティはRangeプロパティである.RangeプロパティはRange("セル番地")のようにセル番地を指定してセルを取得する.これを上記のセルを表わすオブジェクトに当てはめれば次が得られる.
変数名 = Range("セル番地").Value ' セル番地を用いた値の取得 Range("セル番地").Value = 値または式 ' セル番地を用いた値の代入
あるセルを基準とした相対位置でセルを取得するプロパティはOffsetプロパティであり,
基準となるセル.Offset(行の相対位置, 列の相対位置)
のように記述して用いる.基準となるセルはRange("セル番地")で指定(取得)する.行の相対位置,列の相対位置は整数で表わす.例えば,Offset(2,5)は下に2つずらし(行番号が2大きくなる),右に5つずらす(列番号が5大きくなる)ことを表わす.以上をまとめると,Offsetプロパティを用いた相対参照による値の取得や代入は次のようになる.
変数名 = Range("セル番地").Offset(行の相対位置, 列の相対位置).Value ' 相対セル番地を用いた値の取得 Range("セル番地").Offset(行の相対位置, 列の相対位置).Value = 値または式 ' 相対セル番地を用いた値の代入
例:
x = Range("A1").Value ' x に番地 A1 のセルの値を代入 Range("A1").Value = "テスト" ' 番地 A1 のセルに "テスト" を代入 Range("A1").Offset(0,0).Value = 10 ' 番地 A1 のセルに 10 を代入 Range("A1").Offset(1,1).Value = 10 ' 番地 B2 のセルに 10 を代入 Range("A1").Offset(2,3).Value = 10 ' 番地 D3 のセルに 10 を代入 Range("B2").Offset(-1,-1).Value = 10 ' 番地 A1 のセルに 10 を代入
プログラムの目的を決める.
毎年預けるお金を追加していった場合の元利合計を求める.入出力はワークシート上で行う.7回目の資料の例題プログラムで示したプログラム(interest2_mainとmoney21)を修正して作成する.
ワークシート上の表示イメージを決める.
全体のレイアウト,特に,入力数値を入れておくセルと結果を表示するセルの位置(セル番地)を決める.
A | B | |
1 | 毎年新たに預けるお金を追加した場合の元利合計 | |
2 | 毎年新たに預ける金額(円) | セルB2 |
3 | 継続期間(年) | セルB3 |
4 | 利子率(%) | セルB4 |
5 | 元利合計(円) | セルB5 |
プログラムの階層化構造とモジュール名,引き数を決める.
7回目の資料の例題プログラムで示したプログラムと同じ階層化構造とする.メインプログラムはinterest2_mainを修正し,interest2_objというモジュール名を付けて用いる.関数money21はそのまま用いる.
interest2_objの処理のおおまかな流れを決める.
処理の要となる変数と,その名前,データ型を決める.
処理の詳細を決める.
プログラムを書く.
'*** ワークシートからデータを入力 x = Range("B2").Value ' 毎年新たに預ける金額 n = Range("B3").Value ' 継続期間 r = Range("B4").Value ' 利子率
'*** ワークシートへ結果を表示 Range("B5").Value = y
実行してみる.
ワークシートに以下のような表を作成してからプログラムを実行し,セルB5に231と表示されることを確かめる.
A | B | |
1 | 毎年新たに預けるお金を追加した場合の元利合計 | |
2 | 毎年新たに預ける金額(円) | 100 |
3 | 継続期間(年) | 2 |
4 | 利子率(%) | 10 |
5 | 元利合計(円) | セルB5 |
5回目の資料の例題プログラムで作成したプログラム interest2 を,経年毎の元利合計を表示するプログラムに変更する.入出力にはワークシートを用いる.ワークシート上の表のイメージは以下である.
A | B | |
1 | 毎年新たに預けるお金を追加した場合の元利合計 | |
2 | 毎年新たに預ける金額(円) | セルB2 |
3 | 継続期間(年) | セルB3 |
4 | 利子率(%) | セルB4 |
5 | 元利合計(円) | |
6 | 1年目 | セルB6 |
7 | 2年目 | セルB7 |
... | ... | ... |
n+5 | n年目 | セルBn+5 |
この表のイメージを元にしたプログラムは次のようになる.
Sub interest3() '*** '* 毎年預けるお金を追加した場合について,経年毎の元利合計を計算するプログラム '* 入出力にワークシートを使用 '* '* x: 毎年新たに預ける金額(円) '* n: 継続期間(年) '* r: 利子率 (%) '* y: 元利合計(円) '* i: 制御変数 '*** Dim x As Double, r As Double, y As Double Dim n As Integer Dim i As Integer '*** ワークシートからデータを入力 x = Range("B2").Value ' 毎年新たに預ける金額 n = Range("B3").Value ' 継続期間 r = Range("B4").Value ' 利子率 '*** 経年毎の元利合計を計算し,ワークシートへ表示 y = 0 ' 元利合計の初期値をゼロにする. For i = 1 To n y = (y + x)*(1+r/100) ' 前年末の元利合計に今年の預け入れ金を加え,(1+r/100) 倍することで ' 今年末(i 年目末)の元利合計を計算. Range("A5").Offset(i, 0).Value = i & "年目" ' ワークシートに "i 年目" と表示. Range("B5").Offset(i, 0).Value = y ' ワークシートに i 年目の元利合計を表示. Next End Sub
5回目の資料の練習問題5で作成したプログラム present2 を以下のように修正したプログラムを上の応用例を参考にして作れ.ただし,プログラム名(Subプロシージャ名)は present3 とせよ.
Range("セル番地")
Range("セル番地").Offset(行の相対位置,列の相対位置)
変数名 = Range("セル番地").Value 変数名 = Range("セル番地").Offset(行の相対位置,列の相対位置).Value
Range("セル番地").Value = 値または式 Range("セル番地").Offset(行の相対位置,列の相対位置).Value = 値または式
ワークシート上の表のイメージ
A | B | |
1 | 毎年新たに預けるお金を追加した場合の元利合計 | |
2 | 毎年新たに預ける金額(円) | セルB2 |
3 | 継続期間(年) | セルB3 |
4 | 利子率(%) | セルB4 |
5 | 元利合計(円) | セルB5 |
プログラム
Sub interest2_obj() '*** '* 毎年預けるお金を追加した場合の元利合計の計算プログラム: '* 入出力にワークシートを使用(メインプログラム) '* '* x: 毎年新たに預ける金額(円) '* n: 継続期間(年) '* r: 利子率 (%) '* y: 元利合計(円) '* '* 使用するFunctionプロシージャ: money21 '*** Dim x As Double, r As Double, y As Double Dim n As Integer '*** ワークシートからデータを入力 x = Range("B2").Value ' 毎年新たに預ける金額 n = Range("B3").Value ' 継続期間 r = Range("B4").Value ' 利子率 '*** 元利合計の計算 y = money21(x, n, r) '*** ワークシートへ結果を表示 Range("B5").Value = y End Sub Function money21(x As Double, n As Integer, r As Double) As Double 7回目の資料の例題プログラムと同じなので省略