VBA入門コース(全8回)その8

ゼミ資料:1999.11.9作成;2001.5.24修正


課題:オブジェクト


1. オブジェクト

オブジェクトとは?

ロボットなどの「物」をコンピュータで制御するために,「物」をプログラムの中でイメージ化したのがオブジェクトである.プログラムの中ではオブジェクトが何らかの操作の対象となる.「物」とオブジェクトは,「物」の状態が変化するとオブジェクトの状態も変化し,オブジェクトを操作すると「物」の状態が変化するという関係にある.

Excel内のVBAでは,ブック,ワークシート,セルといったものがオブジェクトとして用意されており,次のような名称が付けられている.

これらオブジェクトを使いこなすことで,ワークシート上の多彩な操作をプログラムの中に取り入れることができる.

プロパティとは?

オブジェクトが持つ性質や特性をプロパティという.例えば,ロボットを表わすオブジェクトのプロパティとしては,大きさや重さ,現在位置などが考えられる.プロパティは次のような方法で変数のように値を取得(参照)したり,値を代入したりできる.

変数名 = オブジェクト.プロパティ  ' 変数にプロパティの値を代入
オブジェクト.プロパティ = 値または式  ' プロパティに値を代入

例:x = Robot.Color ' 変数 x にロボットの色を代入

メソッドとは?

オブジェクトに対する操作をメソッドという.例えば,ロボットを表わすオブジェクトに対するメソッドとしては,前進や回転などが考えられる.メソッドは次のような方法でSubプロシージャのように記述・使用される.

オブジェクト.メソッド メソッドの条件

例:Robot.Advance "2m" ' ロボットを 2m 前進させる


2. セルを表わすオブジェクトとその使い方

セルの持つ値の取得やセルへの値の代入はどのように行うのか?

セルの持つ値を表わすプロパティは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 を代入

3. 例題プログラム

プログラムの目的を決める.
毎年預けるお金を追加していった場合の元利合計を求める.入出力はワークシート上で行う.7回目の資料の例題プログラムで示したプログラム(interest2_mainとmoney21)を修正して作成する.

ワークシート上の表示イメージを決める.
全体のレイアウト,特に,入力数値を入れておくセルと結果を表示するセルの位置(セル番地)を決める.
A B
1 毎年新たに預けるお金を追加した場合の元利合計  
2 毎年新たに預ける金額(円) セルB2
3 継続期間(年) セルB3
4 利子率(%) セルB4
5 元利合計(円) セルB5

プログラムの階層化構造とモジュール名,引き数を決める.
7回目の資料の例題プログラムで示したプログラムと同じ階層化構造とする.メインプログラムはinterest2_mainを修正し,interest2_objというモジュール名を付けて用いる.関数money21はそのまま用いる.

interest2_objの処理のおおまかな流れを決める.

  1. 開始
  2. ワークシートから入力変数を取得
  3. 関数money21を用いて元利合計を計算
  4. ワークシートに元利合計の計算結果を表示
  5. 終了

処理の要となる変数と,その名前,データ型を決める.

x As Double: 毎年新たに預ける金額
n As Integer: 継続期間
r As Double: 利子率
y As Double: 元利合計

処理の詳細を決める.

  1. 開始
  2. ワークシートから入力変数を取得
    → x はセルB2から,n はセルB3から,y はセルB4から入力する.
  3. 関数money21を用いて元利合計を計算
  4. ワークシートに元利合計の計算結果を表示
    → y はセルB5に表示する.
  5. 終了

プログラムを書く.

  1. 開始
  2. ワークシートから入力変数を取得
    '*** ワークシートからデータを入力
    x = Range("B2").Value  ' 毎年新たに預ける金額
    n = Range("B3").Value  ' 継続期間
    r = Range("B4").Value  ' 利子率
    
  3. 関数money21を用いて元利合計を計算
  4. ワークシートに元利合計の計算結果を表示
    '*** ワークシートへ結果を表示
    Range("B5").Value = y
    
  5. 終了

実行してみる.
ワークシートに以下のような表を作成してからプログラムを実行し,セルB5に231と表示されることを確かめる.
A B
1 毎年新たに預けるお金を追加した場合の元利合計  
2 毎年新たに預ける金額(円) 100
3 継続期間(年) 2
4 利子率(%) 10
5 元利合計(円) セルB5


4. もうひとつの例題プログラム

毎年同じ金額を追加していった場合について,経年毎の元利合計を求めるプログラム:入出力にワークシートを利用

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. 練習問題8

毎年同じ額の収益が期待できるプロジェクトについて,各年までの総収益の割引現在価値を求めるプログラム:入出力にワークシートを利用

5回目の資料の練習問題5で作成したプログラム present2 を以下のように修正したプログラムを上の応用例を参考にして作れ.ただし,プログラム名(Subプロシージャ名)は present3 とせよ.


6. 構文のまとめ

Rangeプロパティ
Offsetプロパティ
Valueプロパティ(その1)
Valueプロパティ(その2)

7. プログラムのまとめ

毎年預けるお金を追加した場合の元利合計の計算プログラム:入出力にワークシートを利用

ワークシート上の表のイメージ

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回目の資料の例題プログラムと同じなので省略