初心者です。いろいろ調べてみて、ここまでたどりつきましたが(どなたかの質問を参考に)、これ以上わからなくなったのでこちらに投稿しました。

Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer)

Me.ScaleMode = 1
Me.ForeColor = 0

'一番左の縦線
Me.Line (0, 120)-(0, 6680)

End Sub

上記のコードで、罫線を引く方法はわかりました。ただ、私がやりたいことは、全てのレコードに対して線を引く方法でなく(それであれば、VBAを使うほどでもないので)、特定の位置に線を引く方法なのです。
もっとわかりやすく言うと、A4用紙に2つのレコードが印刷されるレポートになっております。その2つのレコードの真ん中に、いつも線を引く、ということをさせたいのです。
(要するに、切り取り線です)

このような場合、どうしたら可能になるか、どなたかヒントをいただけないでしょうか。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

LINEは論理的な位置ではなく、物理的な位置に線を引くだけです。


わたしが言う論理的とは、レコードの内容によってや、レコードの画面における出現数(2つおき)などによって(レコードの内容や数に関連づけて)線を引くようなことを言ってます。
これらは両者を結びつけた位置を計算して、直線を描くのは難しいでしょう。
ですから別の方のことの知識を得ないといけないとおもいます。
>、罫線を引く方法はわかりました
は、質問者のニーズに限って言えば、外れていると思います。
ーー
2レコード分の印刷レイアウトを上下に、1レコード分ずつ配置する設計を考え、真中にツールバーの直線(プロパティの指定で点線・太さ指定・色指定もあります)で引けばよいでしょう。
ーーー
しかし
アクセスのレポートでは、レコード処理はアクセス任せが標準なので、単純な1行ー1レコード明細印刷以外は、やさしくないと思う。
>レポート1ページに2レコード表示したい 、のほうが初心者には難しいのでは。
レポートの「オートレポートの単表形式」で「詳細」の高さ(1レコード分)を1ページの半分程度に拡げて、1ページ2レコード印刷にして、詳細で1レコード分の下のほうに直線を引いておくと
明細(奇数番レコード)
ーーー
明細 (偶数番レコード)
ーーー
になって下にも線が出てしまう。
そのため、これ以外の方法が無いか、あらためて質問したらどうですか。
    • good
    • 0
この回答へのお礼

どうもありがとうございます。わかりました。
もしかしたら私の書き方が間違っていたかも、という箇所があったのですが、それは2レコードを表示させる、と書いたことです。
1ページに、2ページ分が表示される、ということを意味して書きました。

おそらく書き方が悪かったと思いましたので、お詫びして訂正します。

お礼日時:2011/04/14 11:23

「詳細」の「印刷時」ではなく


「レポート」の「ページフォーマット時」で。

数値は試行錯誤で最適になるようにしてください。
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qアクセスのオートレポートで罫線の引き方について

まったくの素人です。よろしくお願い致します。タイトルどおりオートレポートの表形式ですが罫線を各行のレコードに入れたいのですがどのようにすればいいのでしょうか?よろしくお願い致します。

Aベストアンサー

そのレポートをデザインビューで開いて各レコードの下に引きたいのならば
ツールの直線をクリックして直線の開始位置をクリックして終了位置まで
ドラッグすれば直線が引けます。
罫線の太さ等はその罫線のプロパティを開いて[境界線スタイル]で罫線の
種類(実線や点線など)、[境界線幅]のポイント数の変更によって太さを
変更できます。
各レコードのフィールド自体に枠線を付ける場合は各フィールドを全て一列
に揃えて各フィールドのプロパティの書式にある[境界線スタイル]を透明
ではなく実線を選択するば各フィールド毎に枠線の付いた表のように出力
出来ます。

QACCESS IIF関数 複数条件の設定について

 選択クエリにおいて、あるフィールド「 X」 のレコード数値が
 
  0<[X]<=50   であれば A 
  50<[X]<=100  であれば B 
  100<[X]<=150  であれば C

 と表記させるフィールド「Y」を追加したいと考えています。
 この場合、Yのフィールド設定で指定する数式についてご教授願います。

 一応、
  IIf(0<[X]<=50,"A","") Or IIf(50<[X]<=100,"B","") Or IIf(100<[X]<=150,"C","")

  としましたが、実行すると、Yの列がすべて「-1」と表記されてしまいます。

 何卒よろしくお願いいたします。

Aベストアンサー

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A", [X]<=100, "B", [X]<=150, "C", True, "")


なお、数学あるいは一般生活では確かに「0<[X]<=50」という表記をしますが、
Accessの関数などではこれだと正しい結果が得られません。
正しく認識させるためには、等号・不等号を挟んだ式は、「左辺」と「右辺」の
2つの要素からなる形にする必要があります。
(「0<[X]<=50」は「[X]>0 And [X]>=50」と分割してやる、と)

但し、今回のご質問のような『連続した範囲』であれば、前(左)で既出となる
式の要素で「[X]<=0」が「真(=-1)」とならなかった時点で、「[X]>0」が保証
されますので、上記のように、「[X]>0」を省略して「[X]<=50」だけを条件として
指定すればOk、ということになります。
(「0<[X]<=50」の次が「80<[X]<120」などのように、「50~80」が欠けた
 場合は、省略ができない、と)


【参考】
「0<[X]<=50」は、このままだと「0 < ([X]<=50)」という式と解釈されます。
この場合、「[X]<=50」は、「真(=-1)」か「偽(=0)」か「Null」のいずれかに
なります。
何にせよ、「0<[X]<=50」全体として「正(=-1)」となることがないため、
ご質問の式では、IIF関数は常に第3引数に指定された値「""」を返す
ことになります。

この結果、式全体としては「"" Or "" Or ""」という形となり、「0かNull」
以外なので、「真(=-1)」という値が返された、ということです。

なお、Nullについては、以前、他の方の質問につけた回答も、併せて参考までに:
http://oshiete.goo.ne.jp/qa/4850675.html

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A"...続きを読む

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

Q【ACCESS】フォーム名/コントロール名を文字列型変数で指定するには

バージョン:Access2002

フォーム「frm01」にテキストボックス「tb01」が作ってある場合、
Forms.frm01.tb01.Value="あいう"
とすれば、フォームもコントロールも指定できるのですが、
Dim strTxt As String
strTxt = "tb01"
Forms.frm01.strTxt.Value="あいう"
だと、文字列型変数"strTxt"が展開されないのでフォーム「frm01」のコントロール「strTxt」を探してしまいエラーになってしまいます。

文字列型変数でフォームやコントロールを指定するには、どのようにすればよいのでしょうか?

Aベストアンサー

フォームの場合
 Forms(strFrm)

フォームのコントロールの場合
 Forms(strFrm).Controls(strTxt)


これでも参照できますが、普通ここまで省略しませんね。
 Forms(strFrm)(strTxt)

あとで見たとき、訳がわからなくなりそう。

QAccessでレポート内の繰り返しレコードの行数を固定したいです。

Accessでレポート内の繰り返しレコードの行数を固定したいです。

Access2007を使っています。

社内のフォーマットに合わせた物品購入申請書のようなものを
Accessのレポート機能を使って印刷したいと思っています。

大きく2つのテーブルから構成されます。

 (申請書テーブル)
  1文書に1レコードが該当するもの
  書類番号、申請日や申請者名、購入目的等が入ります。

 (購入物品テーブル)
  1文書に複数のレコードが該当するもの
  購入する物品の名前や金額等が入ります。
  書類番号を外部キーとして申請書テーブルとリンクします。


レポート機能で、この二つのテーブルを対象として、
(正確には、申請書テーブルはフォーム上で開いているレコードのみを対象と
 するために、クエリを仲介して)
購入物品は繰り返しにするようにすることで、ひととおり形にはなったのですが、
1つうまくいかないことがあります。

社内のもともとの手書き用フォーマットには、購入物品の記入枠が20行あります。
これは多めにつくってあるので、当然購入物品数が20以下の場合は、残りの行は
空白になっています。
しかし、Accessのレポートで作ったものは空白行がなく、おかげで購入物品件数
により「詳細」と「フッタ」の間の不自然な空白が広くなったりします。

フッタと言っても、内容的には、「上記物品の購入云々~、お願い致します。」
とかサインするエリアとかですので、繰り返しが終わったらすぐに開始をして
ほしいのです。

購入物品の数に関わらず全体の行数を20に固定する方法はありますでしょうか?

Accessでレポート内の繰り返しレコードの行数を固定したいです。

Access2007を使っています。

社内のフォーマットに合わせた物品購入申請書のようなものを
Accessのレポート機能を使って印刷したいと思っています。

大きく2つのテーブルから構成されます。

 (申請書テーブル)
  1文書に1レコードが該当するもの
  書類番号、申請日や申請者名、購入目的等が入ります。

 (購入物品テーブル)
  1文書に複数のレコードが該当するもの
  購入する物品の名前や金額等が入ります。
  書類番号...続きを読む

Aベストアンサー

レコードがない場合も用紙の最後まで罫線を出力する
http://hatenachips.blog34.fc2.com/blog-entry-17.html

レポートに関してはトップクラスの hatena さんのページです。

参考URL:http://hatenachips.blog34.fc2.com/blog-entry-17.html

Qaccess レポートで罫線を最後まで出力する方法

accessのbvaの本を参照してレコードがない場合でも最後まで罫線を出力する方法を試しているのですが、インクリメントがうまくいっていないのかいつまでも改ページを続けてしまいます。

どなたか解決する方法を教えてください。

Option Compare Database
Option Explicit
'次の3つの変数はdeclarationセクションで宣言します
'現在印刷中のレコード番号を表す変数
Private pintRecord As Integer

'レコードソースの全レコード数を表す変数
Private pintRecordMAX As Integer

'1ページ当たりに印刷するレコード数の定数
Private Const cintRecperPage As Integer = 15

Private Sub グループヘッダー0_Format(Cancel As Integer, FormatCount As Integer)

'現在印刷中のレコード番号を初期化します
pintRecord = 0

'レコードソースの全レコード数を取得します
pintRecordMAX = DCount("*", "T_出荷明細", "出荷No=reports![R_出荷証明書3 test]![出荷No]") '"*"にすることでクエリ内のレコード数をカウント。Null値フィールドを含むレコードも対象。

End Sub


Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)

'各テキストボックスの可視/非可視のフラグ
Dim blnVisible As Boolean

'現在印刷中のレコード番号をインクリメントします
pintRecord = pintRecord + 1

If (pintRecord Mod cintRecperPage) > 0 Then
'1ページ内の途中のレコードを印刷している場合

'改ページしないようにします
Me!bpage.Visible = False

'印刷するレコードの位置によって、各テキストボックスの可視/非可視の
'フラグと、次レコードへ進めるかどうかの設定を行います

If pintRecord < pintRecordMAX Then
blnVisible = True
Me.NextRecord = True

ElseIf pintRecord = pintRecordMAX Then
blnVisible = True
Me.NextRecord = False

Else
blnVisible = False
Me.NextRecord = False

End If

Else
'1ページ内の最後のレコードになったとき

If pintRecord <= pintRecordMAX Then
'まだ印刷するレコードが残っているときはその行を印刷後、改ページします
blnVisible = True
Me!bpage.Visible = True

Else
'印刷するレコードがもうないときはその内容は印刷しません
blnVisible = False

End If

End If

'フィールドと連結したテキストボックスの可視/非可視を設定します
Me![品番].Visible = blnVisible
Me![品名].Visible = blnVisible
'Me![寸法使用].Visible= blnvisible
Me![数量].Visible = blnVisible
Me![備考].Visible = blnVisible

End Sub

accessのbvaの本を参照してレコードがない場合でも最後まで罫線を出力する方法を試しているのですが、インクリメントがうまくいっていないのかいつまでも改ページを続けてしまいます。

どなたか解決する方法を教えてください。

Option Compare Database
Option Explicit
'次の3つの変数はdeclarationセクションで宣言します
'現在印刷中のレコード番号を表す変数
Private pintRecord As Integer

'レコードソースの全レコード数を表す変数
Private pintRecordMAX As Integer

'1ページ当たりに印刷するレコード...続きを読む

Aベストアンサー

私の設定は「T_出荷明細」でレポートを
作成したので、No7は必要ないですね。

一応、フォームとT_出荷証明書とクエリを作成して
実行しました。ほぼ直すところは
なく正常に動くのですが。


補足について:

(1)
>行数が実際のレコード数が28であったら14行改ページ
>(ヘッダー除き)なので通常は2ページちょうどになる
>はずなのですが、1ページと13行になります。

これは、質問のコードの中で、

'1ページ当たりに印刷するレコード数の定数
Private Const cintRecperPage As Integer = 15

としているので、レコードが15行まで表示され、
15以上になると次のページに表示される、
ということなので、
>1ページと13行になります。
は正常ですが。

(2)
>あとループも止まりません。
これはどのような状況ですか。

QAccessのマクロでモジュールを実行させたい。

Access2002を勉強中の初心者です。

AccessでDB1という名前のデータベースを作成し、その中で、モジュール1というモジュールを作成しました。これを実行するマクロを作成したく、次のようにマクロを作成しました。
マクロのデザイン画面でアクションに「プロージャの実行」を選択、プロージャ名入力覧の右側の...のボタンを押して式ビルダ画面を表示、ここの「関数」フォルダを開いてDB1を選択、表示されたモジュール1を貼り付けてOK。
しかし、このマクロを実行すると、次のエラーとなります。「DB1 指定されたDB1が見つけることができない関数名が含まれています」

根本的に方法が間違っているのでしょうか?
アドバイスをよろしくお願いします。

Aベストアンサー

#1です。

ちょっと時間ができたので、Accessのヘルプで、
 "RunCode/プロシージャの実行" アクション
についてのトピックを見てみました。

結論から言うと、基本的な考え方が間違っているみたいです^^;。

「プロシージャの実行」アクションでは、「Function」プロシージャを指定するようです。
Subプロシージャではエラーになります。


つまりご質問の件では、
「Subプロシージャを呼び出すFnctionプロシージャ」をまず書かなけれえばならない。
そして、マクロのアクションでは、あらためてこのFunctionプロシージャを指定しなければいけません。

QアクセスVBAのMe!と[ ]

基本的なことですみません。

アクセスのイベントプロシージャで、Me!ってありますけど、これはどういう意味なんでしょうか?

また、Me!の後に、Me!.~~と書く場合と、Me!.[~~]と書く場合がありますが、どこが違うのでしょうか?

Aベストアンサー

>プロシージャ内で[]を使う場合は、そのフォーム外のオブジェクトを使う場合と考えてよろしいでしょうか?
別のオブジェクトを使う場合だけではありません。
Hensu = Me![Text1]のようにHensuという変数に自身のTest1の値を代入する場合のように。
[]で括られているのがオブジェクト名やコントロール名だよという事。
クエリの抽出条件に存在しない[?]とすれば?というコントロール等が参照できないので?というダイアログが表示されるように?というオブジェクトやコントロールは何?と聞いてくるように。
>フォーム内のオブジェクトの場合はあくまでMe!で良いのでしょうか
Forms.[フォーム名]![コントロール名]やForms![フォーム名]![コントロール名]が構文。
アクティブなフォームが自分自身ならForms![フォーム名]の変わりにMeでもOKですという事。

と言う解釈の方が良いと思います。

QAccessのレポート上のテキストボックス値を設定したい

AccessのVBAを使っているのですが、作成したレポートに貼り付けたテキストボックスに値を入れることができません。

Report名.textbox名 = "設定したいデータ"

↑とすると「このオブジェクトに値を代入することはできません。」とエラーメッセージが出ます。
どのようにすれば、値を代入することができるのか教えてください。

Aベストアンサー

質問の意図が不明ですので、複数の回答を・・・。

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
  Me.テキスト0 = "AAA"
End Sub

Private Sub コマンド0_Click()
  DoCmd.OpenReport "レポート1", acViewDesign
  Reports("レポート1").Controls("ラベル0").Caption = "AAA"
  DoCmd.Close acReport, "レポート1", acSaveYes
End Sub

前者は、テキストボックスにレポートを表示、印刷する際に"AAA"を代入しています。
後者は、テキストボックスではなくラベルコントロールを利用して"AAA"をフォームのコマンドボタンで代入しています。

Qサブフォームに対してGoToRecordするには?

フォームに対してRequeryすると先頭のレコードへ移動してしまうので
Requeryする前のレコードの番号を取得して
Requery後にそのレコード番号へ移動したいのですが

Sub test()
i = Forms("Form").Controls("SubForm").Form.CurrentRecord
Forms("Form").Controls("SubForm").Requery
DoCmd.GoToRecord acActiveDataObject, Forms("Form").Controls("SubForm"), acGoTo, i
End Sub

これをすると、実行時エラー2498
指定した式は、いずれかの引数とデータ型が対応していません。
になりますが、
どこがおかしいのでしょうか?

Aベストアンサー

【要旨】
サブフォームのレコード移動では、対象サブフォームは引数で指定するのではなく、
SetFocusメソッドで移動後、引数を省略したGotoRecordを使用します:
  Forms("Form").Controls("SubForm").SetFocus
  DoCmd.GotoRecord , , acGoto, i

但し、「Requery前後でのレコード移動の回避」が目的の場合は、Requeryの
対象を「親フォームまたはサブフォームのFormオブジェクト」ではなく「サブフォーム
コントロール」とすればOkです。
 <現状・例1>
  Forms("Form").SetFocus
  DoCmd.Requery
 <現状・例2>
  Forms("Form").Requery
 <現状・例3>
  Forms("Form").Controls("SubForm").Form.Requery
 <代替策>
  Forms("Form").Controls("SubForm").Requery
  ※「現状・例3」との違い(→途中の「.Form」の有無)に注意。


【詳細】
> 実行時エラー2498

このエラーの直接の原因は、GotoRecordメソッドの第2引数に指定している
「Forms("Form").Controls("Subform")」の部分です。

ここに指定するのはオブジェクト名になりますが、そのデータ型は文字列型です。
一方、「~.Controls(~)」の形で指定した場合、取得できるのは
 a)オブジェクトそのもの
 b)そのオブジェクトのデフォルトプロパティ
のどちらかです(→状況によって変化します)。
(例えばテキストボックスなら、TextBoxオブジェクトまたはValueプロパティの値)

サブフォームのデフォルトプロパティは調べていませんが(汗)、少なくとも文字列
型のプロパティではないため、「型が一致しない」とのエラーとなります。
サブフォームのコントロール名を取得する場合は、
  Forms("Form").Controls("SubForm").Name
というように、Nameプロパティを明示的に指定する必要があります。

ただ、「サブフォームのレコード移動」の場合、明示的に「Name」プロパティを
指定しても解決には至りません(汗)
これは、GotoRecordメソッドの第2引数には、直接開いているオブジェクトの
名前のみが有効なためで、サブフォームを直接的に指定することはできない、
ということです。
(注:Microsoftの資料を探したわけではなく、経験則から記述していますので、
 私の勘違いでしたらご容赦願います(汗))

サブフォームのレコード移動には、冒頭に記述したとおり、「フォーカスの移動」と
「一部の引数を省略したGotoRecord」を使用します:
  Forms("Form").Controls("SubForm").SetFocus
  DoCmd.GotoRecord , , acGoto, i

なお、これも冒頭に書きましたが、サブフォームのRequeryの仕方には幾つか
方法がありますが、Requeryの対象を「コントロールとしてのサブフォーム」にすれば、
レコード移動が発生しませんので、GotoRecord自体が不要になります。
http://www.f3.dion.ne.jp/~element/msaccess/AcTipsFrmHowToRequeryAndReturn.html

【要旨】
サブフォームのレコード移動では、対象サブフォームは引数で指定するのではなく、
SetFocusメソッドで移動後、引数を省略したGotoRecordを使用します:
  Forms("Form").Controls("SubForm").SetFocus
  DoCmd.GotoRecord , , acGoto, i

但し、「Requery前後でのレコード移動の回避」が目的の場合は、Requeryの
対象を「親フォームまたはサブフォームのFormオブジェクト」ではなく「サブフォーム
コントロール」とすればOkです。
 <現状・例1>
  Forms("Form").SetFocus
  DoCmd.Requery
 <現...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報