• 締切済み

ACCESSレポートで頁フォーマット時にVBコードで頁の余白を指定するには?

ACCESSレポートで頁ごとに、余白の設定をしたいので、 メニューの[ファイル]-->[余白]で余白を設定するのではなく、 頁フォーマット時にVBコードで頁の余白を指定したくて 以下のようなコードを書いてみたのですが、うまくできません。 Private Sub Report_Page()  Msgbpox Me.Left End Sub とレポート内のモジュールに書くと、左余白のインチが表示されたので、 Private Sub Report_Page()  Me.Left = 567 * 3 End Sub と入力しましたが、 「このプロパティは読みとり専用であるため。。。」 というエラーが表示されてしまいました。 何か良い方法を教えて下さい。

noname#3357
noname#3357

みんなの回答

  • ARC
  • ベストアンサー率46% (643/1383)
回答No.4

Accessの場合、ページごとに動的に余白を設定する機能はありません。 ですから、「ページごとにすべてのコントロールを移動させる」ことによって対処します。 すべてのコントロールを右に100twips 移動させるには、 Dim CTL as Control For Each CTL In Me.Controls CTL.Left=CTL.Left + 100 Next CTL ってなコードを適当なFormatイベントの中に書いてやります。 実際にコーディングするなら、Open時にコントロールの初期位置を配列に読み込んでおいて、それに加減算するって形が扱いやすいかな… 尚、静的に余白を設定するんであれば(既に回答があるように)PrtMipプロパティを使うといいです。 application.echo false docmd.OpenReport "Report_Name",acViewDesign '-適当にPrtMipを設定- docmd.close acreport,"Report_Name",acSaveYes application.echo true こんな感じ。

noname#3357
質問者

補足

回答ありがとうございました。 なるほど。 さっそく、やってみますね。 助かりました。_(._.)_

  • maro
  • ベストアンサー率47% (95/199)
回答No.3

何万件ものレコードをそのまま印刷するのですね?それじゃあExcelに吐き出すのは無理ですね。Excelは最大3万行ちょっとですからね。 OLEでExcel上にデータを書き込むのは結構遅いみたいです。ExcelのオブジェクトのVisibleをTrueにしてみると、書き込んでいく様子が見えますから(^^;)。 データの抽出に時間がかかるということならSQL Serverに置き換えたらいかがでしょう?Access2000ならSQL Server互換のMSDEが使えますし。MSDEならWindowsNTでなくてもWindows95/98で動作しますし、サーバーとクライアントを同じマシンで運用できます。(というか、MSDEをインストールしたマシンでAccessを動かすということですね)Access97から別のマシンにインストールしたMSDEにアクセスすることも可能です。 12万件程度のレコードがあるテーブルからレコードを抽出するのにMDBファイルならかなり時間がかかるのにSQL Server(MSDE)ならあっという間にすんでしまいます。 見当違いな答えでしたらごめんなさい。

noname#3357
質問者

補足

SQL Server互換のMSDEですか。勉強してみます。 たくさんのアドバイスありがとうございました。

  • maro
  • ベストアンサー率47% (95/199)
回答No.2

補足を拝見しました。 すみません。こちらもAccessのヘルプを「余白」で検索したら「PrtMipプロパティ」というのがあったので、検証もせずにそのまま答えを送信してしまいました。 「参照のみ可能」ということは、ページフォーマット時に余白の値は参照できるけど、設定はできないということなので、できないのかもしれません。 一つのページごとに別々のレポートに出力するとか?そういうのはだめでしょうか? 基本的に私はAccessのレポートは融通が利かないので嫌いです(^^;)。 反則技になりますが、Wordではページごとに印刷設定ができますから、OLEでWordに値を出力して印刷させてはいかがでしょう?(差し込み印刷になりますか?) ちなみに私の場合ですが、帳票類を印刷するときにはExcelに値をOLEで貼り付けて印刷しています。その方が印刷に関してはかなり融通が利きます。ついでに複雑な計算類もExcel上でやらせています。Accessでは抽出した値をExcelに貼り付けるだけですみますので。

noname#3357
質問者

補足

maroさん、助言、ありがとうございます。 おっしゃる通りで、excelの方が融通が利きますよね。 私もword、excel等での出力も考えたのですが、 今現在、約60000レコードでカラム数も多く、 将来的には、7万、8万レコードになることも考慮すると、 excel97では、1シート内に収まらないし、 wordに7万、8万レコードを排出するのは無理がある。(と勝手に決めつけました。) それで、Accessのレポートで、出来るといいな と思ったのですが、安易ですね。(^^;) ページごとに別々のレポートに出力する方法をとろうか 思います。 ありがとうございました。m(_ _)m ところで、OLEの話がありましたので、 OLEのことで質問してもよろしいですか? 処理レコード数は4万程度なんですが、 OLEを使って、ACCESSデータをEXCELにデータを書き込むと、 処理速度がとっても遅いのです。 今は、ACCESSデータをテキストにし、EXCELのVBAでそのテキストを読み込んで、 書き込むという、いわば回り道みたいな方法をとっているのですが、 (ACCESSデータをテキストする時間をあわせてもこちらの方が私には処理速度が速く感じるので) OLEを使ったコーディングが悪いのでしょうか? 勉強不足ですみませんが、教えていただけないでしょうか。

  • maro
  • ベストアンサー率47% (95/199)
回答No.1

PrtMipプロパティというのがあります。それを使うとできそうです。 AccessのHELPをみてください。

参考URL:
Accessのヘルプ
noname#3357
質問者

補足

回答ありがとうございます。 さっそく、PrtMip プロパティのヘルプを見てました。が、 「デザイン ビューでは変更が可能ですが、その他のビューでは参照のみ可能です。」と書いてあり、 実際に使用例を利用してコードを書いてみて、プレビューすると、 エラーがでてしまいます。 このプロパティを理解できてないからかもしれません。 プレビュー時に、データの内容によって、余白を変更したいのですが、 無理なのでしょうか?

関連するQ&A

  • アクセスレポートのグループごとのページ付番について

     Accessレポートのグループごとにおける、ページ付番についてお聞きします。  私なりにインターネットで調べて、下記モジュールを記述しました。レポートの状況は、次のとおりです。 ①グループ化している項目は「全体管理番号」で、ページはページフッターに「GPページ数」名のテキストボックスに表示しています。 ②「Pages」を参照するテキストボックス(コントロールソース =[Pages])を「総ページ取得」名で、ページフッターに非表示配置しています。 ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ Option Compare Database Dim d As Object Dim brk As Variant ------------------------------------------------------------------------------- Private Sub Report_Open(Cancel As Integer) Set d = CreateObject("scripting.dictionary") End Sub ------------------------------------------------------------------------------- Private Sub ページフッターセクション_Format(Cancel As Integer, FormatCount As Integer) If Me.全体管理番号.Value <> brk Then Me.Page = 1 brk = Me.全体管理番号.Value End If If Me.Pages > 0 Then Me.GPページ数 = Me.Page & "/" & d(Me.全体管理番号.Value) & "ページ"  End If End Sub ------------------------------------------------------------------------------- Private Sub 全体管理番号_フッター_Format(Cancel As Integer, FormatCount As Integer) If Me.Pages = 0 Then    d(Me.全体管理番号.Value) = Me.Page End If End Sub -------------------------------------------------------------------------------  この内容で印刷プレビューをした結果、複数ページになる場合は正しく表示になるのですが、複数ページにならない1ページのみの場合はなぜか「1/5ページ」や「「1/3ページ」となり、「1/1ページ」となりません。  「1/1ページ」表示となるようにするには、どこを修正すれば良いかお教え願いたいと思います。 どうぞよろしくお願いいたします。

  • Access2003 レポートの合計の出し方

    お世話になっております。 Access2003のレポートで下記のようなコードで価格の合計を求めようとしています。 1ページですとこれで合計は表示されるのですが、レポートが2ページ以降になると最終ページの合計が表示されます。 最終ページの最後にすべての合計を出したいと思っています。 ご教授いただければ幸いです。よろしくお願いいたします。 Option Compare Database Dim a As Variant Private Sub ページヘッダーセクション_Format(Cancel As Integer, FormatCount As Integer) a = 0 End Sub Private Sub グループヘッダー3_Print(Cancel As Integer, PrintCount As Integer) a = a + Me.価格 End Sub Private Sub レポートフッター_Print(Cancel As Integer, PrintCount As Integer) Me.合計 = a End Sub

  • アクセス レポートに線引き

    アクセス2000のレポートです。 Private Sub 詳細_Format(~~ If Me.CurrentRecord Mod 5 = 0 Then Me.Line (~~~~ End If End Sub のように、5行おき線を引いています。 でも、1ページ目が全部で18行だとすれば、2ページ目は3行目に線が引かれます。 改ページされたら、また5行目に線を引くにはどうしたらよろしいでしょうか?

  • Accessのレポートで開くと「読み取り専用なので…」と出る。

    今まで通常通り表示できていたレポートを、詳細のところを白/グレーのストライプにしようと思い、以下のコードを追加しました。 Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer) Count = Count + 1 If Count Mod 2 = 1 Then Me.Section(0).BackColor = 16777215 Else Me.Section(0).BackColor = 12632256 End If End Sub すると 実行時エラー'2135' このプロパティは読み取り専用であるため、設定できません。 と出てしまいました。 どこがダメなのでしょうか?

  • ACCESSでラベルの余白と高さ、幅を設定する

    ACCESS2007でラベル印刷を印刷をしようとしています。 ページ設定ができないランタイム環境でも使えるようにラベルの印字位置を設定するVBAを考えています。 フォームに設定値を入力する「上余白」、「左余白」、「ラベル幅」、「ラベル高さ」という非連結のテキストボックスを4個作りました。 ラベル印刷用にレポートを作成し、「レポートA」としています。 レポートAにはページ設定で、基本となるラベルのレイアウトなどを設定しています。 フォームに「適用」というボタンを配置し、クリック時のイベントに以下のようなコードを書き込みました。 Private Sub 適用_Click() DoCmd.OpenReport ("ラベルA"), acViewDesign, , , acHidden With Reports(ラベルA).Printer .DefaultSize = False .TopMargin = Me.上余白.Value .LeftMargin = Me.左余白.Value .ItemSizeWidth = Me.ラベル幅.Value .ItemSizeHeight = Me.ラベル高さ.Value End With DoCmd.Close acReport, ("ラベルA"), acSaveYes End Sub 動作させるとエラーは出ないのですが、設定値がちっとも反映されません。 何が間違っているのでしょうか?

  • アクセスについてです(レポート)

    フォームからレポートを開く時に、 VBAでコントロールにコントロールソースを指定したいのですが どうやらエラーになってしまうようです。 フォームからではなく手動でレポートを開く場合は エラーにはなりません。 レポートのレコードソースは、T_testを指定していて、 その上にあるコントロールは非連結で指定したコントロールソースをvbaで入れたいです。 なので、レポートのLoadイベントで Private Sub Report_Load() Me.テキスト0.ControlSource = "8月" End Sub として、手動でレポートを開く分には問題ないのですが このコードのまま、フォームから Private Sub コマンド0_Click() DoCmd.OpenReport "レポート1", acViewPreview End Sub とすると、Me.テキスト0.ControlSource = "8月"で、 実行時エラー2191 印刷プレビュー時または印刷を開始した後は コントロールソースプロパティを設定できません。 のエラーが発生します。 フォームから Private Sub コマンド0_Click() DoCmd.OpenReport "レポート1", acViewDesign End Sub とすると、レポートのLoadイベントが発生しませんでした。 ご回答よろしくお願いします。

  • アクセスレポートのセクション繰り返しについて

     いつもお世話になっております。  アクセスレポートの「セクション繰り返し」についてお聞きいたします。  グループ化した項目名をグループヘッダー0セクションにテキストボックスを配置して、「セクション繰り返し」を「はい」にし、印刷した際はそのグループ化した項目名がグループ化した全ページに印刷なるようにしました。  また、当該レポートではグループ化を2つしており、最初のグループ化(グループヘッダー0)で連番をふっています。 この最初のグループ化に連番をふるモジュール等は次のとおりです。 1 詳細セクションに非連結の「通し番号_GP」を配置し、ここにグループ化ごとの連番が表示なるようにしています。 2 グループヘッダー0セクションのフォーマット時に下記のモジュールを配置しています。  Private Sub グループヘッダー0_Format(Cancel As Integer, FormatCount As Integer)  Me!通し番号_GP = 0  End Sub 3 詳細セクションのフォーマット時に下記のモジュールを配置しています。  Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)  If FormatCount = 1 Then  Me!通し番号_GP = Me!通し番号_GP + 1  End If  End Sub  ここで、グループヘッダー0の「セクション繰り返し」を「はい」にして印刷をすると、1ページ目は正しく連番になるのですが、2ページ目になると0から始まってしまい、連番でなくなってしまいます。  また、グループヘッダー0の「セクション繰り返し」を「いいえ」にして印刷をすると、今度は正しく次のページも連番となります。  別のグループ化のページになった際も、正しく1から始まり連番となります。  このように上手く連番がふることができず困っています。  希望する形としては、グループ化した名称がグループ化した全ページに印刷になること、さらにこのグループ化ごとの連番が次のページになっても正しく表示されることとなります。  上手く説明ができませんが、どうぞご教示くださいますようお願いいたします。

  • アクセス レポート バックカラーの変更方法

    現在レポートで1行ごとにバックカラーを変えて印刷しておりますが、それをチェックボックスにチェックがはいった行だけをカラーにするよう変更したいと考えておりますが、よくわかりません。現在のコードをコピーしました。お手数ですがご指導願います。 Option Compare Database Dim bline As Integer Private Sub Report_Open(Cancel As Integer) End Sub Private Sub ページヘッダー_Format(Cancel As Integer, FormatCount As Integer) bline = 0 End Sub Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer) bline = bline + 1 If bline Mod 2 Then Me.Section(0).BackColor = 16777215 Else Me.Section(0).BackColor = 12663225 End If End Sub

  • アクセス2003 レポートの総ページ数の取得

    アクセス2003 レポート VBAです。 先にレポートを開き、次にその用紙の設定をするフォーム「A」を開きました。 「A」にあるラベルにレポートの総ページ数を表示させたいのですが、レポートの[Pages]をどのように取得したらよいか教えて下さい。 Private Sub Form_Open(Cancel As Integer) ラベル.Caption = Str(Reports!レポート名![Pages]) End Sub のように、簡単に取得できたらいいのですが。。。

  • Access レポートの詳細Formatに複数の式

    いつもお世話になっています。 レポートの詳細に結婚して姓が変更になった場合、旧姓に取り消し線を引く という式を作成しました。 Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer) If 新姓 <> "" Then Me.取り消し線1.Visible = True Me.取り消し線2.Visible = True Else Me.取り消し線1.Visible = False Me.取り消し線2.Visible = False End If End Sub 今回は、住所も変更になって新住所が入力されたら、旧住所に取り消し線を引きたいと 思います。 ただし、変更にならない場合もあるので、別のIF文になります。 Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer) If 新住所 <> "" Then Me.取り消し線3.Visible = True Me.取り消し線4.Visible = True Else Me.取り消し線3.Visible = False Me.取り消し線4.Visible = False End If End Sub レポートの詳細_Formatに複数の条件を設定することができるのでしょうか。 お力添えをお願いいたします。

専門家に質問してみよう