要するに、読み取り専用のブックを外部のブックから、印刷させようとしていて、
その印刷部数を、外部ブックからコントロールさせようとしている、というわけですね。
二通り考えてみました。
以下は、きちんとしたテストをしたわけではありませんので、コードを良く調べてからお使いください。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
お礼
回答ありがとうございます。 Application.Run (ファイル名(フルパス)!マクロ名) で処理が完結しました。 他ブックに仕込まれているモジュールを遠隔で動かすというのは意外にやったことが無かったので、参考になりました。