今、フォームを二つ表示し、お互い共通の変数を使って値の受け渡しをさせたいのですが、どうもうまくいきません。
知り合いには標準モジュールを使えばいいって聞いたので
さっそく「プロジェクト」→「標準モジュールの追加」をし、
でてきたエディタに変数を追加
起動してみると・・・ちゃんと値の受け渡しができていませんでした。
ただ追加するだけでは受け渡しはできないのでしょうか?
それとも標準モジュールの時点で間違いでしょうか?
どなたか、レスお待ちしてます

A 回答 (1件)

標準モジュールを使っても使わなくてもいいのですが、変数のスコープが足りないようですね。


いちばん簡単に変数の共有をしたいのであればGlobalを使用します。

標準モジュールに
global HogeHoge as string
としておけば、変数の共有が可能です。

勉強中のようですので参考になる言葉をいくつか(^^)

スコープ Public Private
これらをMSDNに入れて参照してください。
勉強になりますよ。
    • good
    • 0
この回答へのお礼

Yacknさん、おかげで共有することができました^^
なるほど、globalか・・・これは聞いていませんでした(^^;

あと、スコープなども調べてみました
確かに勉強になることが色々書かれていました^^
これを参考にして頑張ってみるつもりです
本当にありがとうございました

お礼日時:2002/01/13 20:48

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVB6-標準モジュールとの変数の受け渡し

VB6の初心者です。ごく初歩的な問題でお恥ずかしいのですが困っています。

標準モジュール内にある以下のサブルーチンを行わせるために、

Sub Transform(NumSamples As Long, RealIn() As Double, ImageIn() As Double, RealOut() As Double, ImagOut() As Double, Optional InverseTransform As Boolean = False)

(NumSamples、RealIn()、ImageIn()は入力値)
(RealOut()、ImagOut()は戻り値)
...
...

End Sub

フォームモジュール内で以下のようにコールすると、

Private Sub cmdStart_Click()
Dim A as Long
Dim B(10000) as Double
Dim C(10000) as Double
Dim D(10000) as Double
Dim E(10000) as Double
...
(A,B,Cに数値入力)
...
Call Transform(A, B(), C(), D(), E(), False)
End Sub

で実行すると、変数D()に対して「コンパイルエラー:型が一致しません:配列またはユーザ定義型を指定してください」が出ます。なお、配列は10000まで宣言していますが実際には0~4096を使っています。

変数型は合わせているはずなのになぜエラーになるのでしょうか。D(),E()の型宣言をPublicにして標準モジュール内に入れたり、いろいろやってみたつもりですがうまくいきません。

よろしくお願いします。

VB6の初心者です。ごく初歩的な問題でお恥ずかしいのですが困っています。

標準モジュール内にある以下のサブルーチンを行わせるために、

Sub Transform(NumSamples As Long, RealIn() As Double, ImageIn() As Double, RealOut() As Double, ImagOut() As Double, Optional InverseTransform As Boolean = False)

(NumSamples、RealIn()、ImageIn()は入力値)
(RealOut()、ImagOut()は戻り値)
...
...

End Sub

フォームモジュール内で以下のようにコールすると、

Private Sub cmdStart_...続きを読む

Aベストアンサー

回答ではないのですが、
試しにVB6 SP4で下記のコードを書いて実行してみましたが、正常に動作しました。
このソースでも同じエラーが出ますか?
もしエラーにならなければ、宣言の方法や構造以外の問題だと思います。

== Form1のcmdStartボタンイベント ============-
Private Sub cmdStart_Click()
  Dim A As Long
  Dim B(10000) As Double
  Dim C(10000) As Double
  Dim D(10000) As Double
  Dim E(10000) As Double

  A = 4096

  For i = 0 To (A - 1)
    B(i) = i
    C(i) = i
  Next

  Call Transform(A, B(), C(), D(), E(), False)
 
  For i = 0 To (A - 1)
    Debug.Print D(i)
    Debug.Print E(i)
  Next

End Sub
==============================================


== Module1のTransform()関数 ==================
Sub Transform( _
  NumSamples As Long, _
  RealIn() As Double, ImageIn() As Double, _
  RealOut() As Double, ImagOut() As Double, _
  Optional InverseTransform As Boolean = False)

  For i = 0 To (NumSamples - 1)
    RealOut(i) = RealIn(i)
    ImagOut(i) = ImageIn(i)
  Next

End Sub
==============================================

回答ではないのですが、
試しにVB6 SP4で下記のコードを書いて実行してみましたが、正常に動作しました。
このソースでも同じエラーが出ますか?
もしエラーにならなければ、宣言の方法や構造以外の問題だと思います。

== Form1のcmdStartボタンイベント ============-
Private Sub cmdStart_Click()
  Dim A As Long
  Dim B(10000) As Double
  Dim C(10000) As Double
  Dim D(10000) As Double
  Dim E(10000) As Double

  A = 4096

  For i = 0 To (A - 1)
    B(i) = ...続きを読む

QVBAで別モジュールへの変数の受け渡し方法

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


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

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

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

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

Aベストアンサー

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

>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キーワードは不要です。

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

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

Qフォームのテキストボックスなどの変数名を標準モジュールから参照は可能か?

フォームのテキストボックスなどの変数を標準モジュールの関数から参照する方法を教えてください。
お願いします。

Aベストアンサー

>test(form1.Text1.Text)
>
>Public Function test(コントロール変数パラメータ)
>
>コントロール変数パラメータ=値を代入
>
>End Fuction
可能ですよ。サンプルです。試してみてください。

まず、フォームと標準モジュールを準備してください。
フォーム:
Form[Form1]にTextbox[Text1]とCommandButton[Command1]を配置してください。
([]内は、オブジェクト名です。)
Private Sub Command1_Click()
  Call test(Text1)
End Sub

標準モジュール:
Public Function test(txt As TextBox)
  txt.Text = "aaa"
End Function

CommandButtonを押すと、Textboxに”aaa”と表示されます。

※Public Function test(txt As ****)の****は、
「Textbox」又は「Object」又は「Control」 いずれでもOKです。
例:
Public Function test(txt As Textbox)
Public Function test(txt As Object)
Public Function test(txt As Control)
この辺りは、人それぞれになると思いますが・・・。

>test(form1.Text1.Text)
>
>Public Function test(コントロール変数パラメータ)
>
>コントロール変数パラメータ=値を代入
>
>End Fuction
可能ですよ。サンプルです。試してみてください。

まず、フォームと標準モジュールを準備してください。
フォーム:
Form[Form1]にTextbox[Text1]とCommandButton[Command1]を配置してください。
([]内は、オブジェクト名です。)
Private Sub Command1_Click()
  Call test(Text1)
End Sub

標準モジュール:
Public Function test(txt As TextB...続きを読む

Q標準モジュールとクラスモジュールについて

標準モジュールでType型を使用しています。
この標準モジュールをクラスモジュールに置き換えて、Formから呼び出すCOMに作り変えたいのですが、引数ってどう設定したらよいのでしょうか?
今は標準モジュールなので、こんな感じで呼んでいるのですが・・・

例)
Private Sub Command1_Click()

Dim in_b As IN_PARA
Dim out_b As OUT_PARA

in_b.Name = "山本太郎"
in_b.Seikaku = "優しい"
in_b.Syumi = "釣り"
in_b.Tokugi = "野球"

Aベストアンサー

VBのCOMでは、Typeで宣言したものは公開できません。
公開可能なものは、Variantに格納できるもののみです。

対応としては、それぞれの項目を別々のプロパティにするしかないです。

QVBのフォームモジュールと標準モジュールの使い分け

VBのフォームモジュールと標準モジュールの使い分けが今一つわかっていません。
フォームモジュールとは、フォーム(画面)上で起こったイベント(例えば、ボタンをクリックした時とか、ユーザーが行を選択したりだとか)の処理を、記述するところと解釈しています。
標準モジュールは、フォームが2つ以上あって、その2つが共通する処理(関数)などを、記述したり、フォームが1つでも、同じ処理を繰り返す場合、その処理を標準モジュールに書いたり・・・・という解釈をしています。
あってますでしょうか?

フォームが一つしかない場合、もしくは2つあっても、あまり共通する処理がない場合、なんかは標準モジュールはあまり使わないのでしょうか?
それとも、フォームが1つとかでも、今後のメンテの事など考慮して、標準モジュールを作ってそこにグローバル変数なんかで処理を書いた方がよいのでしょうか?
どなたか、教えてくださいませんか?
いろいろBBSなどで見てみるんですが、いろいろ書いてあって、どれが理想か
わかりません。よろしくお願いいたします。

Aベストアンサー

>標準モジュールは、フォームが2つ以上あって、その2つが共通する処理(関数)などを、記述したり
で良いと思いますよ。
逆に
>フォームが1つでも、同じ処理を繰り返す場合
は、フォームモジュールの中に関数を作ってしまうので良いのでは?

参考になるかわかりませんが、私はDBとの接続や、起動時の全フォームのロード、定数やプロジェクトレベルでのグローバル変数の宣言等に使用しています。
そういえばMain関数は標準モジュールにしか書けませんでした…っけ?
メッセージボックスを表示する際の関数を自分で定数とMsgBox()を組み合わせて使い勝手の良い物にする…というのもよくやります。


このカテゴリの人気Q&Aランキング

おすすめ情報