Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1145 / 2272 ツリー ←次へ | 前へ→

【8574】Printerオブジェクトを使用したVBAでのレポートのページサイズ設定 leo 06/9/13(水) 18:05 質問[未読]
【8576】Re:Printerオブジェクトを使用したVBAでのレ... 立ち寄り 06/9/14(木) 14:02 回答[未読]
【8577】Re:Printerオブジェクトを使用したVBAでのレ... leo 06/9/14(木) 15:38 発言[未読]
【8579】Re:Printerオブジェクトを使用したVBAでのレ... 立ち寄り 06/9/14(木) 16:15 回答[未読]
【8580】Re:Printerオブジェクトを使用したVBAでのレ... leo 06/9/14(木) 17:04 発言[未読]
【8581】Re:Printerオブジェクトを使用したVBAでのレ... 立ち寄り 06/9/14(木) 17:22 回答[未読]
【8583】Re:Printerオブジェクトを使用したVBAでのレ... leo 06/9/15(金) 9:58 発言[未読]
【8584】Re:Printerオブジェクトを使用したVBAでのレ... 立ち寄り 06/9/15(金) 10:41 回答[未読]
【8585】Re:Printerオブジェクトを使用したVBAでのレ... leo 06/9/15(金) 11:20 発言[未読]
【8586】Re:Printerオブジェクトを使用したVBAでのレ... 立ち寄り 06/9/15(金) 11:53 回答[未読]
【8588】Re:Printerオブジェクトを使用したVBAでのレ... leo 06/9/15(金) 12:23 発言[未読]
【8594】Re:Printerオブジェクトを使用したVBAでのレ... 立ち寄り 06/9/15(金) 13:41 回答[未読]
【8596】Re:Printerオブジェクトを使用したVBAでのレ... leo 06/9/15(金) 14:59 お礼[未読]
【8587】Re:Printerオブジェクトを使用したVBAでのレ... 06/9/15(金) 12:15 発言[未読]
【8589】Re:Printerオブジェクトを使用したVBAでのレ... leo 06/9/15(金) 12:44 発言[未読]
【8590】Re:Printerオブジェクトを使用したVBAでのレ... 06/9/15(金) 13:05 発言[未読]
【8591】Re:Printerオブジェクトを使用したVBAでのレ... leo 06/9/15(金) 13:21 発言[未読]
【8593】Re:Printerオブジェクトを使用したVBAでのレ... 06/9/15(金) 13:35 発言[未読]
【8595】Re:Printerオブジェクトを使用したVBAでのレ... leo 06/9/15(金) 14:50 発言[未読]
【8598】Re:Printerオブジェクトを使用したVBAでのレ... 06/9/15(金) 16:37 発言[未読]

【8574】Printerオブジェクトを使用したVBAでのレ...
質問  leo  - 06/9/13(水) 18:05 -

引用なし
パスワード
   環境:AC2003 , Windows XP SP2

お世話になっております。

現在、Printerオブジェクトを使用したVBAでのレポートのページサイズ設定の
ロジックを作成しております。

このサイトを始め、いろいろなサイトを回ってそれらしいコードを書くことが
できたのですが、PageSizeプロパティの変更がうまく反映されてくれません。
具体的には、15行目のPageSizeプロパティの設定がレポートに反映されず、
デザインビューで設定したA4で印刷されてしまいます。

手を尽くした(つもり)なのですが、解決法を見つけることができませんでした。
当方初心者のため、常識的な設定が抜けているのかと思い投稿させていただきました。何かご存知の方、ご教示下さい。

コードは以下です。

1:Public Function print_Report() As Byte
2:On Error GoTo print_Report_Err
3:
4:  Dim prt As Printer
5:  Dim valPaperName As Variant
6:  
7:  Echo False
8:  
9:  'レポートを印刷対象として設定
10:  DoCmd.SelectObject acReport, REPORT_NAME, True
11:  
12:  Set prt = Application.Printers("test")
13:
14:  ' 選択したプリンタをこのセッションで通常使うプリンタとして設定します。
15:  prt.PaperSize = acPRPSA3
16:
17:  Set Application.Printer = prt
18:
19:  DoCmd.openReport REPORT_NAME, acViewNormal, , , , acHidden
20:
21:print_Report_Exit:
22:  Echo True
23:
24:  print_Report = 0
25:  Exit Function
26:
27:print_Report_Err:
28:  MsgBox Err.Description
29:End Function

【8576】Re:Printerオブジェクトを使用したVBAでの...
回答  立ち寄り  - 06/9/14(木) 14:02 -

引用なし
パスワード
   下記の値(acPRPSA3)はプリンタによって使用できないって
どこかのサイトで見かけましたよ。
だからかわりにプリンタの用紙ID?を確認して
設定するみたい。

>15:  prt.PaperSize = acPRPSA3 ←数値を指定に変更

ページ設定のプロパティを変更してレポートを保存後、
イミディエイトウインドウで値を確認できませんか?

【8577】Re:Printerオブジェクトを使用したVBAでの...
発言  leo  - 06/9/14(木) 15:38 -

引用なし
パスワード
   返信ありがとうございます。

確認しました。『8』でした。ですが、8を直接prt.PaperSizeに代入しても
用紙サイズを反映してくれません。

実は実際に私が作成しているモジュールの処理の流れは以下です。

1.コンボにてプリンタを選択、
2.選択したプリンタの用紙ID一覧を取得
3.取得した用紙ID一覧から用紙を選択してレポートの印刷を行う

というもので、用紙一覧の取得、選択部分はできたのですが、選択した
用紙サイズをprt.PaperSize に反映できずに困っています。

プリンタによってできる場合とできない場合があるのでしょうか?一応
2台のプリンタで(KONICA MINOLTA C450 PCLとKyocera LS-6800 KX)
試したのですが両方とも反映されてくれませんでした。なお、プリンタの
選択はうまく実行されます。


▼立ち寄り さん:
>下記の値(acPRPSA3)はプリンタによって使用できないって
>どこかのサイトで見かけましたよ。
>だからかわりにプリンタの用紙ID?を確認して
>設定するみたい。
>
>>15:  prt.PaperSize = acPRPSA3 ←数値を指定に変更
>
>ページ設定のプロパティを変更してレポートを保存後、
>イミディエイトウインドウで値を確認できませんか?

【8579】Re:Printerオブジェクトを使用したVBAでの...
回答  立ち寄り  - 06/9/14(木) 16:15 -

引用なし
パスワード
   >10:  DoCmd.SelectObject acReport, REPORT_NAME, True
>11:  
>12:  Set prt = Application.Printers("test")
>13:
>14:  ' 選択したプリンタをこのセッションで通常使うプリンタとして設定しま>す。
>15:  prt.PaperSize = acPRPSA3
>16:
>17:  Set Application.Printer = prt
>18:
>19:  DoCmd.openReport REPORT_NAME, acViewNormal, , , , acHidden

よくよく確認したら12行目から根本的に間違っています。
あと10行目も意味がないような・・・・
サンプルがネットにいっぱいころがっているのでまず調べて
みたらどうですか?

【8580】Re:Printerオブジェクトを使用したVBAでの...
発言  leo  - 06/9/14(木) 17:04 -

引用なし
パスワード
   12行目というのは"test"の文字列を入れているところでしょうか?
このtestにはプリンタ名が入ります。実際はテーブルから値を取得して
きており、少し込み入った記述だったのでわかりづらいかと思いtestに
しました。根本的というのはどのような間違いなのでしょうか?

10行目がいらないというのはデザインなりプレビューなりで開いていないから
でしょうか?

念のため、実際のコードを再掲致します。よろしくお願いします。

Public Function print_Report() As Byte
On Error GoTo print_Report_Err

  print_Report = 9
  
  Dim prt As Printer
  Dim valPaperName As Variant
  
  Echo False
  
  'レポートを印刷対象として設定
  DoCmd.SelectObject acReport, REPORT_NAME, True
  
  Set prt = Application.Printers(DLookup("PRT_NM", TBL_NAME_PRT_UKE, "SIYO_FLG=true"))

  ' 選択したプリンタをこのセッションで通常使うプリンタとして設定します。
  'Set Application.Printer = Nothing
  valPaperName = DLookup("PAPER_SIZE", TBL_NAME_PRT_UKE, "SIYO_FLG=true")
  MsgBox Err.Description

  prt.PaperSize = Left(valPaperName, InStr(1, valPaperName, " ") - 1)

  Set Application.Printer = prt

  Application.Printer.PaperSize = Left(valPaperName, InStr(1, valPaperName, " ") - 1)

  'DoCmd.openReport REPORT_NAME, acViewPreview, , , , acHidden
  DoCmd.openReport REPORT_NAME, acViewNormal, , , , acHidden
  
  'DoCmd.Close acReport, REPORT_NAME, acSaveNo

print_Report_Exit:
  Echo True

  print_Report = 0
  Exit Function

print_Report_Err:
  MsgBox Err.Description
End Function

▼立ち寄り さん:
>>10:  DoCmd.SelectObject acReport, REPORT_NAME, True
>>11:  
>>12:  Set prt = Application.Printers("test")
>>13:
>>14:  ' 選択したプリンタをこのセッションで通常使うプリンタとして設定しま>す。
>>15:  prt.PaperSize = acPRPSA3
>>16:
>>17:  Set Application.Printer = prt
>>18:
>>19:  DoCmd.openReport REPORT_NAME, acViewNormal, , , , acHidden
>
>よくよく確認したら12行目から根本的に間違っています。
>あと10行目も意味がないような・・・・
>サンプルがネットにいっぱいころがっているのでまず調べて
>みたらどうですか?

【8581】Re:Printerオブジェクトを使用したVBAでの...
回答  立ち寄り  - 06/9/14(木) 17:22 -

引用なし
パスワード
   下記参照して下さい。
参考になると思います。
http://www.accessclub.jp/bbs5/0016/vba4586.html

PS
指摘したのは12行目だけではなくて12行目からと指摘しました。
再度読み直して下さいね。

【8583】Re:Printerオブジェクトを使用したVBAでの...
発言  leo  - 06/9/15(金) 9:58 -

引用なし
パスワード
   教えていただいたサイトではレポートのPrinterオブジェクト(?)に対して
PaperSizeを指定していましたが、立ち寄りさんが指摘されている私の間違いと
いうのは、PrinterオブジェクトにPaperSizeを指定しているということ
でしょうか?

また、教えていただいたサイトのコードを試してエラーになってしまいました。
それで気づいたのですが、実はmde形式でモジュールを実行しています。
それも原因の一つなのでしょうか?Printerオブジェクトはmdeでも使える
とMSのサポートページに記述があったのですが。。。。

教えて君で非常に申し訳ないのですが再度ご教示いただけますでしょうか?

>12:  Set prt = Application.Printers("test")
>13:
>14:  ' 選択したプリンタをこのセッションで通常使うプリンタとして設定しま>す。
>15:  prt.PaperSize = acPRPSA3
>16:
>17:  Set Application.Printer = prt
>18:
>19:  DoCmd.openReport REPORT_NAME, acViewNormal, , , , acHidden

▼立ち寄り さん:
>下記参照して下さい。
>参考になると思います。
>http://www.accessclub.jp/bbs5/0016/vba4586.html
>
>PS
>指摘したのは12行目だけではなくて12行目からと指摘しました。
>再度読み直して下さいね。

【8584】Re:Printerオブジェクトを使用したVBAでの...
回答  立ち寄り  - 06/9/15(金) 10:41 -

引用なし
パスワード
   ▼leo さん:
>教えていただいたサイトではレポートのPrinterオブジェクト(?)に対して
>PaperSizeを指定していましたが、立ち寄りさんが指摘されている私の間違いと
>いうのは、PrinterオブジェクトにPaperSizeを指定しているということ
>でしょうか?
>

整理して下さい。
出力したいレポートをaaとします。
aaというレポートをA3で出力したいのですよね。
となるとレポートに対してプリンタの設定を行うのが基本ですよね。
今のleoさんのプログラムはそうなっていますか?
自分で記述したプログラムを見直して下さい。


>また、教えていただいたサイトのコードを試してエラーになってしまいました。

エラーといわれても私にはわかりません。
どういう記述でエラーなのか?
それともコンパイルエラーなのか?

>それで気づいたのですが、実はmde形式でモジュールを実行しています。
>それも原因の一つなのでしょうか?Printerオブジェクトはmdeでも使える
>とMSのサポートページに記述があったのですが。。。。
>
>教えて君で非常に申し訳ないのですが再度ご教示いただけますでしょうか?
>

なぜ最初からmde形式で実施していると教えてくれないのですか?
こちらは掲示板に記載されている情報しかわかりませんのであとから
いろいろ言われても指摘している内容と食い違いが発生する可能性があります。
このようなことが続くと解決するのに時間が掛かりますよ。

PS
レポートのページ設定はどのようになっていますか?

【8585】Re:Printerオブジェクトを使用したVBAでの...
発言  leo  - 06/9/15(金) 11:20 -

引用なし
パスワード
   何度も何度もすみません。

>レポートのページ設定はどのようになっていますか?

通常使うプリンタ、A4で設定されています。

>整理して下さい。
>出力したいレポートをaaとします。
>aaというレポートをA3で出力したいのですよね。
>となるとレポートに対してプリンタの設定を行うのが基本ですよね。

  Set Application.Printer = prt

の記述で『通常使うプリンタをprtに設定する』と考えているので、
prt.PaperSize = "用紙サイズ" とすれば『通常使うプリンタの用紙サイズ
を設定できる』ものと考えてレポートのPrinterは使用してませんでした。
mdeなのでデザインで開けないという理由もあるのですが忘れておりました。

Access上のフォームから指定したプリンタ名を以下の記述で、『通常使う
プリンタ』に設定できるということを確認していたので

  Set prt = Application.Printers("プリンタ名")

上記のように考えました。

>
>>また、教えていただいたサイトのコードを試してエラーになってしまいました。

出力されたエラーは
『このコマンドはMDE/ADEデータベースでは使用できません』
です。

>なぜ最初からmde形式で実施していると教えてくれないのですか?

提示すべき情報かそうでないのかうまく判断できないもので、mde形式が
影響あるとは思っておりませんでした。

舌足らずで申し訳ありません。よろしくお願いします。

【8586】Re:Printerオブジェクトを使用したVBAでの...
回答  立ち寄り  - 06/9/15(金) 11:53 -

引用なし
パスワード
   話の視点がずれてきているので確認させて下さい。
mdbファイルで修正しているのではないのですか?
mdbファイルは手元にあるのですよね?

mdeファイルはvbaの修正等はできないのですが
何か変更作業をしたのですか?
どのような作業をしたのか詳細を教えてください。

【8587】Re:Printerオブジェクトを使用したVBAでの...
発言    - 06/9/15(金) 12:15 -

引用なし
パスワード
   こんにちわ。雅です。

横から失礼します。

Printerを使ったこと無いので自信ないですが
該当レポートのオープン時もしくは読込み時に

Me.Printer.PaperSize = acPRPSA3

とするとどうでしょうか?

でわ。

【8588】Re:Printerオブジェクトを使用したVBAでの...
発言  leo  - 06/9/15(金) 12:23 -

引用なし
パスワード
   ▼立ち寄り さん:
>話の視点がずれてきているので確認させて下さい。
>mdbファイルで修正しているのではないのですか?
>mdbファイルは手元にあるのですよね?
>

mdbは手元にあります。mdeでの運用となっているので
mdbでモジュール修正を行った後、mdeファイルを作成して
テストを行っております。

>mdeファイルはvbaの修正等はできないのですが
>何か変更作業をしたのですか?
>どのような作業をしたのか詳細を教えてください。

変更作業というのが良くわかりませんが、経緯を記載いたします。

行いたい処理というのは、ユーザがクライアントにインストール
されたプリンタ一覧から希望のプリンタを選択し、そのプリンタの
持つ用紙サイズ一覧から好きな用紙サイズで帳票を印刷することです。

元々はプリンタのみ選択できれば良いとの要件であり、その機能は
実現させることができました。その後要件が変わり、用紙サイズを
選択する機能を追加することになりました。

そこで用紙選択機能を実現すべく、元々あったプリンタ選択のできる
mdb(mde)をいじっていたのですがロジックがわからずこちらで質問
させていただきました。

ご質問の答えになっていますでしょうか?

【8589】Re:Printerオブジェクトを使用したVBAでの...
発言  leo  - 06/9/15(金) 12:44 -

引用なし
パスワード
   返信ありがとうございます。

さっそくためさせていただいたのですがだめでした。

読み込み時がありませんでしたので開く時とページフォーマット時
で試してみましたが元のページ設定のまま印刷されてしまいました。

難しいのかそれとも単純ミスなのか。。。

Private Sub Report_Open(Cancel As Integer)
  Me.Printer.PaperSize = acPRPSA3
End Sub

▼雅 さん:
>こんにちわ。雅です。
>
>横から失礼します。
>
>Printerを使ったこと無いので自信ないですが
>該当レポートのオープン時もしくは読込み時に
>
>Me.Printer.PaperSize = acPRPSA3
>
>とするとどうでしょうか?
>
>でわ。

【8590】Re:Printerオブジェクトを使用したVBAでの...
発言    - 06/9/15(金) 13:05 -

引用なし
パスワード
   こんにちわ。雅です。

>読み込み時がありませんでしたので開く時とページフォーマット時
>で試してみましたが元のページ設定のまま印刷されてしまいました。

読込み時はレポートは無かったですね。すみません(^^;

いちよう試してみましたけど、こちらではちゃんと設定されました。
試しにほかのサイズにしてみるとどうですか?
「acPRPSB4」とか

ちなみに、元のコードはOpenReportだけにしたんですよね?

でわ。

【8591】Re:Printerオブジェクトを使用したVBAでの...
発言  leo  - 06/9/15(金) 13:21 -

引用なし
パスワード
   acPRPSB4、acPRPSA4、acPRPSA3にそれぞれについて2種類のプリンタで
試してみましたが、状況は変わりません。

一応確認ですが、mde形式で実行されましたか?

>ちなみに、元のコードはOpenReportだけにしたんですよね?

はい。OpenReportだけです。

【8593】Re:Printerオブジェクトを使用したVBAでの...
発言    - 06/9/15(金) 13:35 -

引用なし
パスワード
   こんにちわ。雅です。

>一応確認ですが、mde形式で実行されましたか?

はい。MDB、MDE両方試しました。
こちらでは、変更できていました。

>はい。OpenReportだけです。

acViewNormalじゃなくacViewPreviewでプレビューしてみるとどうですか?
あとacHiddenとったらどうですか?

でわ。

【8594】Re:Printerオブジェクトを使用したVBAでの...
回答  立ち寄り  - 06/9/15(金) 13:41 -

引用なし
パスワード
   ▼leo さん:
>『このコマンドはMDE/ADEデータベースでは使用できません』

上記のエラーですが私が提示したサンプルはmdeでは利用できないと
いうことがわかりました。
ちなみにmdbで実行した場合の結果を知りたかったです。


>変更作業というのが良くわかりませんが、経緯を記載いたします。
>
>行いたい処理というのは、ユーザがクライアントにインストール
>されたプリンタ一覧から希望のプリンタを選択し、そのプリンタの
>持つ用紙サイズ一覧から好きな用紙サイズで帳票を印刷することです。
>
>元々はプリンタのみ選択できれば良いとの要件であり、その機能は
>実現させることができました。その後要件が変わり、用紙サイズを
>選択する機能を追加することになりました。
>
>そこで用紙選択機能を実現すべく、元々あったプリンタ選択のできる
>mdb(mde)をいじっていたのですがロジックがわからずこちらで質問
>させていただきました。
>
>ご質問の答えになっていますでしょうか?

最初の時点で上記の内容を説明してほしかったです。
そのために調査する視点がずれていました。


対応策ですが、やはりオリジナルのフォームを作成して
プリンタ出力するという方法はどうでしょうか?
オリジナルフォームのサンプルは下記を参照。
http://office.microsoft.com/ja-jp/assistance/HA010345531041.aspx

【8595】Re:Printerオブジェクトを使用したVBAでの...
発言  leo  - 06/9/15(金) 14:50 -

引用なし
パスワード
   どうやらできました!

> acViewNormalじゃなくacViewPreviewでプレビューしてみるとどうですか?
> あとacHiddenとったらどうですか?

acHiddenを削除するだけでは変化ありませんでした。

プレビューにしたところ、無事に用紙サイズの変更を反映させることができました。以下に成功したコードを記載いたします。何かご意見があればお聞かせ下さい。

なお、コード中では、TBL_NAME_PRT_UKEというプリンタ名、用紙サイズを持つテーブルから各値を取得しています。また、元々acViewNormalでの使用感に近づけるため、acHidden、PrintOutメソッドを使用しております。

本当に助かりました。どうもありがとうございました。

モジュール:

Public Function print_Report() As Byte
On Error GoTo print_Report_Err

  print_Report = 9
  
  Dim prt As Printer
  Dim valPaperName As Variant
  
  Echo False
  
  'レポートを印刷対象として設定
  Set prt = Application.Printers(DLookup("PRT_NM", TBL_NAME_PRT_UKE, "SIYO_FLG=true"))

  ' 選択したプリンタをこのセッションで通常使うプリンタとして設定します。
  valPaperName = DLookup("PAPER_SIZE", TBL_NAME_PRT_UKE, "SIYO_FLG=true")

  Set Application.Printer = prt

  'DoCmd.openReport REPORT_NAME, acViewNormal, , , , acHidden
  DoCmd.openReport REPORT_NAME, acViewPreview, , , , acHidden
  
  DoCmd.SelectObject acReport, REPORT_NAME, True
  DoCmd.PrintOut

print_Report_Exit:
  Echo True

  print_Report = 0
  Exit Function

print_Report_Err:
  MsgBox Err.Description
End Function

レポート:
Private Sub Report_Open(Cancel As Integer)
  Dim valPaperName As Variant
  
  valPaperName = DLookup("PAPER_SIZE", TBL_NAME_PRT_UKE, "SIYO_FLG=true")
  
  Me.Printer.PaperSize = Left(valPaperName, InStr(1, valPaperName, " ") - 1)
  
End Sub

【8596】Re:Printerオブジェクトを使用したVBAでの...
お礼  leo  - 06/9/15(金) 14:59 -

引用なし
パスワード
   教えていただいたサイトは私も見つけていたのですが、acNormalで印刷
しなければいけないという思いにとらわれていたので読み飛ばしていました。

よく見たら雅さんの回答と同じ処理をしていますね。バカでした。
長々とお付き合いいただいてありがとうございました。
立ち寄りさんのご意見も問題を考える上で非常に参考になりました。

>対応策ですが、やはりオリジナルのフォームを作成して
>プリンタ出力するという方法はどうでしょうか?
>オリジナルフォームのサンプルは下記を参照。
>http://office.microsoft.com/ja-jp/assistance/HA010345531041.aspx

【8598】Re:Printerオブジェクトを使用したVBAでの...
発言    - 06/9/15(金) 16:37 -

引用なし
パスワード
   こんにちわ。雅です。

>プレビューにしたところ、無事に用紙サイズの変更を反映させることができました。以下に成功したコードを記載いたします。何かご意見があればお聞かせ下さい。

なるほど、こちらではプレビューも直接印刷も内容は変わらないだろうという
先入観から直接印刷では試していませんでした。申し訳ございません。

でわ。

1145 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078210
(SS)C-BOARD v3.8 is Free