環境はWindowsXP、Access2003 です。
レポートごとに用紙等のプリンタ設定をしたいです。
いろいろ調べてPrtDevMode等を使えばよいことは分かりました。
行おうとしたのは以下の手順です。
1. 標準モジュールで、type_PrtDevMode 構造体等を定義し、
以下のようなSetPrinterプロシージャを用意して設定は標準モジュールで行う。
Sub SetPrinter( Rpt As Report, StrDevExtra As String)
2. レポートの Report_Open イベントで type_PrtDevMode 構造体の変数に設定し、
String 型のStrDevExtraにつっこんで、SetPrinter Me, StrDevExtra をコールする。
が、PrtDevMode はデザインビューのときにしか更新できないようで、
そうすると、SetPrinter の中で
Rpt をクローズ
Rpt をデザインビューでオープン
Rpt に StrDevExtra を設定
Rpt を設定を保存してクローズ
Rpt をプレビューでオープン
という操作をしなくてはならないかと思い、困惑してます。
やりたいことはレポートごとの印刷設定を、標準モジュールでなく、
レポートに書いておきたいということなのですが・・・。
何かうまい方法はないでしょうか?
レポートを印刷プレビューモードで開きプレビュー画面を
右クリックすると、「ページ設定」→ページ設定ダイアログのページタブから
プリンタの変更ができると思うのですがこれだとまずいでしょうか?
デザインビューでもファイルメニューから設定できるかもしれません。
返信ありがとうございます。
それだと別環境で実行したときや、
時々設定がクリアされていたりするので(原因分からないけど)、
vb で制御したいな、と考えています。
方法がありましたら、教えてください。
>いろいろ調べてPrtDevMode等を使えばよいことは分かりました。
Access2002以降であれば、
Printersコレクション、Printer オブジェクトのほうが楽かと。
http://support.microsoft.com/kb/839378/ja
PrtDevMode プロパティがらみの制約も緩和されますし。
ここでもよいかとは思いますが、
Accessを専門に扱う掲示板のほうがこの話題には適しているかと。
http://www.accessclub.jp/
ありがとうございます!!
Printer オブジェクトでの設定をしてみました。
エラーにはならないのですが、設定内容がレポートに反映されていません。
理由がよく分からないので、もし分かれば教えていただけないでしょうか。
DoCmd.OpenReport ReportName, acViewDesign, , , acHidden
With Reports(ReportName).Printer
.TopMargin = 10
.BottomMargin = 10
.LeftMargin = 10
.RightMargin = 10
End With
DoCmd.Close acReport, ReportName, acSaveYes
DoCmd.OpenReport ReportName, acViewPreview
http://support.microsoft.com/kb/839378/ja
の
サンプル2をもう一度よく見て、違いを確認してください。
Function printchange(strReportName As String)
Dim rpt As Report
DoCmd.OpenReport strReportName, acViewDesign, , , acHidden
Set rpt = Reports(strReportName) '一旦Reportオブジェクトで受ける
With rpt.Printer
'10mm に設定 Twip値 1mm = 56.7Twip(概算)
.TopMargin = Round(10 * 56.7, 2)
.BottomMargin = Round(10 * 56.7, 2)
.LeftMargin = Round(10 * 56.7, 2)
.RightMargin = Round(10 * 56.7, 2)
End With
DoCmd.Save ObjectType:=acReport, ObjectName:=strReportName
DoCmd.Close ObjectType:=acReport, ObjectName:=strReportName
DoCmd.OpenReport strReportName, acViewPreview
Set rpt = Nothing
End Function
ありがとうございます!!!
なぜか Close をすると設定が反映されないみたいです。
Close せずにプレビューでオープンするようにすると、うまくいきました。
が、この場合、ツールバーに表示される「閉じる」をクリックした場合、
なぜかデザインモードのレポートが表示されてしまいます。
xボタンで閉じた場合には、正常に前のフォームに戻ることができますが・・・。
解決方法がありましたら教えてください!
Sub SetPrinter(strReportName As String)
Dim Rpt As Report
DoCmd.OpenReport strReportName, acViewDesign, , , acHidden
Set Rpt = Reports(strReportName)
With Rpt.Printer
' 10mm に設定 Twip値 1mm = 56.7Twip(概算)
.TopMargin = Round(10 * 56.7, 2)
.BottomMargin = Round(10 * 56.7, 2)
.LeftMargin = Round(10 * 56.7, 2)
.RightMargin = Round(10 * 56.7, 2)
End With
DoCmd.Save ObjectType:=acReport, ObjectName:=strReportName
' 一度閉じると、設定が反映されないので、閉じずに開く
'DoCmd.Close ObjectType:=acReport, ObjectName:=strReportName, Save:=acSaveYes
DoCmd.OpenReport strReportName, acViewPreview
Set Rpt = Nothing
End Sub
前の行で明示的にSaveしていますので、
Save:=acSaveYes
は不要と思いますよ。
こちらの環境では、問題なく設定が保存されていますし。
>なぜかデザインモードのレポートが表示されてしまいます。
Closeをコメントにしていてデザイン画面を閉じてないからでは?
AccessのVBAは、挙動がわかりにくく
(特にDoCmdの指している対象がよくわかんない
&非同期実行することがある...等)て嫌いなのですが(^^;
もしかしてそういう影響もあるならAccess掲示板に移動したほうがよいかと。
何度もお返事いただきありがとうございます。
DoCmd.Close ObjectType:=acReport, ObjectName:=strReportName
としても、設定が反映されないのですよね・・・。
もげさんの環境では問題なく保存されるそうなので、
環境に依存するのでしょうか。
過去にご紹介いただいたAccessの掲示板で質問したことがあるのですが、
レスがつかなかったので、こちらでお伺いしたんです。
とても親切にご返信いただいたので、つい何度もお伺いしてしまったのですが、
移動した方がよければ、移動しますね。
こんな姑息なコードよいのか不明ですが、
DoCmd.OpenReport strReportName, acViewPreview
Do Until Reports.Count = 0 'プレビュー閉じるまで待つ
DoEvents
Loop
DoCmd.Close ObjectType:=acReport, ObjectName:=strReportName
とか。
まあ、
デザインビューを使わなくても、その場で設定変更→印刷できるはずですので
保存にこだわらなくてもよいかもしれませんが。
再現可能なコードがあれば誰か見てくれる人も居るはずですし、
AccessのVBA固有の問題、
かつ、なんらかの環境依存等の匂いもしますので、
Accessに詳しいコミュニティに意見を求めたほうがよいかと思いますよ。
他にも、
http://www.moug.net/
http://www.ruriplus.com/
http://www.tsware.jp/
など、いろいろ聞けるところはあると思います。
(ただし、マルチポストはダメです)
それでは別の掲示板に行ってきます。
(なんか追い出された感じでちょっとさみしいですが)
一応、解決にチェックを入れましたが、
Printer を使って、プリンタの設定をすることはほぼできましたが、
『プリンタ設定を「設定をするレポート」に記述したい』
という当初の目的はまだ果たせていないんですよね。
用紙や、縦横、余白の指定などが、レポートによってかなり多様になるため、
もげさんのおっしゃるようなその場で印刷設定変更というのは避けたいのです。
こちらには、優秀で親切な方がいらっしゃるようなので、
もし、アクセスとは関連性の低い VB の問題がありましたら、
またこちらに来ますね。