こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

変数の宣言(s As String)で良い理由

vbaについてしつもんです。

標準モジュールで

Option Explicit

Dim s As String

Sub test1()
Call test2("qqq")
End Sub
Sub test2(s As String)
MsgBox s
End Sub


としたのですが、もしかしてDim s As Stringって必要ないのでしょうか?
あってもなくても動きます。

(s As String)があるからDim s As Stringは不要なのですか?

だとしたら、(s As String)に dim や publicをつけなくて良い理由を教えてください。

投稿日時 - 2013-01-14 10:31:02

QNo.7891081

困ってます

質問者が選んだベストアンサー

そうですね
Dim s As String を省くと s は暗黙の宣言として 最初に入力されたデータのプロパティー が当てられます
Dim s As String により明示的に宣言します。

変数を使うとき 時間と時刻 氏名と名前 等 思い違えで同じものとしてコーディングして
プログラムの実行では見つからないまま結果が狙い通りにならない事があります。

自分は[変数の宣言を強制する]にして、これを避けています。

これで 宣言していない変数の場所で実行時エラーとなって先へ進みません

投稿日時 - 2013-01-14 14:46:27

お礼

難しいですがそういう事なんですね。
ありがとうございます。

投稿日時 - 2013-01-16 20:11:58

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

2つのSubに共通の変数を有効に使えば、多少は簡単に書ける、、、
Option Explicit
Dim s As String
Sub test1()
s = "QQQ"
Call test2
End Sub
Sub test2()
MsgBox s
End Sub

投稿日時 - 2013-01-14 11:29:01

お礼

この方法はよく使ってました。

投稿日時 - 2013-01-16 20:11:44

ANo.1

同じsを使ったせいで間違って理解していますが、不要じゃなく単に使ってないだけです。
次のようにしてみると、もう少し理解が進むかも?しれません。

option explicit
dim s as string ’モジュールシートの中でパブリック宣言

sub test1()
call test2("qqq")
msgbxo s
end sub

sub test2(z as string) ’プロシジャの中で単独で宣言
msgbox s
msgbox z
s = "sss"
end sub



>(s As String)に dim や publicをつけなくて良い理由

Subステートメントの引数には、dimやpublicといった要素はありません。代わりにbyvalとかbyrefとかありますが、そこいらはsubステートメントのヘルプにしっかり書いてあるので、是非熟読してください。

投稿日時 - 2013-01-14 10:58:40

お礼

変数sはtest2では引き継がれないのですね。
dimやpublicの代わりにbyval・byrefをつけるのですか
ヘルプ読んでみます。

投稿日時 - 2013-01-16 20:11:33