- ベストアンサー
Excelの別々のブックから関数を呼び出したい
簡単なVBAマクロなら今まで作ったことがあるものの 関数の引渡し等がさっぱりで、 且つプロシージャ???とかヘルプを見ても言葉の 障害で意味が理解しにくくて困ってます。(苦笑 なのでVBAは初心者そのものです。 (大昔C言語は多少かじったけど忘れましたね・・) 出来るのかどうか分かりませんが、 ブックAを操作中にブックBをオープンします。 それからAとBの各シートの情報をやりとりする、 こんな感じのプログラムを作りたいと思っています。 ブックAからブックBの関数(プロシージャ?)を 呼び出すことは出来るのでしょうか? 出来るのなら簡単なサンプルをお願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
他のブックの関数を呼び出すには、 Runメソッドを使います。 ブックAのプロシージャのコード中で、 Application.Run("ブックB.XLS!関数名") とすればOKです。 例えば、ブックBに以下のような、「消費税」という名前の関数があった場合、 Function 消費税(ByVal 金額 As Double) As Double 消費税 = 金額 * 0.05 End Function これを、ブックAのTestから呼び出すには、 Sub Test() Dim 定価 As Double 定価 = 1000 MsgBox Application.Run("ブックB.xls!消費税", 定価) End Sub のようにします。 また、ブックAからブックBへ参照設定しておけば、 Runメソッドを使わなくても、関数名だけで呼び出すことができます。 Sub Test() Dim 定価 As Double 定価 = 1000 MsgBox 消費税(定価) End Sub この場合、ブックAとブックBのプロジェクト名が同じにならないように、どちらかの名前を変えておく必要があります。 参照設定は、VBEメニューの「ツール」-「参照設定」で行います。
その他の回答 (6)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >要は、ブックAの処理()という関数を >ブックa~ブックgのような複数のブックが >それぞれ持っているメイン()という関数の中に >処理()を呼び出して共有したいのです。 Application.Run など使うよりも、アドインにしたほうが早いですね。参照設定は必要ありません。その共有のことを、「グローバル化」といいますね。
お礼
この場をおかりして、 皆さんへのお礼とさせていただきます。 今回は最初の質問に対する直接的なご回答を下さった 方にポイントを入れさせてもらいました。 他の有効であろうご意見もありましたが、 もう少し勉強して全体が見れるようにならないと 判断出来ないと思いましたので、 一旦閉めさせて頂きます。 ありがとうございました。
- hana-hana3
- ベストアンサー率31% (4940/15541)
>処理ファイルの一元化とでも言いましょうか・・・ それなら、必要な処理コードをメインのブックに一元化する方が後々(メンテ・可読性・・・)簡単かと思います。 定型処理はサブルーチン化する事も可能ですから、他のブックから呼び出して使う事も可能でしょう。 お考えの方法では処理のスパゲティ化は免れないかと思いますから・・・。 http://www.asahi-net.or.jp/~ef2o-inue/menu/menu06.html
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 具体的なコードも何もないので、話が混乱しているような気がしていますが、VBAでしたら、ブックAとブックBを、参照設定させたほうが早いと思いますね。終了の時の段取りをちょっと工夫しなければなりませんが。
- めとろいと(@naktak)
- ベストアンサー率36% (785/2139)
ブックBを表示したくないのであれば、以下のような方法も可能です(全部BookBだけを操作しています)。 Public Sub Test() Dim xlApp As Application Dim xlWB As Workbook Set xlApp = New Application Set xlWB = xlApp.Workbooks.Open("BookB.xls") xlWB.Sheets(1).Range("A1").Value = "test" xlApp.Run "BookB.xls!Msg" xlWB.Close SaveChanges:=True Set xlWB = Nothing xlApp.Quit Set xlApp = Nothing End Sub
- masa_019
- ベストアンサー率61% (121/197)
>RunをMsgBox以外にしたい場合の記述は >どのようにしたら良いのでしょうか。 呼び出した関数の戻り値を、呼び出し元でどのように 使うのでしょうか? 例えば、セルに代入するだけなら、 Range("A1").Value = Application.Run("ブックB.xls!消費税", 定価) で可能ですが・・・。 具体例を出していただけると助かります。 できれば、コードを提示していただけると答えやすいのですが。
補足
要は、ブックAの処理()という関数を ブックa~ブックgのような複数のブックが それぞれ持っているメイン()という関数の中に 処理()を呼び出して共有したいのです。 処理ファイルの一元化とでも言いましょうか・・・ 参照設定なるものがどのようなものか分かりませんが、 複数のファイルからアクセスしたいので 一つ一つ設定しない方向で処理したいです。 現在下記のようにしています。 ブックa~ブックg: Sub メイン() Dim BookName As String BookName = ThisWorkbook.Name MsgBox Application.Run(処理,BookName) End Sub ブックA: Sub 処理(ファイル As String) Do Windows(ファイル).Activate ・・・ Windows(ブックA).Activate ・・・ Loop End Sub こんな感じなんですが、分かって頂けるでしょうか。 つまり戻り値は必要ではなく、 処理をさせたいだけです。
- hana-hana3
- ベストアンサー率31% (4940/15541)
補足
何とか呼び出しにこぎ付けたのですが、 RunをMsgBox以外にしたい場合の記述は どのようにしたら良いのでしょうか。(引数有り) 最後にブランクのMsgBoxが出るので・・・