• ベストアンサー

Excel VBA 2つのブック間での関数操作

はじめまして。 以下のような処理ができるかどうか教えて下さい。 <環境> Windows XP Excel2002 SP-1 <内容> 2つのブックが用意されているとします。 【ブックA】  マスタと集計表が含まれる。  ユーザーはシート変更の権限、およびVBA変更権限を持たないため、  一切の変更はできない。 【ブックB】  一括印刷専用機能が含まれる。 処理としては、 (1)ブックBを起動させ、ブックBのSheet1にある「処理実行」ボタンを押下。 (2)(1)を実行すると、印刷部数を入力するInputBox表示。 (3)(2)で数値入力後、それをパラメータとして保持。 (4)ブックAを起動させ、その中に含まれる、   処理を実行するための関数を呼び出す。 ブックBより処理実行をかけ、ブックAに含まれる関数を遠隔で 実行できないかということです。 もしよい方法があったら教えて下さい。お願いします。

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

  • ベストアンサー
  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

Application.Run macro:="処理名" ヘルプのRun メソッドの使用例 mySum = Application.Run("MYCUSTOM.XLM!My_Func_Sum", 1, 5)

参考URL:
http://www2s.biglobe.ne.jp/~iryo/2vba/vba26y.html#no12,http://www2s.biglobe.ne.jp/~iryo/vba/VBA14.html
tak_tempid
質問者

お礼

回答ありがとうございます。 Application.Run (ファイル名(フルパス)!マクロ名) で処理が完結しました。 他ブックに仕込まれているモジュールを遠隔で動かすというのは意外にやったことが無かったので、参考になりました。

その他の回答 (1)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

要するに、読み取り専用のブックを外部のブックから、印刷させようとしていて、 その印刷部数を、外部ブックからコントロールさせようとしている、というわけですね。 二通り考えてみました。 以下は、きちんとしたテストをしたわけではありませんので、コードを良く調べてからお使いください。test_2は、最初から、PrintAreaが設定されていたら、確か、.Selectとかは要りませんから、その前のVisible =True も要らないような気がしますね。 なお、私個人として、test_1 の方に、軍配が上がると思っています。1番目は、ご要望に沿っているか分かりませんが、開かれる側のマクロ側に、プロシージャを置いて、引数で、印刷ページを決めます。 Sub test_1()  Dim PageNum As Integer  Const BookName As String = "Book1.xls"  Const MacroName As String = "PrintPrc" PageNum = Application.InputBox("ページ枚数を指定してください", Type:=1) If VarType(PageNum) = vbBoolean Or PageNum = 0 Then   Exit Sub End If  'パスワードと読み取りパスワード  Workbooks.Open BookName, , , , "111", "222"  Run "macro050511a.xls" & "!" & MacroName, PageNum  Workbooks(BookName).Close False End Sub '相手側のブックのマクロを統合させた場合。 Sub test_2() Dim PageNum As Variant Const BookName As String = "Book1.xls" PageNum = Application.InputBox("ページ枚数を指定してください", Type:=1) If VarType(PageNum) = vbBoolean Or PageNum = 0 Then   Exit Sub End If With CreateObject("Excel.Application")  'パスワードと読み取りパスワード   On Error GoTo ErrHandler  .Workbooks.Open BookName, , , , "111", "222"  .Visible = True   'シート1の印刷   With .Workbooks(BookName).Worksheets(1)    .Select    .PageSetup.PrintArea = .Range("A1").CurrentRegion    .PrintOut Copies:=PageNum, Preview:=True    DoEvents   End With ErrHandler:   If Err.Number > 0 Then    MsgBox Err.Number & "(" & Err.Description & ")"   End If  .Workbooks(BookName).Close False  .Quit End With End Sub

tak_tempid
質問者

お礼

丁寧な回答ありがとうございます。 実はですね・・・。 印刷部数は、ユーザー側でInputBoxにて指定した上で、 実際に行いたかったのは、開いた相手方のマクロだったんです。 しかし、挙げて頂いたサンプルは今後発生しうるケースですので、 ぜひ参考にさせていただきたいと思います。