- ベストアンサー
VBA チェックボックスで印刷ページの選択
よろしくお願い致します。 一つのシートで縦に31ページ分印刷範囲があります。 このうち一つのページだけ印刷する際にVBAのチェックボックスで、 何ページを印刷するかを出して行いたいのですが、 どのように行えばよいでしょうか。 どなたかご回答をよろしくお願い致します。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 それでは、こんな風にしてみてください。 Sub PrintPage1() Dim PageTotal As Integer Dim o As Variant PageTotal = Application.ExecuteExcel4Macro("GET.DOCUMENT(50)") o = Application.InputBox("印刷ページ入力。 例)1/ " & PageTotal & " → " & PageTotal, "印刷ページ指定", Type:=2) If o = "" Or VarType(o) = vbBoolean Then Exit Sub If o <= PageTotal Then ActiveSheet.PrintOut From:=o, To:=o, Preview:=False Else MsgBox "指示されたページは存在しないか、印刷範囲が違います。", vbCritical End If End Sub
その他の回答 (8)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >人に渡す予定なのですが、エクセル97の人がいるため、気になった次第です。 こちらで、Excel 97 の動作試験はしています。マクロの部分に関しては、特に、変えていただくものはありません。また、ブック自体に、他のオブジェクトなどつけていなければ、改変していただく必要はありませんが、本来、VBAは、上位互換ですから、下位バージョンでご使用になるには、一度、以下のことをしていただく必要があるかと思います。 VBEditor 画面を出していただいて、Ctrl + S または、ファイル-保存 とすると、 ダイアログが出てきて、 「このファイルは、最新版のMicrosoft.Excelで作成されました。このファイルをMicrosoft Excel 97で、保存すると、最新版の機能で作成された情報が失われる可能性があります。 ・元のファイルの情報を保持するには、[いいえ]をクリックし、・・・ ・保存する場合は、[はい]をクリックしてください。 保存しますか? はい(Y) いいえ(N) で、はい(Y)をクリックしてください。 なお、時々、参照設定が見失うというトラブルも聞いております。その場合は、Module のソースファイル(.bas)によるインポートという方法があります。 なお、上位互換については、VBAの上級になりますが、以下の資料があります。 VBAマイグレーションに関する技術資料ダウンロード http://www.projecta.co.jp/migration/download.html
お礼
ご回答ありがとうございました。 古いバージョンでもできるということで、安心いたしました。 おかげさまで、本来の目的が達成できたのでそろそろ質問を閉じようと思います。 なかなか、VBAは難解で一つ一つ実際に使用しながら、感覚を掴んで学んで行こうかと思っております。 なかなか、各サイトの基礎を読んでいても、はやく使用したいという気持ちから、このようにお教え頂く結果になってしまいます。 非常にありがたく、また、こんなことができるんだ!と感動する毎日です。 ありがとうございました。 また質問をお見かけの際に、またご回答いただけると幸いです。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 マクロ自体にご興味がおありなのですね。 少し、関係のない話がありますから、ざっと読んでくださって構いません。 >こちらのApplication以後はどのような意味でしょうか。 いわゆる、「マクロ関数 Ver.4」というものです。 私は、スタートがExcel 2000でしたから、もちろん、実際に使っていた時代を知りませんが、遡って、Excel Ver.4までを勉強しました。 これは、Excelの内部に存在するマクロ関数で、直接操作するので、スピードが速いという利点があります。 VBAネイティブの方法もあるのですが、実は、印刷関連のVBAは、バグが存在しているのと、処理スピードがかなり違うので、この方法が、VBAを良く知っている人たちの間では、好まれます。VBA専門掲示板では、良く見られるコードも、ここではめったに書かれません。 また、ヘルプがない、ということで、この使用について苛立ちや、他人の使用までを禁じるような過剰な反応に出られるような方もおられるようです。 http://office.microsoft.com/ja-jp/assistance/HP010475331041.aspx ヘルプをダウンロードしてもよいのですが、中身は、英語であるのと、Excelとのマクロシートのリンクが効きません。また、日本語バージョンは、日本が独自に作成したもので、サポートされなくなってしまいました。Office 97 までは、残っていたものです。 マイクロソフト・サポート技術情報検索 で、以下の言葉を入れると、出てくるはずです。 検索語 「マクロを使おう 関数」 印刷の関係では、VBAのネイティブコードでは、うまくいかないので、但し書きがついているものもあります。その代用として、マクロ関数を使ったものが書かれていることがあります。 書式 GET.DOCUMENT(検査の種類, ファイル名) 50:現在の設定で印刷されるページの総数を返します。指定したファイルがグラフのときは、1 が返されます。 64:手動または自動改ページが設定されている行の行番号を、配列で返します。 65:手動または自動改ページが設定されている列の列番号を、配列で返します。 現行で使えるのに、使わなければよい、という短絡的な意見は別としても、今後、この関数がどのような扱いになっていくのは、私自身、正直なところ分かりません。過去の多くのユーザーの築き上げた遺産の一部であることには間違いないと思います。 また、私は、それほど簡単にVSTA に移行できるとは個人的に思いません。VBAのほうは、後、3~4年ぐらいは、そのままの形態で維持できるでしょうから、それほどは困らないとは思います。私は、今、.Net を勉強中ですが、まともに扱えるようになるには、後、3年ぐらい掛かりそうな気がします。かといって、今までのものを、VSTAがまかなえるわけではありませんから、たぶん、VBAは、よほどのことがない限りは、存続していくような気がします。 (ただし、Microsoft 社は、一度、バッサリと自社ユーザーを切り捨てた前歴はあります。Excelが他の表計算から劣勢に追い込まれることになったらあるかもしれません。) >こちらで、ウィンドウの中で改行する方法はどのようにしたら良いでしょか。 この時の改行は、「VbCrLf」を用います。 良く分からない場合は、「vbNewLine」と使っても可能です。 o = Application.InputBox("印刷ページ入力。 例)1/ " & PageTotal & " → " & PageTotal, "印刷ページ指定", Type:=2) 以下のように用います。 o = Application.InputBox("印刷ページ入力。" & VbCrLf &" 例)1/ " & PageTotal & " → " & PageTotal, "印刷ページ指定", Type:=2) それから、いらぬお世話かもしれませんが、もう少し、詳しく説明すると、なぜ、 Type:=2 と、文字の設定にしてあるのか、ということですが、これは、定型のフレーズです。最初から、Type:=1 の数値にしてあればよいとお考えになるかもしれません。 戻り値 「o」をVariant にしてありますから、InputBox で、「OK」を押すと、「""」が格納されます。「Cancel」を押すと、「False」が返ります。 「""」でも、ページ数にはなりません。戻り値「o」を、Integer型にしたら、空白値の場合は、数値の「0」が入って、その後、If構文で、「0」は受けられませんという、内容が必要になってしまいます。 これは、マイナス・プラスの数字を扱う場合など、「0」という値は存在します。しかし、空の状態と分けなくてはなりません。それで、これは、そんな仕組みによって作られてています。 同じく「False」は、Boolean値ですから、ページ数には用に立ちません。それを排除するために、Vartype 関数を使って、Boolean値をはじき出すようにしています。
補足
長文でのご回答、誠にありがとうございます。 熱心に勉強されているようですね。 ご丁寧にお教えくださったことに感謝いたします。 ところでこちらの説明を拝見したところ、 今エクセル2003でこのマクロを使用しておりますが、 エクセル97では一部動かない可能性があるのでしょうか。 人に渡す予定なのですが、エクセル97の人がいるため、 気になった次第です。
- Wendy02
- ベストアンサー率57% (3570/6232)
Private Sub PrintPage(i As Integer) これを、同じモジュールに入れれば動きますが、そうでない場合は、Private を取って Sub PrintPage(i As Integer) としてください。
補足
今まで苦闘して、印刷ができるようにまでなりました。 しかし、存在しないページの時に警告が出るようにできなく、 どこに入れ込めば良いかわからず困っております。 つなぎ合わせて、変な箇所があるかもしれませんが、 よろしくお願いいたします。 また、private sub の理解に頭を痛めているため、 使用されておりません。 せっかく説明していただいているのですが、 的を得るのにもう少し時間が必要のようです。 Sub PrintPage1() '印刷用サブルーチン Dim PageTotal As Integer PageTotal = Application.ExecuteExcel4Macro("GET.DOCUMENT(50)") If i <= PageTotal Then Dim o As Variant o = Application.InputBox("印刷ページ入力。 例)1/23 → 23 ", "印刷ページ指定", Type:=2) If o = "" Or VarType(o) = vbBoolean Then Exit Sub ActiveSheet.PrintOut From:=o, To:=o, Preview:=False Else MsgBox "指示されたページは存在しないか、印刷範囲が違います。", vbCritical End If End Sub
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >メッセージボックスのことでした。 それは、InputBox のことですね。 以下を、フォームツールのコマンドボタンにするなり、コントロールツールのコマンドボタンで、中身だけ(Sub ... Endを抜いた部分)を、CommandButton1_Click() に入れるなりしてください。 Sub OnlyOnePagePrinte() Dim i As Variant i = Application.InputBox("ページ数を入れてください。", "OnePagePrint", Type:=2) If i = "" Or VarType(i) = vbBoolean Then Exit Sub Call PrintPage(CInt(i)) End Sub Private は、直接、マクロの起動をすることがない、という前提から、プライベート・ステートメントを入れる、お約束のようなものです。 >印刷プレビューの画面に切り替わってとまってしまいました。 ActiveSheet.PrintOut From:=i, To:=i, Preview:=True Preview を False にすれば、そのまま進みますが、一般的に、確認してから、印刷ということで、プレビューでとまるようになっています。
補足
ご回答ありがとうございます。 早速やってみました。 Private Sub CommandButton1_Click() Dim i As Variant i = Application.InputBox("ページ数を入れてください。", "OnePagePrint", Type:=2) If i = "" Or VarType(i) = vbBoolean Then Exit Sub Call PrintPage(CInt(i)) End Sub とやると、 Call PrintPage(CInt(i))のところで、【functionまたはsubが定義されてません】とエラーが出てしまいます。 どこをどうしたらよいでしょうか。 何度も申し訳ありません。
- Wendy02
- ベストアンサー率57% (3570/6232)
#3で、同じ回答で重複していますが、チェックボックスはページ分のチェックボックスが用意されているということですか? また、VBAのチェックボックスって何ですか? 通常、数が多いチェックボックスの場合は、フォームツール側で作ると便利のような気がします。コントロールツールで、Index を設けるのは面倒な気がします。 なぜ、チェックボックスでなさろうとしていることは分かりませんが、指定のページのみ印刷はこのようになるかと思います。 '--------------------------------------------------------- Sub OnlyOnePagePrinte() Call PrintPage(10) '←ここに、数値を代入させる End Sub Private Sub PrintPage(i As Integer) '印刷用サブルーチン Dim PageTotal As Integer PageTotal = Application.ExecuteExcel4Macro("GET.DOCUMENT(50)") If i <= PageTotal Then ActiveSheet.PrintOut From:=i, To:=i, Preview:=True Else MsgBox "指示されたページは存在しないか、印刷範囲が違います。", vbCritical End If End Sub '--------------------------------------------------------- 複数の場合は、サブルーチン側の引数を、パラメータ配列にします。
補足
誤りでした。 すみません。 メッセージボックスのことでした。 こちらを貼り付けさせていただき行ってみたのですが、 印刷プレビューの画面に切り替わってとまってしまいました。 privateとはどのような命令なのか分からなかったので、 後で調べてみたいと思いますが、標準モジュール以外のところに貼り付けなければならないものかとも思っております。 まずは、お礼まで。
こんにちは。 チェックボックスを使って印刷するページを決める、と言うのがよく分かりません。 チェックボックスはチェックのOn/Offしかできないので、31個配置してと言うことになるのでしょうか? それと、チェックボックスは複数チェックできるので、ひとつのページだけにするにはそれなりの処理が必要になってきます。 はっきりいってめんどくさいです。 それよりもテキストボックスに、手入力かスピンボタンで数値を増減させて入力して決めるというのは動でしょうか。
補足
申し訳ありません。 間違いでした。 印刷したいページを問いかけるウィンドウのことでした。
追加情報です。 うまいサンプルが見つからず、指定方法が具体的に判るわけではないのですが 印刷範囲指定に Printer.FromPrint Printer.ToPrint なるものがあるようです。 #ただ、Visual BasicカテゴリとかでPrinterを検索すると 結構「デタラメ」とか「いい加減」とかいう話もあるようです
回答ではありません。 うーん...「印刷範囲」だけなら ActiveSheet.PageSetup.PrintArea http://homepage1.nifty.com/tabotabo/insat/excelp/excelp06.htm というのがありそうなんだけど・・・・
補足
ご回答ありがとうございます。 おかげさまで、動くようになりました。 何度も質問して申し訳ありませんが、お答え頂けますでしょうか。 PageTotal = Application.ExecuteExcel4Macro("GET.DOCUMENT(50)") こちらのApplication以後はどのような意味でしょうか。 o = Application.InputBox("印刷ページ入力。 例)1/ " & PageTotal & " → " & PageTotal, "印刷ページ指定", Type:=2) こちらで、ウィンドウの中で改行する方法はどのようにしたら良いでしょか。