「教えて!ピックアップ」リリース!

初歩的な質問で申し訳ありません、
googleでもどのように検索してよいのかわからないので教えてください。


Userformにて作成したコード内にhogehogeという変数を宣言したとします。
これをPublic Sub CommandButton1_Click()内でhogehogeに文字列abcを代入します。

そしてcall を使ってmodule1の処理を行うのですが、
module1内で変数hogehogeに文字列abcが既に代入されているものとして
hogehogeを使いつつ、処理を続けるにはどのようにすればよいのでしょうか?

callで呼ぶ際に変数hogehogeの受け渡しなどが必要なのでしょうか?
(ちなみに全てPublic Subで書いております)

初心者なので質問がおかしいかもしれませんが
よろしくお願いします。

A 回答 (3件)

標準的なコードの書き方があります。


具体的なコードがないので、こちらは想像の範囲なので、行き違いがあるのはご容赦願います。

>Userformにて作成したコード内にhogehogeという変数を宣言したとします。
変数を共有化(厳密にはグローバル化されていない、プロジェクト内のみ共有)するには、通常、「標準モジュール」で、プロシージャ外の変数は、Public変数になります。そして、明示的に、Public ○○と書きます。仮に、それが、UserFormモジュール内で使用されるものでも、標準モジュールに書くことになります。

>これをPublic Sub CommandButton1_Click()内でhogehogeに文字列abcを代入します。
そういう書き方は、本当に特殊な例を除いて書きません。Privateキーワードだけです。

つまり、ローカルモジュール(シートモジュール、ThisWorkbookモジュール、UserFormモジュール)には、Public キーワードは用いません。また、そこへのCallでの、呼び出しもしません。共有化させる場合は、一般的には「標準モジュール」を利用します。

しかし、別途、ユーザー定義関数やサブプロシージャで、引き数を参照渡し/値渡しで、変数の内容を渡すことがあります。この方が安定していますが、多少、コードの可読性が落ちます。

>callで呼ぶ際に変数hogehogeの受け渡しなどが必要なのでしょうか?
具体的にどのようなコードになっているか分かりませんし、Callでどう呼ぶのかは分かりませんが、引き数を設ければ、それはそれで済みます。

例:
'UserForm1 上 CommandButton1とTextBox1 を用意
'UserFormモジュール内
Private Sub CommandButton1_Click()
Dim a As Variant
  a = Val(TextBox1.Value)
 Call Test1Ref(a)
 MsgBox a
End Sub

'標準モジュール、そのままで参照渡しになっている
Public Sub Test1Ref(arg1 As Variant)
 arg1 = arg1 * 10
End Sub

ただし、この程度ならば、UserFormモジュール内で、Test1Refを置いても同じです。その時は、Publicキーワードは不要です。
    • good
    • 3
この回答へのお礼

お返事していなくて申し訳ありません。
お陰様で解決しました。
ご丁寧な回答に心から感謝します。

お礼日時:2013/09/20 23:09

はい、できますよ。


いくつかポイントがあるのでそちらを説明したのちにコードを掲載しておきます。

■他のモジュールの変数にアクセスしたい時
アクセスしたい変数はDimではなくPublicで宣言する必要があります。
スコープ範囲が外からでもアクセスできるようにする必要があるからです。

Publicで宣言した後、どのようにアクセスすればよいかですが

たとえば、Sheet1という名前のシート内で宣言したPublic変数にアクセスしたい時は
debug.print Thisworkbook.Sheets("Sheet1").変数名
でアクセスできます。

標準モジュール(Module1)内であれば
debug.print Module1.変数名


■ユーザーフォームの変数にアクセスする時
ユーザーフォーム(UserForm1)内であれば
debug.print UserForm1.変数名
でアクセスできます。

ただし、UnLoadや×印で閉じてしまうとメモリ上から消えてしまい変数にアクセスすることはできません。
そのため、×印を押した際に閉じるのではなく、非表示にしてあげる必要があります。


以上を踏まえると以下のようになります。
標準モジュール:Module1
Sub SampleCode()
MsgBox "変数abcの値は:" & UserForm1.hogehoge

UserForm1.Show

MsgBox "変数abcの値は:" & UserForm1.hogehoge

End '全ての処理が終わったらEndでPublic宣言の変数をリセットする
End Sub

ユーザーフォーム:UserForm1
Public hogehoge As String

Private Sub CommandButton1_Click()
hogehoge = "abc" 'UserForm1の変数に保存
End Sub


Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Me.Hide 'メモリから消えてしまわないよう非表示にする

Cancel = True 'デフォルトの挙動(メモリから消える)をキャンセルする
End Sub
    • good
    • 0
この回答へのお礼

お返事していなくて申し訳ありません。
お陰様で解決しました。
ご丁寧な回答に心から感謝します。

お礼日時:2013/09/20 23:09

それらの変数等には、スコープという概念が存在します。


これは簡単に言うと、それらの変数等のオブジェクトが、どの位置まで使用出来るかという事を示します。

説明が下手なので申し訳ありませんが、以下のサイト等を参考にしてみては如何でしょうか。

参照URL : http://homepage1.nifty.com/rucio/main/kiso/Scope …
    • good
    • 0
この回答へのお礼

お返事していなくて申し訳ありません。
お陰様で解決しました。
ご丁寧な回答に心から感謝します。

お礼日時:2013/09/20 23:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング