第7講 結果を報告しない社員
第3話 箱の利用範囲

2013
Private Sub CommandButton1_Click()
  Dim w As Long, i As Byte
  wa
  seki
End Sub
Private Sub CommandButton2_Click()
  Rows("6:200").Select
  Selection.ClearContents
  Cells(1, 1).Select
End Sub
Sub wa()
  w = 0
  For i = 1 To 10
    w = w + i
  Next
  Cells(6, 1) = "1から10までの和"
  Cells(6, 3) = w
End Sub
Sub seki()
  w = 1
  For i = 1 To 10
    w = w * i
  Next
  Cells(7, 1) = "1から10までの積"
  Cells(7, 3) = w
End Sub
さて、何が問題でしょうか。
ヒントをいうと、
  Dim w As Long, i As Byte
は全く意味をなしていません。
ここで用意した箱wと箱iは一度も使っていないからです。
『えっ?、そんなことないでしょう。
Sub wa()
  w = 0
  For i = 1 To 10
    w = w + i
  Next
  Cells(6, 1) = "1から10までの和"
  Cells(6, 3) = w
End Sub
Sub seki()
  w = 1
  For i = 1 To 10
    w = w * i
  Next
  Cells(7, 1) = "1から10までの積"
  Cells(7, 3) = w
End Sub
で使っているでしょうって?』
いえいえ、
Private Sub CommandButton1_Click()
  Dim w As Long, i As Byte
  wa
  seki
End Sub
の箱wと箱iは一度も使われていません。
どういうことでしょうか。

実はとても重要な話です。
箱の使える範囲は、
入門
赤で囲んである範囲のみなのです。
つまり、社員CommandButton1が作った箱は、
社員CommandButton1しか使えず、
他の社員waと社員sekiは使えないのです。
ですから、同様なプログラムではC言語やJavaではエラーします。
社員waにおいても社員sekiにおいても変数の宣言
(名前のついた箱を作る)がないからです。
VBAの場合は、変数の宣言がない場合自動的に
バリアント型(Variant型、バリアント型は最も大きな箱でその容量は16バイトです。)の箱を用意してくれるので、
エラーしなかっただけなのです。
つまり、見かけは箱wは1つしかないようですが、
実際にはLong型の箱1つとVariant型の箱2つの3つの箱が使われています。
同名であっても、CommandButton1の箱wとwaの箱wとsekiの箱wは別の箱です。
4バイトの箱wが1つと16バイトの箱が2つ存在するのです。
変数の適用範囲は、そのプロシージャ(社員)内に限るわけです。
かつてのBASICでは、変数の適用範囲はプログラム内すべてに及びましたので、
社長が箱を作って箱の中に貴重なデータを入れておいても、
社員が勝手に箱の中身を変えることができました。
しかし、Quick Basicの頃から箱はプロシージャ内でしか使えないようにしたのです。
そうすると箱の中身が他の社員(プロシージャ)によって変えられる心配がなくなりました。
つまり、社員が用意した箱はその社員専用のもので他の社員は触る事さえできません。
触ることができないというのは、
箱の中身を勝手に変えたり、箱の中を覗いたり(参照したり)ができないということです。
VBAでも箱は、その箱を作った社員専用です。
つまり、変数の適応範囲はプロシージャ内なのです。
他のプロシージャが同名の箱を宣言しても、それは別の箱です。

なぜ、同名であればどこでも使えたものになぜ制限を加えたのでしょうか。



第2話へ 第4話へ

トップ

vc++講義へ

初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義へ
VB講義基礎へ
初心者のためのJava 入門 基礎から応用まで
数学研究室に戻る