Access2003のフォームで特定のレポートをメールの添付ファイルとして送信する方法

このQ&Aのポイント
  • Access2003のフォームでボタンをクリックすると特定のレポートだけをメールの添付ファイルとして送信する方法について教えてください。
  • 現在、フォーム上に表示されている受験番号の人だけをレポートから抽出してメールに添付する方法を知りたいです。
  • メールが起動されなくなる問題を解決するために、プログラムの修正方法を教えてください。
回答を見る
  • ベストアンサー

特定のレポートだけをメールの添付ファイルとして送信

Access2003のフォームでボタンをクリックすると特定のレポートだけをメールの添付ファイルとして送信したいです。 以前、ご教授頂き、別のファイルでは使えるのですが、新たに作ったファイルで上手くいきません。 是非、ご指導お願いいたします。 内容:社員がテストを受けた結果をメールで添付して送りたいです。 現状: テーブル T_社員マスター T_受験結果リスト クエリ  Q_受験結果 フォーム F_社員情報(クエリを基に作りました。) レポート R結果情報(社員番号ごとに受験結果のレポートを作りました。) report_open(cancel As Integer)のプログラムを記述するとメールソフトが起動しません。 --------------------------------------------------------------- Option Compare Database Option Explicit Private Const conReportName = "R結果情報" --------------------------------------------------------------- Private Sub メール送信_Click() On Error Resume Next DoCmd.SendObject ObjectType:=acSendReport, _ ObjectName:=conReportName, _ OutputFormat:=acFormatPDF, _ To:=Me.eメールアドレス, _ cc:=Me., _ Subject:="結果を添付します", _ MessageText:= End Sub --------------------------------------------------------------- Public Sub SetFilter(rpt As Report) With rpt .Filter = "[受験番号]=" & Forms!F_社員情報!受験番号 .FilterOn = True End With End Sub --------------------------------------------------------------- ここまでの記述だと、フォーム上にある【メール送信】ボタンをクリックすると メールが起動されアドレスや件名が入ります。 問題は、添付ファイルが社員全員のものが添付されてしまします。 そこで、フォーム上に表示されている受験番号の人だけをレポートから抽出して添付したいです。 下記プログラムを記述しました。 --------------------------------------------------------------- Option Compare Database Option Explicit --------------------------------------------------------------- Private Sub report_open(cancel As Integer) If CurrentProject.AllForms("F_社員情報").IsLoaded Then SetFilter Reports!R結果情報 End If End Sub --------------------------------------------------------------- Private Function IsLoaded(strName As String) _ As Boolean IsLoaded = (SysCmd(acSysCmdGetObjectState, acForm, strName) <> 0) End Function --------------------------------------------------------------- Private Sub report_open(cancel As Integer)を記述するとメールが起動されなくなります。 フォームを開いた状態で、レポートをダブルクリックすると、 「コンパイルエラー、subまたはfanctionが定義されていません。」と表示されます。 どこを修正したらよいのでしょうか? 小生プログラムの知識が全くありません。これも、サンプルを見ながら作りました。 宜しくご教授くださいますようお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

新しく書き直したか、新規にファイルを 作ったのかが不明ですが、 >下記プログラムを記述しました。 で、記述漏れのある関数なりプロシージャが あるか、その関数名が違っている、という 可能性があると思いますが。 たとえば、 Public Sub SetFilter(rpt As Report) With rpt .Filter = "[受験番号]=" & Forms!F_社員情報!受験番号 .FilterOn = True End With End Sub というプロシージャは標準モジュールに 設定されていますか。 それと、 >Private Function IsLoaded(strName As String) _ >As Boolean >IsLoaded = (SysCmd(acSysCmdGetObjectState, acForm, strName) <> 0) >End Function はPrivateになっていますが、もし標準モジュールに おくならば、Public あるいは、単に Function IsLoaded(strName As String) As Boolean とするようにします。 また、IsLoadedを以下のような使い方をする場合は、 Private Sub report_open(cancel As Integer) If CurrentProject.AllForms("F_社員情報").IsLoaded Then SetFilter Reports!R結果情報 End If End Sub >Private Function IsLoaded(strName As String) _ >As Boolean >IsLoaded = (SysCmd(acSysCmdGetObjectState, acForm, strName) <> 0) >End Function というプロシージャは標準モジュールに登録する 必要はありません。これはAccess2003では CurrentProjectオブジェクトに設定してある IsLoadedプロパティでフォームが開いているか 確認できるからです。この場合のIsLoadedは Access2003に登録されているプロパティです。 もし、 >If CurrentProject.AllForms("F_社員情報").IsLoaded Then を If IsLaoded("F_社員情報") Then のような使い方をするならば標準モジュールに 設定が必要になります。この場合のIsLoaded はユーザ定義関数と言って、Accessが標準で 搭載しているものではないということです。 名称が同じIsLoadedで間違いやすいのですが、 >Function IsLoaded(strName As String) _ >As Boolean >IsLoaded = (SysCmd(acSysCmdGetObjectState, acForm, strName) <> 0) >End Function を Function myIsLoaded(strName As String) _ As Boolean myIsLoaded = (SysCmd(acSysCmdGetObjectState, acForm, strName) <> 0) End Function のようにIsLoadedをmyIsLoadedに変更して 使ってみるとよくわかります。 その場合は、 If myIsLaoded("F_社員情報") Then のような使い方をします。

yukirin5_2006
質問者

補足

piroin654様 これは、新規のファイルから作りました。 そして、標準モジュールには何もないです。 クラスモジュール?(見た所アイコンがクラスモジュールと同じでした。) 設定した方法は、フォームの送信ボタンのプロパティシートのイベントからコードを選んで設定しました。 Option Compare Database Private Sub メール送信_Click() Public Sub SetFilter(rpt As Report) の部分はフォームのモジュールに書かれています。 これだけの場合は、【メール送信】ボタンをクリックするとメールが起動し全ての社員のレポートの内容がPDFに変換され添付されます。 続いて、レポートのクラスモジュールに記述されている内容が・・・ Option Compare Database Option Explicit --------------------------------------------------------------- Private Sub report_open(cancel As Integer) If CurrentProject.AllForms("F_社員情報").IsLoaded Then SetFilter Reports!R結果情報 End If End Sub --------------------------------------------------------------- Private Function IsLoaded(strName As String) _ As Boolean IsLoaded = (SysCmd(acSysCmdGetObjectState, acForm, strName) <> 0) End Function --------------------------------------------------------------- 上記3点です。 Private Sub report_open(cancel As Integer)を記述すると 【メール送信】ボタンをクリックしてもエラーも出なければ、メールも起動されなくなります。 記述する場所も関係するのですね・・・ お手数をお掛け致しますがよろしくご教授お願いいたします。 宜しくお願いいたします。

その他の回答 (2)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

フォームにある Public Sub SetFilter(rpt As Report) With rpt .Filter = "[受験番号]=" & Forms!F_社員情報!受験番号 .FilterOn = True End With End Sub を標準モジュールに設定してください。フォームのほうは 削除してください。これで一度確かめてみてください。

yukirin5_2006
質問者

お礼

piroin654様 いつもありがとうございました。 一つ一つ前回教えて頂いたのと何が違うか検証した結果 データ型が違う事が判明いたしました。 データ型を変更したら出来ました。 ありがとうございました。

yukirin5_2006
質問者

補足

piroin654様 ありがとうございます。 やってみましたが、メールが起動されませんでした。 標準モジュールを追加し、上記のプログラムを移動してみましたが出来ませんでした。 この設定プラス以前教えていただいたレポートの記述を Function myIsLoaded(strName As String) _ As Boolean myIsLoaded = (SysCmd(acSysCmdGetObjectState, acForm, strName) <> 0) End Function にも変更してやってみましたが駄目でした。 他に何か良い方法がございましたらご指導のほど宜しくお願いいたします。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

最初に伺うことが抜けていました。 エラーが出たとき、デバッグを 選択するとどこにカーソルが あたりますか?

yukirin5_2006
質問者

補足

piroin654様 フォームの送信ボタンをクリックすると、特にエラーは出ません。 一応、レポートが開かれているような画面がでますがすぐに消えてしまいます。 フォームを開いた状態で、レポートをダブルクリックすると Private Sub report_open(cancel As Integer) If CurrentProject.AllForms("F_受験者データ").IsLoaded Then SetFilter Reports!R結果通知票 End If End Sub のPrivate Sub report_open(cancel As Integer) が黄色くなります。そして、SetFilter が選択されます。 宜しくお願いいたします。

関連するQ&A

  • Access2003のフォームでボタンをクリックすると特定のレポートだ

    Access2003のフォームでボタンをクリックすると特定のレポートだけをメールの添付ファイルとして送信したいです。 よろしくご教授ください。<(_ _)> 研修の受付フォームに送信ボタンを作りました。 ボタンをクリックするとメールソフトが起動されPDF添付ファイルとして添付されるのですが フォームと同じ社員番号だけ添付したいのです。 状況 テーブル T_社員マスター T_講座マスター T_研修受付リスト クエリ  Q_研修受付 フォーム F_研修受付入力(クエリを基に作りました。) レポート R_社員ごと受講リスト(社員番号ごとに研修受講履歴のレポートを作りました。) 作ったプログラムです。(小生プログラムの知識がありません。これはネットからサンプルを見ながら 作ってみました。おかしな所がございましたらご教授くださいませ) Option Compare Database Option Explicit '”R_社員ごと受講リスト”の所にはレポートの名前を書く Private Const conReportName = "R_社員ごと受講リスト" ----------------------------------------------------------------- Private Sub メール送信_Click() On Error Resume Next DoCmd.SendObject ObjectType:=acSendReport, _ ObjectName:=conReportName, _ OutputFormat:=acFormatPDF, _ To:=Me.メールアドレス, _ cc:=Me.メールアドレス1, _ Subject:="研修受講履歴", _ MessageText:="研修受講履歴を添付しましたのでよろしくお願いします." 'PDFやXLS添付ファイルの形式を指定する End Sub ----------------------------------------------------------------- Private Sub report_open(cancel As Integer) If IsLoaded("F_研修受付入力") Then Forms("F_研修受付入力").SetFilter Me End Sub ----------------------------------------------------------------- Public Sub SetFilter(rpt As Report) With rpt .Filter = "T_社員マスター.社員番号 =" & 社員番号 .FilterOn = True End With End Sub

  • 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

  • ACCESSのレポートに売上の累計を計算させましたが・・・・

    ACCESS2002についてです。 テーブルに"売上日" "売上金額"とある中で"売上累計"を明細行毎にだそうと、本に書いてある下記のように入力しましたが、ページが変わってしまうと"売上累計"が合わなくなってしまいます。どうしたら解決できますか???? Option Compare Database Option Explicit Private curRuikei As Currency Private Sub Report_Open(Cancel As Integer) End Sub Private Sub レポートヘッダー_Format(Cancel As Integer, FormatCount As Integer) '累計のクリア curRuikei = 0 End Sub Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer) '累計の加算 curRuikei = curRuikei + Me!売上金額 Me!売上累計 = curRuikei End Sub です。

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

    現在レポートで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

  • レポート ちらつきを回避したい

    レポートにデータがない時は Private Sub Report_NoData(Cancel As Integer) Cancel = True End Sub これで、レポートを開くことを回避できるのですが、 一瞬だけレポートが立ち上がり、一瞬で消えます。 この一瞬の動きを非表示にしたいのですが、可能でしょうか? 画面がちらついて見えてしまいます。 Private Sub Report_NoData(Cancel As Integer) DoCmd.Echo False Cancel = True DoCmd.Echo True End Sub エコーを入れてもちらつきを回避できませんでした。

  • Accessのレポートについて

    Accessのレポートについて Access2002で作成した、あるシステムのレポートで、会社名と代表者名を印字するようにしています。 14文字ある氏名が13文字で改行されてしまいます。 15文字以上ある氏名は縮小されて、1行で枠内に収まって印字されます。 該当のレポートのプロパティを開き、イベントタブの「開く時」のイベントプロシジャを見ると下記のような表記があります。 下記の表記により、上記のようになるのではないかと推測していますが、素人な者で、下記を解読できずにおります。 どうか、下記について、ご教授いただけないでしょうか。 Option Compare Database '文字列の比較にデータベースで決められた形式を使用します。 Private Sub Report_Open(Cancel As Integer) End Sub Private Sub 詳細1_Format(Cancel As Integer, FormatCount As Integer) Call 氏名自動縮小(Me!氏名, 14, 9) End Sub

  • Access フォームから並び替えレポート

    お知恵をお貸しください。 Access2010 フォームでオプショングループを2種類用意しました。 規則グループ 昇順 降順 並び替えグループ ID ふりがな レポートに Private Sub Report_Open(Cancel As Integer) Select Case Forms!フォーム4!fra並べ替え Case 1 Me.OrderBy = "ID ASC" Me.OrderByOn = True Case 2 Me.OrderBy = "ふりがな ASC" Me.OrderByOn = True End Select End Sub 並び替えでは、昇順のみうまくレポートを行えますが。 規則で ID ふりがな を昇順 降順 に行えません。 なにを加えればよいのでしょうか。 よろしくお願いします。

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

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

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

     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ページ」表示となるようにするには、どこを修正すれば良いかお教え願いたいと思います。 どうぞよろしくお願いいたします。

  • ACCESSのフォームからレポートへの変数の引渡し

    フォームで定義した変数をレポートに渡して利用したいがうまく渡せません。 具体的にはクエリー名をレコードソースとして利用するために変数に入れて渡そうとしています。 [フォーム]での変数定義 Dim 抽出種別 as String -----(1) 抽出種別 = "Q抽出未回収" -----(2) [レポート]開く時のイベントプロシージャー Private Sub Report_Open(Cancel As Integer) Me.RecordSource = 抽出種別 -----(3) End Sub 実行結果は印刷の各フィールドの項目に #Name? と表示されてしまいます。 (3)で変数を使わずに"Q抽出未回収"とやるとうまくプレビューされます。 変数の定義の方法や場所などいまいち理解が出来ていないものと思います。 フォームからレポートへの変数の引渡しはどうやってやればうまく出来るのでしょうか?