[[20121025165003]] 『変数を他のマクロで使用する』(chieko) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『変数を他のマクロで使用する』(chieko)
 お世話になります。
 下記のマクロで取得した変数「Myst」を
 他のマクロで使用するにはどの様にするのでしょうか?
 宜しくお願い致します。

 Sub dat_input1()
     Dim TextPath As String
     Dim vntFileName As Variant
     Dim Myst As String

    SendKeys ActiveWorkbook.Path & "~"
    vntFileName = Application.GetOpenFilename(FileFilter:="TXTファイル(*.txt),*.txt" _
           , FilterIndex:=1 _
           , Title:="インポートするログの選択" _
           , MultiSelect:=False)
    If vntFileName <> False Then
         TextPath = "TEXT;" & vntFileName
       With ActiveSheet.QueryTables.Add(Connection:=TextPath, Destination:=Range("A1"))
        .AdjustColumnWidth = False
        .Refresh
       End With
    End If

   Myst = Dir(vntFileName)

 End Sub


 このような場合は Function を使ったらよいと思います。
 一回取得した値をいろいろなところで使いまわしたければ、
 引数で渡すようにしたほうが良いです。

 Public で変数を共有する方法もありますが、お勧めはしません。
 (Mook)

 Sub Sample
    Dim Myst As String
    Myst = dat_input1()
      :  Myst を使った処理
    Sample2 Myst  '// Sample2 へ結果を渡す
 End Sub

 Sub Sample2( fileName )
      :  fileName を使った処理 '// dat_input1 で処理した内容が渡される:ここでは 引数の fileName が Sample の Myst と同じ
 End Sub

 Function dat_input1()
    :
     dat_input1  = Dir(vntFileName)  '// 関数名に代入したものが呼び出し側で受け取れます。
 End Function

 Mookさんから、別のプロシジャで取得した値を参照する方法についての回答があったので
 もう1つ、プロシジャ内でセットした変数をほかのプロシジャに渡す構成のものを参考まで。
 いずれにしても、Mookさんのコメントの通り、「Public変数」は、「死んでも使わない」ぐらいの気概で
 コードをつくっていくことを推奨。(死んじゃうともともこもないので、使わざるを得ない場合を除き ということかな)

 Sub 親プロシジャ()
    Dim myStr As String
    Dim myNum As Long

    myStr = "Hello"
    myNum = 100

    Call 子プロシジャ(myStr, myNum)

 End Sub

 Sub 子プロシジャ(s As String, n As Long)
    MsgBox s & vbLf & n
 End Sub

 (ぶらっと)


 >下記のマクロで取得した変数「Myst」を
 >他のマクロで使用するにはどの様にするのでしょうか?
 この意味が dat_input1 と 他のプロシジャー(Maro2)で一つの処理をするような場合は、
 既に投稿があるように・・・、

 dat_input1を実行し、この中で他のプロジャーMacro2を呼び出す場合に
 dat_input1で取得したデータをMacro2というプロシジャーに引き継ぐのですから、

 sub dat_input1()
    dim myst as string
    myst="aaa"
    call macro2(myst)
 end sub

 sub macro2(byval mydat as string)
  msgbox mydat
 end sub

 というようにパラメータを介してデータを送る方法が 良いとされています 
 macro2というプロシジャーは、外のプロシジャーとは、パラメータだけで繋がっているので、
 他のプログラムからも簡単に呼び出せるからです。

 が、この意味がdat_input1とmacro2は、mystという変数を共有するが、
 それぞれ独立した別の機能でしかも
 dat_input1を実行後、時間的に別のタイミングでmacro2を実行したい、
 その時、dat_init1で作成された値、mystを参照したい ということならば、

 どこかにその値を保持しなければなりません。

 モジュールレベルに変数を宣言すれば、値が保持されます。

 例
 新規ブックのSheet1のシートにフォームのボタンを二つ配置して下さい
  Button 1クリックで メッセージを入力し
  Button 2クリックで メッセージを表示する
  ほとんど役に立たない機能ですが、これで考えると・・・、

 標準モジュール(Module1)に
 Option Explicit
 Private myst As String
 Sub save_mes()
    Dim mes As Variant
    mes = Application.InputBox("input")
    If TypeName(mes) <> "Booean" Then
       myst = mes
    End If
 End Sub
 Sub disp_mes()
    MsgBox myst
 End Sub

 尚、プロシジャーsave_mesは、Button 1、
 プロシジャーdisp_mesは、Button 2に登録します。

 Button 1クリックで、メッセージを入力し、
 Button 2クリックで、そのメッセージを表示します。

 このようにmystに値を設定したり、mystを参照するプロシジャーは、一つの
 モジュールに納めてしまうのです。
 このようにすると、mystという変数を中心にそれに関係したプロシジャーが同じモジュールに
 集まってきます。同じモジュールですから、mystをPublic宣言することもありませんし、
 このmystを宣言したモジュールにそれに関わるプロシジャーがあるのでメンテナンスもしやすくなります。
 このような形式のモジュールは、情報的強度の強いモジュールだと評価され、将来、オブジェクトの設計にも役
 に立ちます。

 実際には、モジュールレベルの変数は、使い方によっては、意外なところで初期化されてしまう
 なんて現象があるので、その時の工夫は必要ですが、原則、このような形でモジュールを構成しておくと、
 その時の修正も楽にできます。

 検討してみてください

 ichinose


 (Mook)様、(ぶらっと)様、ichinose様 詳細な解説有難う御座いました。
 変数の受け渡しは出来ました。
 これから解説をじっくり勉強したいと思います。
 皆さんの御指導に感謝です。
 (chieko)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.