jump to navigation

スタティックとダイナミック、グローバルとローカル 2012/08/12

Posted by dbot in VBAのメモ.
trackback

VBAのメモ
ただし、Execl2000、VB6.0、参考資料VBforExecl97用

ループ内でさらにループしたり、巨大If文にさらにIf文とか、
もう我慢するしかないとおもったら、プロシージャ間で変数を共有できるようです。

 

スタティックとダイナミック、グローバルとローカル

VBの変数は宣言をしなければダイナミックでローカルな変数。
VBの変数は宣言が無ければそのプロシージャ内でしか使わない(ローカル)変数であり、
プロシージャを呼び出した時に、各変数領域の確保を行い(ダイナミック)、
プロシージャの終了時、領域は開放されます。
再度そのプロシージャを呼び出した時に、その変数は前回の値を保持していません。
同じ変数名を別のプロシージャで使用しても別の変数として別の領域が確保されます。

VBのプロシージャから別のプロシージャを呼び出し処理を行わせる為に
下位のプロシージャは引数を定義し、上位のプロシージャは呼び出し時、プロシージャ名と引数に該当する変数名を記述します。
下位のプロシージャは上位(呼び元)の変数領域を使用し値の引継ぎを行います。多分w

スタティック変数
プロシージャが終了しても、領域を開放しない変数。再度呼び出された時に前回の値が保持される。
①変数の定義としてスタティック宣言をする。(⇔Dim文)
Sub(またはFunction) プロシージャ名(引数リスト)
Staitc 変数名

End Sub(またはFunction)

②プロシージャの定義としてスタティックを宣言する。
Staitc Sub プロシージャ名(引数リスト)

End Sub

Staitc Function プロシージャ名(引数リスト)

End Function
この宣言をしたプロシージャ内の変数はすべてスタティック変数として扱われる。

スタティック変数はローカル変数。別のプロシージャで同じ変数名を使用しても別の領域として扱います。

グローバル変数
プロシージャ間で同じ変数名を同じ変数(領域)として扱う。
③グローバル変数:プロシージャ外で変数を定義する。

Dim 変数名 ←グローバル変数宣言
Sub プロシージャ名(引数リスト)

End Sub
Function プロシージャ名(引数リスト)

End Function
ただし、宣言したモジュール内で同じ変数(グローバル)として扱う。別のモジュールでは同じ変数名でも別の変数。

④プライベート変数:モジュール内でグローバル変数を定義する。
Sub(またはFunction) プロシージャ名(引数リスト)
Private 変数名

End Sub(またはFunction)

⑤パブリック変数:モジュール外でも使えるグローバル変数を定義する。
Sub(またはFunction) プロシージャ名(引数リスト)
Public 変数名

End Sub(またはFunction)

グローバル変数は、スタティック変数となります。

多分、③と④の違いは、領域の確保開放のタイミングだと思われます・・・
④と⑤は該当するプロシージャが開始すると確保され終了すると開放される。
すべて多分です・・・。

おまえら何時確保されて何時開放されるのか
こええよ;;

何がしたいかと言いますと
COBOLの内部セクション的なプロシージャを作りたいのです。
下位処理でも使う変数が増えたときに、引数リストを記述しなおしする手間を取りたくない。
必要なのはプロシージャ間で共通に使える変数(名)なので、グローバル変数ということのようです。

あと、直ぐ忘れる、ループ文のメモ

Do~Loop
前判定(Do条件 ~Loop)・後判定(Do ~Loop条件)
条件が真の間繰り返す(While)、条件が真になるまで繰り返す(Until)
①条件が真の間処理を繰り返す。条件の判定はループの開始時
Do While 条件
処理
Loop

②条件が真になるまで処理を繰り返す。条件の判定はループの開始時
Do Until 条件
処理
Loop

③条件が真の間処理を繰り返す。条件の判定はループの終了時時
Do
処理
Loop While 条件

④条件が真になるまで処理を繰り返す。条件の判定はループの終了時時
Do
処理
Loop Until 条件

⑤While~Wend
①と同等のループになるらしい。でもループっぽくないので使わない。

回数指定のループ
⑥For カウンタ変数 = 初期値 To 最終地 Step 増分
処理
Next カウンタ変数

⑦For Each 要素変数 In グループ~Next 要素変数
グループ(配列)を順番に要素変数へ代入するループ。
カウンタを省略したかっこいい書き方らしい。

いずれも処理中にExitを記述することにより、ループを終了する。

ループの前判定はループの処理を行わない場合があり、後判定は必ず1回ループ処理を行う。

広告

コメント»

1. dbot - 2012/08/15

スタテッィク変数のリセット
1.モジュール内のプログラムに変更があった場合
2.「実行メニュー」から「リセット」選択
領域の解放では無く、変数の初期化。多分Execlファイル内に領域保存?

グローバル変数
④⑤は、③の記述の仕方っぽい。プロシージャ外で定義

定数の定義
Const 変数名 = 値
グローバル変数として扱えるか不明
初期値の設定ではなく、恐らく固定値の設定

dbot - 2012/08/16

Const
グローバル変数(プライベート)として、定義可能。
配列(テーブル)の定義は可能だが、個別に値を設定する方法が不明。


コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。