今、アクセス2000を使ったちょっとしたデータベースシステムを構築してます。
その中で、マクロを使ってレポートのカレントレコードだけを印刷させたいのですが、データベース全体のレコード全件が印刷されてしまいます。
どなたか、カレントレコードだけをマクロ印刷させる方法をご存知の方ご教授下さい。よろしくお願いします。

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

A 回答 (2件)

ん~VBAってそんなに難しいかな?


とりあえずマクロのやり方書くけど・・・前のカット&ペーストしてみてね!

マクロを選択してツールのマクロの「マクロをVisual Basicに変換」して
必要な部分だけ切り取っただけだし・・・。前回記述したことを忠実に実行
するだけで、カッコいい感じで使えますよ。

説教ではありません。不愉快だったらごめんなさい!

>[Aテーブル]![id]=[Forms]![Aフォーム]![id]
で出来ます。
解説すると連番が必要だって前に説明しましたよね。
1~200件位だっけ?※無い場合はムリ!がんばって付けてね。
厳密には方法が無いわけじゃないけど、説明が長くなるからムリ!

その番号を仮にIDとします。
元になる(200件入っている)テーブルをAテーブルとします。
そのテーブルを元に作ったフォームをAフォームとします。

難しく考えないで「Aフォームに表示されている数字(ID)=Aテーブルにある
レコードを印刷してください!」となる。

もっと簡単にいうと画面に見える物と同じレコードを印刷しなさい!となる。
私も始めて「マクロ」って作りましたが、動きました。

※ちょっと質問
1.フォームって使ってるよね?
2.コンボボタンとかも使ってるよね?
出来なかったら・・・追記してね。
    • good
    • 0
この回答へのお礼

 回答ありがとうございます。できました!!
構文は[Aテーブル]![id]=[Forms]![Aフォーム]![id] だったんですね。
私は[Aレポート]![id]=[Forms]![Aフォーム]![id] とやってしまって上手くいかなかったんです。
(マクロを実行すると)全件がいきなり印刷されたり、パラメーターの入力を求められたりと、もーワケわからん状態だったので、スッキリしました。
心の余裕ができたので、VBAの方もやってみます。

お礼日時:2002/03/05 23:58

マクロはあまり使わないので間違っていたら御免なさい!


「印刷」を行うときには、「レポートを開く」を選択しますよね?
その際にWhere条件ってのが存在すると思うんですけど、そこにSQL文を
書くことになると思います。

※印刷の際カレントレコードのみ出力するにはIDのような「キー」が必要に
なります。まあ重複しない数字ですよね。
↑があると仮定します。単純に「=ID」のような記述ではないのでしょうか?
詳細がわからないとこれ以上はムリですね!

AccessVBAで書くとしたら↓
適当なフォームにボタン(コマンドボタン)を付ける所までは一緒です。
プロパティ→イベント→クリック時にマクロの設定してますよね?
そこを
プロパティ→イベント→クリック時に右側の「...」三点リーダーみたいな
のをクリックして「コードビルダ」を選択して下さい。
Private Sub コマンド0()
End sub
↑って画面が出てくると思うんですけど、そこに↓をカット&ペーストして
下さい。※ちゃんとPri~の後にスペースを空けてEnd~の間に入れてね!

'----------------------更新・印刷作業-----------------------

Dim lngID As Long   '変数宣言ってやつです。
Dim kosyin As Integer  
'Dimはお約束→Kosyin適当な名前→asもお約束→Integer(数字)型が入ります。

'保存
kosyin = MsgBox("更新しますか?", vbYesNo)
If kosyin = vbNo Then
'Noだったら
Exit Sub
'閉じる
End If
DoCmd.RunCommand acCmdSaveRecord  'レコードの保存

'印刷
lngID = MsgBox("印刷を行いますか?", vbYesNo)

If lngID = vbNo Then
Exit Sub
End If
'上は同じ事してる。

'ここからが印刷ね!
lngID = Me.txt1.Value

'さっき変数宣言した適当な名前の中にIDを入れます。
'IDはさっき開いていたフォームのテキストボックスに表示されていることが条件
'IDのテキストボックスの名前を[txt1]の所に入れてみて!

DoCmd.OpenReport "印刷", acViewPreview, , "lngID=" & lngID
'acViewPreview を選択するとプレビュー acViewNormalは印刷
'ここは印刷を行う所です。「印刷」の所に自分のレポート名を入れてみてね。
'以上で更新作業から印刷までの流れです。
'マクロ使うより軽く出来るし、何よりカッコいいでしょ?(笑)

'質問があれば、追記してください。(暇な時に返事します。)
    • good
    • 0
この回答へのお礼

 大変親切なご回答ありがとうございます。VBAの方は私のスキルではついて行けませんので、マクロの式をご教授頂けると助かるのですが……
 前提条件はご推察の通りです。マクロの「レポートを開く」をフォーム上のボタンに貼り付けてます。そこでWhere条件にどういう構文を入力すれば良いのかでつまづいてます。今、仮に200件あるデータのうち5番目のデータがフォームとして画面上に表示されていたとします。この5番目のデータだけをレポートとして印刷させたいのですが、上手くいかないのです。1番目から全件のデータのレポートが出力されてしまいます。
 時間が出来ましたら、教えてくださいませ。

お礼日時:2002/03/03 00:07

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

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

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

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

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

Qアクセスで特定のレコードのみのレポートを印刷したいのですが。

アクセス2003である特定のレコードのみのレポートを印刷したいと思っています。現在開いているフォームのレコードのみを印刷(レポートとして)印刷するには、ファイル→印刷→ページ指定で現在印刷しているのですが、他に方法はないでしょうか?単に「レポートの印刷」とすると全てのレコードが印刷されてしまいます。今のところ特定のレコードのみ印刷するには、まずページ数を調べなければいけないので不便です。せっかくパラメータクエリなどで、そのレコードのフォーム画面を表示させても、レポート印刷につながらないので、どなたか良い方法を教えていただけないでしょうか?よろしくお願いいたします。

Aベストアンサー

レポートの基となるクエリを開きます。
フォームに表示されている項目の中で主キーとなるフィールドがどれかを決めます。
そのクエリの中でその主キーフィールドのWHERE条件の欄を選択してビルドを開きます。
レポートを選択するフォームの一覧を開きます。
先ほど選んだ主キーの項目を選んでダブルクリックします。
Ok
そうすれば、フォームから印刷ボタンを押せば開いているページだけが印刷されます。
但し、複数ページの指定をするには、更に複雑な設定が必要ですが、
今の照会した方法を応用すればできるはずです。

QACCESS フォームをそのまま印刷について

お世話になります。
ACCESSのフォームを印刷する方法ってどうすればいいのでしょうか?レポートは使いたくなくて・・・・
ボタンをクリックしたらボタンを非表示にして印刷させたいのですが、やり方がわかりません。
また、印刷プレビューを表示させるボタンも作りたいのですが・・・

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

Aベストアンサー

>ACCESSのフォームを印刷する方法ってどうすればいいのでしょうか?
普通に[ファイル][印刷]とすれば印刷できます
どのような形で印刷されるかは印刷プレビューで確認できます

>ボタンをクリックしたらボタンを非表示にして印刷させたいのですが
VBAなら印刷はPrintformメソッドです
印刷時非表示はDisplayWhenプロパティーで設定できます

>印刷プレビューを表示させるボタンも作りたいのですが・・・
プレビューはレポートにしかないようですね
フォームは表示されているんですよね、だったら要らないのでは

>レポートは使いたくなくて・・・・
フォームと同じフォーマットのレポートなら
右クリック、名前をつけて保存でレポートを選ぶだけで簡単に作れますよ

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

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

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

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

Aベストアンサー

#1です。

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

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

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


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

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の複数レポートの印刷について。

ACCESS2000の初心者です。
困ったことにACCESSのレポートが複数あり、それを何とかして一括連続で印刷できないでしょうか?
できれば手順なども書いていただけるとありがたいのです…。
何卒宜しくお願いいたします!

Aベストアンサー

>ACCESSのレポートが複数あり、それを何とかして一括連続で印刷
マクロやプロシージャを使って一括で複数のレポートを印刷することができます。
マクロの新規作成でアクションに[レポートを開く]を選び下に表示されるレポート名に印刷したいレポートを選びます。ビューは[印刷]で。
次の行以降に続けて印刷したいレポートを同様に順次設定します。
マクロを名前を付けて保存します。
保存したマクロを実行すれば設定したレポートが全て印刷されます。

QAccessのフォームで、画面表示されているものを印刷する

いつも大変お世話になっております。m(_ _)m

Accessのフォームにて、データを入力します。
入力している画面に「印刷」というボタンを作り、入力し終わった情報をレポート印刷(出力)したいです。

フォームもレポートも作成済みです。
データの区分けとしては、「管理No.」というフィールドが主キーであります。「現在画面に表示されているデータ」とは、「現在画面に表示されているデータの管理No.」ということになります。
その管理No.を抽出条件とし、印刷を行いたいです。

ごく簡単な方法で教えてほしいと思います。

なんとなく想像からすると、クエリを作り、抽出条件にその時の画面の管理No.を取り込む・・・というか・・・そんなイメージはありますが、どうすればいいのか分かりません。

よろしくお願い致します。m(_ _)m

Aベストアンサー

#3さんの仰るとおり、入力直後(保存前)に印刷ボタンを押すと入力中の内容は反映されませんね。忘れていました。
プログラムを修正します。

Private Sub コマンド1_Click()
 Me.Refresh
 If IsNull(Me![管理No.]) = False Then
  DoCmd.OpenReport "レポート名", acViewNormal, , "[管理No.]=" & Me![管理No.]
 End If
End Sub

QAccessで別テーブルの値をフォームに表示したい

初めてのAccessで分からない事があり質問させてください。

<会社テーブル>
会社ID
会社名
住所

<社員テーブル>
会社ID
社員名
ソート番号

*1社に対し複数の社員レコードが存在

以上のようなテーブルがあるとします

現在「会社テーブル」を表形式で一覧表示しています
会社ID,会社名、住所とフィールドが並んでいるのですが、その後ろに「社員テーブル」のソート番号が一番若い社員名を表示したいと考えています(現状は番号関係なく表示させる方法すら分かりません)

色々いじくりまわしたのですが、初めてAccessをさわる事もあってよくわかりません

リレーション等でひっぱってくる事ができるのでしょうか?

どなたか教えて頂けませんでしょうか

何卒よろしくお願い致します

PS.Access2013で作成中です

Aベストアンサー

単純にテーブル[会社]のみでフォームを作成し、社員表示用テキストボックスを追加。そして、そのプロパティを表示し

コントロールソース=DBLookup("SELECT 社員名 FROM 社員 WHERE 会社ID=" & [会社ID] & " ORDER BY ソート番号")

これは、以下の標準モジュールに登録したユーザ関数 DBLookup()を使っています。これで、クエリを用意しなくても目的を達成できます。

さて、かかるユーザ関数を標準ライブラリに登録したくない場合、

1、"社員ソートクエリ"を作成します。

SELECT 社員.会社ID, 社員.社員名
FROM 社員
ORDER BY 社員.ソート番号;

2、コントロールソースに次のように書きます。

=DLookUp("社員名","社員ソートクエリ","会社ID=" & [会社ID])

http://office.microsoft.com/ja-jp/access-help/HA001228825.aspx

DLookup()については、マイクロソフトの解説を参照されてください。

【DLookup()の限界を破るにはVBAで同じ関数を作るしかない】

マイクロソフトの解説を読めば判りますが、ORDER BY 節を指定する引数が用意されていません。ですから、どうしても、"社員ソートクエリ"を作成するという手間が必要となります。そこで、SQL文を引数とするDBLookup()をVBAで書けば、その手間を省けるという算段になります。この辺りは、好みと趣味の問題。どっちでも良いと思います。そういうお断りをした上で DBLookup()を紹介しておきます。なお、ADOは、つぎのように参照設定しないと利用できません。

http://www.happy2-island.com/access/gogo03/capter00307.shtml

Public Function DBLookup(ByVal strQuerySQL As String, _
             Optional ByVal ReturnValue = Null) As Variant
On Error GoTo Err_DBLookup
  Dim DataValue
  Dim rst     As ADODB.Recordset

  Set rst = New ADODB.Recordset
  With rst
    .Open strQuerySQL, _
       CurrentProject.Connection, _
       adOpenStatic, _
       adLockReadOnly
    If Not .BOF Then
      .MoveFirst
      DataValue = .Fields(0)
    End If
  End With
Exit_DBLookup:
On Error Resume Next
  rst.Close
  Set rst = Nothing
  DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue)
  Exit Function
Err_DBLookup:
  MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _
      "・Err.Description=" & Err.Description & Chr$(13) & _
      "・SQL Text=" & strQuerySQL, _
      vbExclamation, " 関数エラーメッセージ"
  Resume Exit_DBLookup
End Function

単純にテーブル[会社]のみでフォームを作成し、社員表示用テキストボックスを追加。そして、そのプロパティを表示し

コントロールソース=DBLookup("SELECT 社員名 FROM 社員 WHERE 会社ID=" & [会社ID] & " ORDER BY ソート番号")

これは、以下の標準モジュールに登録したユーザ関数 DBLookup()を使っています。これで、クエリを用意しなくても目的を達成できます。

さて、かかるユーザ関数を標準ライブラリに登録したくない場合、

1、"社員ソートクエリ"を作成します。

SELECT 社員.会社ID, 社員.社員名
FR...続きを読む

Q複数のクエリーを一枚のレポートに掲載する方法(アクセス)

約100名の顧客がいて各人がある曜日(月~土)に来るとします。中には週に1回しか来ない人もいれば、毎日来る人もいます。顧客リストテーブルに月~土のフィールドを作り、それを元に月曜日来客リスト、火曜日来客リスト・・・というクエリーを作成したのですが、これを月~土曜日の一覧リストとして表示させたいのですが、どのようにしたらよいでしょうか?
A:月、水、木、土
B:月、火、木
C:水のみ
D:月、木
E:月、水
F:金のみ
G:火、土 の場合

月曜日  火曜日  水曜日  木曜日  金曜日  土曜日
 A     B     A     A     F     A
 B     G     C     B           G
 D           E     D
 E 
  
という表を完成させていのですが・・・

よろしくお願いします。

Aベストアンサー

掲題を参考に...

月曜日のレポート表示イメージ
'-----
月曜日
 A
 B
 D
 E
'-----

火曜日のレポート表示イメージ
'-----
月曜日
 B
 G
'-----



土曜日のレポート表示イメージ
'-----
土曜日
 A
 G
'-----

って、ここまでは大丈夫ですね(^-^ )
さて、次はサブレポートですが、とりわけ難しく考えることはないです
レポートの中にレポートを貼り付けるというイメージです

で、先程作成した6個のレポートをkenchan2001さんがイメージしたとおりに新規レポートに配置していきます
(ウィザードはありません、自力で頑張りましょう)
レポートのデザインビュー時にツールボックスの「サブフォーム/サブレポート」ボタンを使用して配置して下さい
(ウィザード等、便利な機能もついています)
あとは、手直しすれば完成します

このレポートの難点は、ある曜日に顧客がかたまりすぎたら、レポートをはみ出してしまうことですね
なんとか、デザイン設計の方で回避できますが...
頑張って下さい(^-^ )

掲題を参考に...

月曜日のレポート表示イメージ
'-----
月曜日
 A
 B
 D
 E
'-----

火曜日のレポート表示イメージ
'-----
月曜日
 B
 G
'-----



土曜日のレポート表示イメージ
'-----
土曜日
 A
 G
'-----

って、ここまでは大丈夫ですね(^-^ )
さて、次はサブレポートですが、とりわけ難しく考えることはないです
レポートの中にレポートを貼り付けるというイメージです

で、先程作成した6個のレポートをkenchan2001さんがイメージしたとおりに新規...続きを読む

QACCESSでフォームを使って、テーブルを参照、データ入力、データ更新をしたいのです

フォームを使って、テーブルを参照、データ入力、データ更新をしたいのです。

売上テーブル

 ID   商品コード  日付    金額 
 1    G1     20080101  532153
 2    G1     20080101  564281
 3    G1     20080301  538123
 4    J4     20080301  124531
 5    J4     20080302  125483

ID:オートナンバー 商品コード:数値型 日付:数値型 金額:数値型

これを使い、
フォームではまず

レコードナンバーを入力画面
       ↓
レコード番号を入れると、そのレコードのデーターが画面に表示され、
その画面で修正可能
       ↓
 保存 ボタンで保存

という流れです。

レコードナンバーはIDを使おうと思っています。

データの量が莫大な為、コンポボックスなどは使えません。

できるだけ、VBAなどは使わずに作りたいです。

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

フォームを使って、テーブルを参照、データ入力、データ更新をしたいのです。

売上テーブル

 ID   商品コード  日付    金額 
 1    G1     20080101  532153
 2    G1     20080101  564281
 3    G1     20080301  538123
 4    J4     20080301  124531
 5    J4     20080302  125483

ID:オートナンバー 商品コード:数値型 日付:数値型 金額:数値型

これを使い、
フォームではまず

レコードナンバーを入...続きを読む

Aベストアンサー

まずそのテーブルを基にしてフォームを作成します。
そのフォームのヘッダー部分にテキストボックスを配置後、一旦
上書き保存。
フォームのレコードソースを
SELECT *
FROM テーブル名 WHERE ID=[Forms]![フォーム名]![テキストボックス名]
とします。
次にテキストボックスの更新後処理に
Me.Requery
とすれば完成です。
フォームを開いてテキストボックスにID入力後エンターしてください。

保存に関しては、コマンドボタン作成後クリック時イベントに
DoCmd.RunCommand acCmdSaveRecord
とすれば良いでしょう。

この手のモノは検索すれば相当数ヒットするので、そちらを参考にされるのもよろしいかと。

Qアクセスのフォームから別のフォームを開く

アクセスのフォームで、あるフォームから別のフォームを開こうとしています。

Form_XXX.show vbModal

というようなコードで実現可能かと思われますが、なぜかshowメソッドが選択できません(フォーム名は正しい)。

初歩的な質問ですが、どなたか対処法を教えていただけませんでしょうか。

Aベストアンサー

おはようございます.

AccessVBAですよね?

DoCmdオブジェクトを使ってください.
------
DoCmd.OpenForm "Form_XXX"
------
で、いかがでしょうか?(フォーム名を""で囲んでください)



ちなみにフォームを閉じる場合は、

DoCmd.Close です。


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

人気Q&Aランキング