- ベストアンサー
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に含まれる関数を遠隔で 実行できないかということです。 もしよい方法があったら教えて下さい。お願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Application.Run macro:="処理名" ヘルプのRun メソッドの使用例 mySum = Application.Run("MYCUSTOM.XLM!My_Func_Sum", 1, 5)
その他の回答 (1)
- Wendy02
- ベストアンサー率57% (3570/6232)
要するに、読み取り専用のブックを外部のブックから、印刷させようとしていて、 その印刷部数を、外部ブックからコントロールさせようとしている、というわけですね。 二通り考えてみました。 以下は、きちんとしたテストをしたわけではありませんので、コードを良く調べてからお使いください。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
お礼
丁寧な回答ありがとうございます。 実はですね・・・。 印刷部数は、ユーザー側でInputBoxにて指定した上で、 実際に行いたかったのは、開いた相手方のマクロだったんです。 しかし、挙げて頂いたサンプルは今後発生しうるケースですので、 ぜひ参考にさせていただきたいと思います。
お礼
回答ありがとうございます。 Application.Run (ファイル名(フルパス)!マクロ名) で処理が完結しました。 他ブックに仕込まれているモジュールを遠隔で動かすというのは意外にやったことが無かったので、参考になりました。