プロが教えるわが家の防犯対策術!

よろしくお願い致します。

一つのシートで縦に31ページ分印刷範囲があります。
このうち一つのページだけ印刷する際にVBAのチェックボックスで、
何ページを印刷するかを出して行いたいのですが、
どのように行えばよいでしょうか。

どなたかご回答をよろしくお願い致します。

A 回答 (9件)

回答ではありません。


うーん...「印刷範囲」だけなら

ActiveSheet.PageSetup.PrintArea

http://homepage1.nifty.com/tabotabo/insat/excelp …

というのがありそうなんだけど・・・・
    • good
    • 0

追加情報です。


うまいサンプルが見つからず、指定方法が具体的に判るわけではないのですが
印刷範囲指定に
Printer.FromPrint
Printer.ToPrint
なるものがあるようです。

#ただ、Visual BasicカテゴリとかでPrinterを検索すると
結構「デタラメ」とか「いい加減」とかいう話もあるようです
    • good
    • 0

こんにちは。



チェックボックスを使って印刷するページを決める、と言うのがよく分かりません。

チェックボックスはチェックのOn/Offしかできないので、31個配置してと言うことになるのでしょうか?

それと、チェックボックスは複数チェックできるので、ひとつのページだけにするにはそれなりの処理が必要になってきます。

はっきりいってめんどくさいです。

それよりもテキストボックスに、手入力かスピンボタンで数値を増減させて入力して決めるというのは動でしょうか。

この回答への補足

申し訳ありません。
間違いでした。

印刷したいページを問いかけるウィンドウのことでした。

補足日時:2006/07/24 13:15
    • good
    • 0

#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とはどのような命令なのか分からなかったので、
後で調べてみたいと思いますが、標準モジュール以外のところに貼り付けなければならないものかとも思っております。

まずは、お礼まで。

補足日時:2006/07/24 13:16
    • good
    • 0

こんにちは。



>メッセージボックスのことでした。
それは、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が定義されてません】とエラーが出てしまいます。

どこをどうしたらよいでしょうか。
何度も申し訳ありません。

補足日時:2006/07/24 14:32
    • good
    • 0

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

補足日時:2006/07/24 23:41
    • good
    • 0

こんばんは。



それでは、こんな風にしてみてください。

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

この回答への補足

ご回答ありがとうございます。
おかげさまで、動くようになりました。
何度も質問して申し訳ありませんが、お答え頂けますでしょうか。

PageTotal = Application.ExecuteExcel4Macro("GET.DOCUMENT(50)")
こちらのApplication以後はどのような意味でしょうか。

o = Application.InputBox("印刷ページ入力。 例)1/ " & PageTotal & " → " & PageTotal, "印刷ページ指定", Type:=2)
こちらで、ウィンドウの中で改行する方法はどのようにしたら良いでしょか。

補足日時:2006/07/25 10:49
    • good
    • 0

こんにちは。



マクロ自体にご興味がおありなのですね。
少し、関係のない話がありますから、ざっと読んでくださって構いません。

>こちらのApplication以後はどのような意味でしょうか。

いわゆる、「マクロ関数 Ver.4」というものです。

私は、スタートがExcel 2000でしたから、もちろん、実際に使っていた時代を知りませんが、遡って、Excel Ver.4までを勉強しました。

これは、Excelの内部に存在するマクロ関数で、直接操作するので、スピードが速いという利点があります。

VBAネイティブの方法もあるのですが、実は、印刷関連のVBAは、バグが存在しているのと、処理スピードがかなり違うので、この方法が、VBAを良く知っている人たちの間では、好まれます。VBA専門掲示板では、良く見られるコードも、ここではめったに書かれません。

また、ヘルプがない、ということで、この使用について苛立ちや、他人の使用までを禁じるような過剰な反応に出られるような方もおられるようです。

http://office.microsoft.com/ja-jp/assistance/HP0 …

ヘルプをダウンロードしてもよいのですが、中身は、英語であるのと、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の人がいるため、
気になった次第です。

補足日時:2006/07/26 10:18
    • good
    • 0

こんにちは。



>人に渡す予定なのですが、エクセル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
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
古いバージョンでもできるということで、安心いたしました。
おかげさまで、本来の目的が達成できたのでそろそろ質問を閉じようと思います。
なかなか、VBAは難解で一つ一つ実際に使用しながら、感覚を掴んで学んで行こうかと思っております。
なかなか、各サイトの基礎を読んでいても、はやく使用したいという気持ちから、このようにお教え頂く結果になってしまいます。
非常にありがたく、また、こんなことができるんだ!と感動する毎日です。
ありがとうございました。
また質問をお見かけの際に、またご回答いただけると幸いです。

お礼日時:2006/07/27 00:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています