[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『変数を他のマクロで使用する』(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.