• ベストアンサー

[ExcelVBA] Module1で定義した変数の(代入した)値を、Module2でも使う方法

基本中の基本のことで誠に申し訳ございません。 ある標準Moduleで宣言した変数に値を代入します。 その後、別のModuleでその変数を使用しますが、 その変数の中の値が消えてしまいます。 たとえば下記のように、プログラムを書きます。 test1を実行すると、続いてtest2も実行されます。 この場合、変数の値が0になってしまいます。 このような場合どうやったらいいのでしょうか? Hensuu1の値をセルに一度出力させて、 別のModuleで、セルの値をもう一度変数に代入させて使用する という方法で何とかしていたのですが、大変で困っています。 Module1に記載------------ dim Hensuu1 as integer sub test1() Hensuu1 = 100 test2 end sub ------------------------- Module2に記載------------- sub test2 range("A1") = Hensuu1 end sub --------------------------

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

(1)引数で渡す Sub test01() hennsuu = 10 test02 (hennsuu) End Sub Sub test02(hennsuu2) MsgBox hennsuu2 End Sub ーー Test01を実行。10と表示されるが、test01->test02に値が引き継がれたことがわかる。 ーーー (2)Public変数を使う Public hennsuu Sub test01() hennsuu = 10 test02 End Sub Sub test02() MsgBox hennsuu End Sub ーーー (3)エクセルの場合 シートのセルを使う Sub test03() hennsuu = 20 Range("A1") = hennsuu test02 End Sub Sub test04() hennsuu = Range("A1") MsgBox hennsuu End Sub エクセルのシートのデータは変数のスコープと関係ないので VBAなどの場合、必要なときシートの値を参照できるので便利であるが 、スマートでないが、大きく見てエクセルのシートが変数群と言えなくも無いと思う(妄想かも知れないが、セルに対応したメモリ記憶領域参照しているはず)

その他の回答 (1)

  • t-aka
  • ベストアンサー率36% (114/314)
回答No.1

簡単に言うとスコープ(適用範囲)が違います。 モジュール間を跨げない変数定義となっています。 これを解消するためにパブリック変数を利用します。 どちらのモジュールでも構いません。 モジュールの一番上(Declaration)のところに Public Hensuu1 as Integer とすればいけますよ。

関連するQ&A

  • サブフォームに変数を代入し、RecordSourceの値を取得したい

    サブフォームに変数を代入し、RecordSourceの値を取得したいのですがうまくいきません。 Sub test1() Dim サブフォーム As String Dim フォーム As String フォーム= "土台" サブフォーム = "フォーム1" MsgBox Form_フォーム1.RecordSource End Sub ******************************************************************* Sub test2() Dim サブフォーム As String Dim フォーム As String フォーム= "土台" サブフォーム = "フォーム1" MsgBox Form_フォーム1.RecordSource MsgBox Forms(フォーム).Controls(サブフォーム).RecordSource End Sub オブジェクトは、このプロパティまたはメソッドをサポートしていません。(Error 438) ******************************************************************* Sub test3() Dim サブフォーム As String Dim フォーム As String フォーム = "土台" サブフォーム = "フォーム1" MsgBox Forms(サブフォーム).RecordSource End Sub 実行時エラー'2450' マクロの式またはVisual Basic コート゛で参照されている 'フォーム名'フォームが見つかりません。 ******************************************************************* test1~3のうち test1のみはうまくいくのですが 変数を代入したいです。 ヘルフ゜のには Forms![受注]![受注サブフォーム].Formとなってますが これじゃ変数を代入できないですよね。 どうすればサブフォームに変数を代入しつつ、RecordSourceの値を取得できるのでしょうか? よろしくお願いします。

  • Evaluate()に数式を代入した変数を渡すには

      VB.NETでEvaluate()関数を使って、プログラム実行中に決まる数式を評価させたいのですが、(1)のように数式をリテラルのまま渡せば正しく評価されるのですが、(2)のように数式を変数に代入して渡すとうまくいきません。数式の構造自体がプログラムの実行中に決まるので、数式を代入した変数を引数として渡す必要がありますが、このような場合、どのようにすればよいのでしょうか。 (1) 引き渡す数式がリテラルの場合 Imports Microsoft.Office.Interop Module Module1  Sub Main()   Dim xlApp As New Excel.Application   Dim x As Integer   x = 1   MsgBox(xlApp.Evaluate(x = 1)) '期待 True  実際 True  結果 OK   MsgBox(xlApp.Evaluate(x <> 1)) '期待 False  実際 False  結果 OK  End Sub End Module (2) 引き渡す数式が代入された変数の場合 Imports Microsoft.Office.Interop Module Module1  Sub Main()   Dim xlApp As New Excel.Application   Dim x As Integer   Dim term1 As String   Dim term2 As String   x = 1   term1 = "x = 1"   term2 = "x <> 1"   MsgBox(xlApp.Evaluate(term1)) '期待 True  実際 -2146826259 結果 NG   MsgBox(xlApp.Evaluate(term2)) '期待 False  実際 -2146826259 結果 NG  End Sub End Module よろしくお願いします(WindowsXP,VS2010)

  • VBA プロシージャで値を渡す方法

    エクセルVBAのプロシージャで値を渡す方法はどうしたらいいのでしょうか。 たとえば、下記のようなプログラムを書いたとします。 --------------------------------------------- Private Sub test_main() Dim drink As String Dim alcohol As String Call test(cola, beer) End Sub Public Sub test_module(ByVal drink As String, ByVal alcohol As String) Cells(1, 1).Value = drink Cells(2, 2).Value = alcohol End Sub --------------------------------------------- このプログラムはもちろん不完全です。試してみたら動きませんでした。 やりたいことは、メインのプロシージャ(test_main)から、test_moduleを 呼び出し、同時に「cola」と「beer」の値を渡します。呼び出された先で、 エクセルのワークシートのセルに値を入力します。 重複しますが、それぞれの値「cola」と「beer」は変数「drink」と「alcohol」に代入されます。 この変数をcell(1,1)とcell(2,2)に入力します。 ワークシート上のcell(1,1)には「cola」、cell(2,2)には「beer」 と入力されます。 変数は数値ではなく、文字列です。 ポイントは、変数「drink」と「alcohol」をどのプロシージャに宣言するのか また、変数に値「cola」と「beer」をのどプロシージャでどういうふうに代入するのか。 そして代入した変数をどうやって呼び出したいプロシージャに渡すのかです。 このようなことをするには、上記プログラムをどう書き換えたらよいのでしょうか。

  • 変数にnullを代入するには

    諸事情で、変数の値をNullにしたいのですが、 Sub a() Dim mystr As String mystr = "moji" '他の処理 mystr = Null End Sub だと、実行時エラー94になります。 多分、NULLは値じゃないから代入できないんだと思いますが、どうすれば変数をnullにできるのでしょうか? String型が問題であれば、何にすればいいですか?

  • 別スレッド上の変数を参照する方法について

    VB2010で、別スレッドの変数をメインフォームが閉じられた時に 表示するプログラムを書いたのですが、変数の中身が空になってしまいます。 色々試してみたのですが、うまく値を参照できません。 別スレッド上の値をどうやったら参照できるのでしょうか? 以下のような感じで記述したのですが、何か特別な書き方があるのでしょうか? わかりにくい質問ですが、ご回答おねがいします。m(_ _)m 簡単なイメージを書きました。 http://www.progoo.com/rental/img_bbs1/img_data/18133_730_30ba642aac.jpg 'メインフォーム Public Class Form1  '★変数testをpublicで宣言   Public test As String=""  '★ロードしたらBackgroundWorker1を動かす   Private Sub Form1_Load() Handles MyBase.Load     BackgroundWorker1.RunWorkerAsync()   End Sub  '★BackgroundWorker1はModule1.test()を動かしてtestに"成功"の文字列を入れる   Private Sub BackgroundWorker1_DoWork() Handles BackgroundWorker1.DoWork     Module1.test()   End Sub  '★フォームを閉じた時に変数testを表示する   Private Sub Form1_closing() Handles MyBase.FormClosing     MsgBox(test)   End Sub End Class '別モジュール Module Module1   Public Sub test()     Form1.test = "成功"   End Sub End Module

  • 取得した変数の値の一番大きい変数を取る

    エクセル2002使用です。 セル(A~F列)にランダムに入力された列の最終行数を変数で取っています。 その中で最も大きい変数の値を取るコードを記述したいのですが、 良い方法がわかりません。 sub test() Dim rcnt1, rcnt2, rcnt3, rcnt4, rcnt5, rcnt6, rcnt As Integer '最終行の取得 rcnt1 = Cells(65536, 1).End(xlUp).Row rcnt2 = Cells(65536, 2).End(xlUp).Row rcnt3 = Cells(65536, 3).End(xlUp).Row rcnt4 = Cells(65536, 4).End(xlUp).Row rcnt5 = Cells(65536, 5).End(xlUp).Row rcnt6 = Cells(65536, 6).End(xlUp).Row rcnt = "最も大きい変数の値" ←ここがわかりません。 end sub よろしくお願いします。

  • ExcelVBA Static変数の初期化

    Static変数はファイルを一旦終了しないと0にリセットできないのでしょうか? 出来ないとすればStatic変数に代わりそういうことができる方法はありますか?(セルに番号を代入するのは無しで) Sub 番号てすと() Static g As Integer MsgBox "今のG= " & g g = g + 1 MsgBox "次のG= " & g End Sub

  • VBA Public変数の値が初期化されません

     質問させていただきます。どうぞよろしくお願いいたします。    環境:Win7 SP1 64Bit     エクセル2010 SP2 32bit でございます。 【現象】  下記のコードを実行後、再実行するとなぜか最初からB_Num = 3 になっております。 VBAの場合は明示的に初期値を入れないでも自動で初期化されるものと思っておりましたが、 「プログラム再実行時に確実に変数が初期化されている」ようにする事は可能でしょうか?       Public B_Num As Integer Sub test() If B_Num > 0 Then Stop For iii = 1 To 3 B_Num = B_Num + 1 Next End Sub 【検証内容】  ・ コード実行 →(End Subまで行って終了)   →再実行   →3が残っている。     ・ コード実行 →(End Subまで行って終了)   →終了している状態で、無意味そうですが、エディタの「リセット」ボタン(四角形)を押す。   →再実行   →何故か値が0に初期化される。     ・上記「リセット」ボタンの代わりに「デザインモード」ボタンを押す。   →同じく値が0に初期化される。     ・ThisWorkBook内、Module1内、どちらに記述しても同じ現象になる。      検索しておりましても「Public変数の値が消えてしまう」という記事はいくつかありましたが 「消えずに残っている」というものを見つけることができませんでした。 (「C言語の場合は初期値が不安定なことがあるので明示的に初期化しないといけない」という記事はありましたが。。。)  どうぞよろしくお願いいたします。

  • Word VBAでStyle型の変数に空の値を代入

    Word VBA でStyle型の変数に空の値を代入したい! 下記コマンドでテストしたところ、 Set style = "" では、型が違うと怒られます。 どのようにしたら、空のスタイル値を代入出来るのでしょうか? Sub stylevartest() Dim style As style Set style = "" MsgBox style End Sub 分かる方入らしたら、ご教授下さい。 よろしくお願い致します。

  • iと言う変数の値が1から10の間にないならば

    「iと言う変数の値が1から10の間にないならば」、としたいのですが どのようなコードを書けばいいのでしょうか? Sub test1() Dim i As Integer i = 11 If 1 < i < 10 Then MsgBox i & "は1から10の間にはありません" End If End Sub だと、メッセージが表示されてしまいます。

専門家に質問してみよう