こんにちは、お世話になっております。
どうぞよろしくお願いいたします。
VB−ACCESS連携で
ACCESSのレポート機能を使って帳票を作成する
プログラムを作成しているのですが、
コードは全てVB側で書いています。
ACCESSのレポートの非連結なTextBoxを貼り付けて
そこに、VB側から渡された変数を表示する方法が
分からず困っております。
もしご存知の方がいらっしゃいましたら、ご教授のほど
よろしくお願いいたします。
こんにちは。
いまいちイメージがわかりません。
もう少し詳しく書いて頂いてもいいですか?
例:
1.詳細に複数のデータレコードを表示したい
2.レポートヘッダーに固定の文字列を表示したい
だっちゃんさん、ご返答ありがとうございます。
説明が簡単すぎたようなので、もっと詳しく説明させていただきます。
VB−ACCESSの連携で、レポートをOpenしたときにVBの変数の中に入っている内容を
ACCESSのレポートのレポートフッタに表示したいのですが、その方法がわかりません。
ちなみに変数の中身にあるものは、VBの画面上に入力されたデータです。
このデータはACCESSデータベースの中には格納していません。
具体的に例をあげると、VBの機能で絞込検索があるのですが、画面から入力された
検索条件の内容をAccessレポートに表示したいのです。(詳細のところに表示する
レコードの内容はOpenReportメソッドでWhere句以降を投げると
該当するレコードのみを表示することが出来ました)
もしやり方の分かる方がいらっしゃいましたら、ご教授のほどよろしくお願いいたします。
こんちは。
まず、基本的にレポートのFORMATイベントで表示情報を作成するので
プレビュー(印刷)が表示された後でデータの設定、変更はできません。
なので、レポートに値を設定したいならデザインモードでレポートを
開き各種値を設定しちゃいます。
<デザインモードでの開き方>
'Db_Name :データベースファイル名
'Report_Name :レポート名
'Accessファイルを開く
Set ole_Access = Nothing
Set ole_Access = New Access.Application
ole_Access.OpenCurrentDatabase Db_Name, False
'この間に設定したい情報を記述する
'<例>情報って文字を出したいならこんな感じです。
'ちなみにコントロールソースに設定しているので"="が必要になります。
'ついでにレコードソースも指定すれば良いと思います。
ole_Access.Reports!(Report_Name)![テキスト1].ControlSource = "=情報"
ole_Access.DoCmd.Close acReport, Report_Name, acSaveYes
※プレビューの場合
ole_Access.DoCmd.OpenReport Report_Name, acPreview
'バックグラウンドのレポートを表示します。
ole_Access.Visible = True
注意:設定を間違ってVisibleコマンドまでにエラーで落ちた場合は
プロセスが残ってACCSEEのロックファイル(拡張子ldb)が残り再度表示しよう
としてもエラーになります。(ログアウトやパソコンの再起動で改善されます。)
プログラムを作成しているときは早い段階でVisibleコマンドを発行しておくと
ACCESSが画面に表示されるので便利です。
また、プレビューの場合はアクセスを閉じればDBも閉じますので
CloseCurrentDatabaseも必要ないです(たぶんですが・・・。)
逆に閉じてしまうとレポートも閉じてしまうような気がします。
(環境がないのでテストしてません・・・。ごめんなさい。)
※印刷の場合
ole_Access.DoCmd.OpenReport Report_Name, acNormal
ole_Access.CloseCurrentDatabase
Set ole_Access = Nothing
て、ことでプレビューと印刷で閉じ方が違うのでそこだけ気をつければ
大丈夫だと思いますが・・・。
すみません、肝心のコマンドを書き忘れてました・・・。
ole_Access.OpenCurrentDatabase Db_Name, False
の後にデザインモードで開く下記のコマンドを発行してくだい。
ole_Access.DoCmd.OpenReport Report_Name, acDesign
だっちゃんさん、詳しいご回答ありがとうございます!
早速試してみたのですが、実行すると
”パラメーターの入力”という小さいウィンドウが出てきて
テキストボックスに入力ように要求が出てきます。
そこに何かしら値を入力すると、それが[テキスト1]の中に
表示されるようになっております。
このウィンドウを表示せずにソース上で投げた値を表示するには
どうすればよいか、もしご存知だったら教えてください。
たびたび申し訳ありませんが、どうぞよろしくお願いします。
例のところにも書いたのですがコントロールソースに
"="を付けずに値を設定するとパラメータ入力になります。
なので変数を引数にするなら
ole_Access.Reports!(Report_Name)![テキスト1].ControlSource = "=" & 変数
で設定してあげればパラメータ入力を回避できます。
だっちゃんさん、ご返答ありがとうございます。
確認をしたのですが
例にかかれていたとおりに、 コントロールソースメソッドに "="をつけて
いたのですが、パラメーター入力がでてしまいます。
私も何かわかりましたら、すぐにお知らせします。
たびたびすいません。
もしかすると変数の中身が文字列の場合、""で囲ってあげないと駄目かも・・・。
なので
ole_Access.Reports!(Report_Name)![テキスト1].ControlSource = "=""" & 変数 & """"
で記述したらできませんか?
だっちゃんさん、ありがとうございます!
""で囲ってみましたが、残念ながらだめでした。ちなみにシングルコーテーション
で囲ってもだめでした。
oleAccess.Reports!(ReportName)![テキスト1].ControlSource = "= '" & 変数 & "'"
なぜでしょうね。。。ご迷惑かけてすいません。
サンプル通りに記述して頂いてるならDoCmd.Closeコマンドでレポートを
セーブしてます。
ACCSEEのファイルを起動して対象のレポートのテキストボックスのControlSourceに
設定されている値を教えて貰ってもいいですか?
また、表示されるパラメータ入力画面の求められるパラメータも教えてください。
たびたびお世話になって申し訳ありません!
ControlSourceに設定している値はString型とDate型です。
String型、Date型どちらの値を投げてもパラメータ入力の要求が
出てきます。
パラメータ入力画面で出てくるパラメーターは 情報 =
です。
どこにも"情報"を引数として渡しているところはないのですが
出てきてしまいます。
どうぞよろしくお願いいたします。
すみません、返事が遅くなりました。
まず”情報”ってパラメータがでることについてはもしかして私が掲示した
プログラムソースを実行したことありませんか?
もし実行したなら多分そのときにみきさんの作成したレポート
に”情報”パラメータが保存されたためです。
直接、ACCESSを起動しレポートオブジェクトを確認してください。
たぶんテストに指定したテキストボックスのコントロールソースに設定されていると思います。
そしていくらプログラムを直しても設定が反映しないのはレポートを
保存せず開いているためだと思います。
※下記のコマンドを流されていますか?
ole_Access.DoCmd.Close acReport, Report_Name, acSaveYes
なのでもう一度プログラムを流れを整理すると
'デザインモードで表示
ole_Access.DoCmd.OpenReport Report_Name, acDesign
'値の設定
ole_Access.Reports!(Report_Name)![テキスト1].ControlSource = "=""" & 変数 & """"
※ちなみに日付だと"#"で囲むことになりますね。
'レポートに設定情報を保存して閉じる
ole_Access.DoCmd.Close acReport, Report_Name, acSaveYes
'プレビューで開く
ole_Access.DoCmd.OpenReport Report_Name, acPreview
て感じになります。いちおうVB6,ACCESS2000の環境でテストしてみました。
もし駄目なら一度ソースを掲示して貰うと返事がしやすいです。
だっちゃんさん、いつもご丁寧な回答ありがとうございます。
そして、お返事遅くなってしまい、申し訳ありませんでした。
またうまくいかない現象があり、自己解決しようと頑張ってみたのですが
やはり難しいようなので、もしお分かりになりましたら、教えていただけると
うれしいです。
まず、パラメータ入力のウィンドウが出る現象ですが、これは
だっちゃんさんがおっしゃっていたように、Accessのレポートのなかに
非連携テキストボックスのコントロールソースに”情報”という
過去にテストを行った内容が含まれていたために出ていたもので、オブジェクトを
削除することで出なくなりました。
また、以下のソースをVB単体でテストしたところ、おかげさまで
うまく値が投げられるようになりました。
しかし、本来のvbpにまったく同じソースを書いて実行をしても、
レポートのテキストボックスの値が変わりません。
ちなみに、.mdbは同じものを使用してテストを行っています。
ActiveXコンポーネントの設定も同じにしました。
下記のソースが走るイベントのタイミングはどちらも、
ボタンのクリックイベントです。
本来のVBプロジェクトにて設定されている内容のなかのどこかが悪さ
しているのかとイベントを一行ごとデバッグしてみたのですが、
やはり見当がつきません。
もし説明が漠然としすぎているようでしたら、またおっしゃってください。
それではよろしくお願いいたします。
strtest = "あいうえお"
Set oleAccess = Nothing
Set oleAccess = New Access.Application
oleAccess.OpenCurrentDatabase strDBname, False
oleAccess.DoCmd.OpenReport ReportName, acDesign
oleAccess.Reports!(ReportName)![テキスト1].ControlSource = "=111"
oleAccess.Reports!(ReportName)![テキスト2].ControlSource = "=#" & Date & "#"
oleAccess.Reports!(ReportName)![テキスト3].ControlSource = "='" & strtest & "'"
oleAccess.DoCmd.Close acReport, ReportName, acSaveYes
oleAccess.DoCmd.OpenReport ReportName, acPreview
oleAccess.Visible = True
こんちは。
提供して貰ったプログラムをこっちで作成したプログラムで試してみましたが
問題なく実行できました。
て、ことであと疑うとしたら各変数に設定されている値ですね。
疑わしい変数:strDBname、ReportName
strDBname→きちんとmdbまでのフルパスが設定されてますか?
ReportName→対象のレポート名が設定されていますか?
あと、エラー処理をプログラムに入れて検証するのも手です。
On Error GoTo Error_Out<任意の名前>でエラーを検出し
'エラー処理
Error_Out:
Select Case Err.Number
Case 7866 'ファイルが見つからない
MsgBox "mdbファイルが見つかりません。", vbOKOnly
Case Else
MsgBox "エラーNo:" & Err.Number & Chr$(13) & Err.Description, vbOKOnly
End Select
て感じですかね・・・。
表示されないって現象がエラーで起きてるのか、もっと違う現象なのかわかんないので
やっぱエラー処理を追加して貰うほうが現象がわかると思いますよ。
ツイート | ![]() |