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

このQ&Aのポイント
  • Access2003のフォームでボタンをクリックすると特定のレポートだけをメールの添付ファイルとして送信する方法を教えてください。
  • 研修の受付フォームに送信ボタンを作り、ボタンをクリックするとメールソフトが起動し、PDF添付ファイルとして特定のレポートが添付されるように設定したいです。
  • ネットからサンプルを参考にしながらプログラムを作成しましたが、おかしな点があるか教えてください。
回答を見る
  • ベストアンサー

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

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

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

メール送信_Click()については最後に 述べます。 >Private Sub report_open(cancel As Integer) >If IsLoaded("F_研修受付入力") Then >Forms("F_研修受付入力").SetFilter Me >End Sub IsLoadedをこのように使うなら、Accessは関数とみなすので フォームが表示されているか確認するIsloaded関数を作成 する必要があります。これはAccessのサンプルのNorthwindow というファイルの標準モジュールのユーティリティ関数に登録 してある以下のコードを標準モジュールに貼り付けます。 Function IsLoaded(ByVal strFormName As String) As Boolean ' 指定したフォームがフォーム ビューまたはデータシート ビューで開かれている場合 True を返します。 Const conObjStateClosed = 0 Const conDesignView = 0 If SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> conObjStateClosed Then If Forms(strFormName).CurrentView <> conDesignView Then IsLoaded = True End If End If End Function あるいは、CurrentProjectオブジェクトを使って、 IsLoaded関数を使わずに、 >If IsLoaded("F_研修受付入力") Then を If CurrentProject.AllForms("フォーム1").IsLoaded Then とします。この場合は標準モジュールに上記の関数を設定 する必要はありません。この場合のIsLoadedは IsLoadedプロパティとして検索してみてください。あるいは ヘルプを参照してください。 次に、 >Forms("F_研修受付入力").SetFilter Me ですが、これは提示されている関数をプロパティ のように使っていますがこのような使い方は しません。そこで先に関数SetFilterをみてみます。 >Public Sub SetFilter(rpt As Report) >With rpt >.Filter = "T_社員マスター.社員番号 =" & 社員番号 >.FilterOn = True >End With >End Sub の作り方ですが、 >.Filter = "T_社員マスター.社員番号 =" & 社員番号 の等号の右側の社員番号はレポートのテキストボックスの 社員番号になるのでしょう。また等号の左側はレポートの レコードソースなのかもしれません。説明していくと 長くなるので、レポートを開くときフォームの社員番号を 参照してその番号にあった社員のデータを表示したい、 とうことならば、 >.Filter = "T_社員マスター.社員番号 =" & 社員番号 は、 .Filter = "[社員番号]=" & Forms!F_研修受付入力!社員番号 のようにします。したがって、SetFilter関数は以下のように します。 Public Sub SetFilter(rpt As Report) With rpt .Filter = "[社員番号]=" & Forms!F_研修受付入力!社員番号 .FilterOn = True End With End Sub ここで、"[社員番号]=" & Forms!F_研修受付入力!社員番号 の[社員番号]はレポートの社員番号という名前のテキスト ボックスを指しています。 そこで、また前にもどって、report_openについてですが、 SetFilter関数には引数、SetFilter(rpt As Report)の ropが設定してあるので、SetFilterを使うときは、 SetFilter(何か) のような使い方をしなければなりません。したがって、 report_openは、 Private Sub report_open(cancel As Integer) If IsLoaded("F_研修受付入力") Then SetFilter Reports!R_社員ごと受講リスト End If End Sub のようにします。なお、If文のあとのEnd Ifが抜けているの 追加しました。 【字数制限のために次に】

yukirin5_2006
質問者

お礼

piroin654様 ご教授ありがとうございます。<(_ _)> 本当に!本当に!ありがとうございます。<(_ _)> 早速やってみました。 Public Sub SetFilter(rpt As Report) With rpt .Filter = "[社員番号]=" & Forms!F_研修受付入力!社員番号 .FilterOn = True End With End Sub これを記述したら出来ました。 必要なデータのみ抽出されました。(*^_^*)感動しました! それと、これはまた別で質問をしないといけないのかもしれませんが・・・ (別でないといけないときはご指摘ください。すみません) ご教授頂いたように設定したら、フォームの社員番号と同じレポートがPDFファイルとなり添付される ようになりました。しかし、新規に入力したデータだけ「メール送信」ボタンを押しても反応が ありません。これはなぜでしょうか? その他の、 Private Sub report_open(cancel As Integer) If IsLoaded("F_研修受付入力") Then SetFilter Reports!R_社員ごと受講リスト End If End Sub 上記の記述をするとOUTLOOKが起動されませんでした。 またNo3の記述 Private Sub report_open(cancel As Integer) If CurrentProject.AllForms("F_研修受付入力").IsLoaded Then Forms("F_研修受付入力").SetFilter Me End Sub 変えてみましたがやはりOUTLLOKが起動しませんでした。 そして、「指定したフォームがフォームビューまたはデータシートビューで開かれている場合Trueをかえします。」も貼り付けてみましたがOUTLOOKが起動しなくなりました。 何か小生の設定が間違っておりますか? お手数をおかけいたしますが、よろしくお願いいたします。

その他の回答 (2)

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

訂正です。 #1において、 >If IsLoaded("F_研修受付入力") Then を If CurrentProject.AllForms("フォーム1").IsLoaded Then となっていますが、 If CurrentProject.AllForms("F_研修受付入力").IsLoaded Then としてください。フォーム名が違っていました。

yukirin5_2006
質問者

お礼

ありがとうございました。 不明な点も解決いたしました。 とても単純でメールアドレスが入力されていなかったからのようです。 この度は、本当にご丁寧にご教授頂き心から感謝いたします。 また機会がございましたらよろしくお願いいたします。

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

最後になりましたが、メール送信_Click()ですが、 Access2003では標準でファイルのPDF変換はありません。 したがって、DoCmd.SendObjectは提示されているようには 使えません。したがって、PDF変換のソフトを使って一旦 レポートをPDFに変換する工程を入れて、メールに添付 するようにしなければなりません。有償のアドビ、 あるいはフリーのソフトで変換します。したがって 提示されたコードはAccess2007ならば使えますが、 Access2003ではコードを変更しなければなりません。 なお、フリーのPDF変換ソフトは以下にあります。 http://www.lebans.com/reporttopdf.htm サンプルに必要な変換用のDLL(ソフトのようなもの と思ってください)が同梱されています。サンプルには 使い方が書いてありますが、すべて英語です。

yukirin5_2006
質問者

お礼

piroin654様 ありがとうございます。 PDFが入っていない社員もいるので助かります。 そして、No1のお礼のところに補足説明を一緒に書いてしまいました。 大変失礼いたしました。 不慣れで申し訳ございません。<(_ _)>

関連するQ&A

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

    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が定義されていません。」と表示されます。 どこを修正したらよいのでしょうか? 小生プログラムの知識が全くありません。これも、サンプルを見ながら作りました。 宜しくご教授くださいますようお願いいたします。

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

    フォームからレポートを開く時に、 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イベントが発生しませんでした。 ご回答よろしくお願いします。

  • 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 ふりがな を昇順 降順 に行えません。 なにを加えればよいのでしょうか。 よろしくお願いします。

  • accessフォームのボタン→レポートへ伝票番号

    access初心者です。 accessのフォームがあります。 コマンドボタンを押すとその伝票番号★を引き継いで、レポートの★の部分に入れたいのですが。 【コマンドボタン】 DoCmd.OpenReport "伝票印刷", acPreview #「伝票番号」という変数に番号は入っています。 【レポート伝票印刷】 Sub Report_Open(Cancel As Integer) Me.RecordSource = "SELECT * FROM 仕分伝票 WHERE 伝票番号 = ★" End Sub #★に番号が入るとレポートはその番号のレポートを表示します。 #切り貼り作成しているので、ほとんどVBAはわかっていません。 #質問の仕方も自信なし。 #画面に表示されている伝票を印刷しようというのが目的です。

  • レポートをpdfに変換する方法

    現在、ボタンをクリックするとメールが起動しレポートが添付されるようになっています。 アドビアクロバット8のPDFに変換して添付させたいのですが上手くいきません。 Access2003だとPDFに自動で変換されないのでしょうか? どのように設定したら良いのか教えてください。 宜しくお願い致します。 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

  • access2003フォームの指定表示のみ印刷プレビューしたいのですが・・・?

     Access2003初心者なので詳しく教えていただきたいのです。  フォームで詳細に「請求月」とあり、コンボボックスでフィルターを  かける様にしています。  (請求月(H20.5月と書式設定)している)  フォーム上では、ちゃんとフィルターがかかり  指定データだけが詳細に表記しているのです。  フォーム上に「印刷ボタン」を作りイベントでクリックしたら  フォームの情報のみレポートプレビューしたいのですが  レポートに移動するとすべて表示されるのです。  指定したレコードだけレポートに表示したいのですが  どうしたらよいのでしょうか?  Private Sub BTN_印刷_Click() DoCmd.OpenReport "RPT_●●請求済", acViewPreview End Sub  上記ステートメントまではわかるのですが・・・?  申し訳ないのです、よい方法を教えていただけませんか。  説明不足かもしれませんがよろしくお願いいたします。

  • Access2003でフォームにあるコマンドボタンで更にフォームを開く

    Access2003でフォームにあるコマンドボタンで更にフォームを開くときのVBA記述で困っています。 Access2003で社員情報管理のデータベースを作成中です。 社員の情報を入力するにあたり、【基本情報】と【詳細情報】とでフォームを分けてあり、【詳細情報】を入力したい場合は、"基本情報フォーム"にあるコマンドボタンをクリックして"詳細情報フォーム"を開くようになっています。 この際、"基本情報フォーム"で開いている社員の【社員番号】を"詳細情報フォーム"の【社員番号】欄にも自動的に表示させるため、以下のようなVBAを記述しました。 Private Sub コマンドボタン_Click() DoCmd.OpenForm "詳細情報フォーム" Forms![詳細情報フォーム![社員番号].DefaultValue = Me![社員番号] End Sub 【社員番号】は7ケタの半角英数で、社員によって、数字だけの場合と、英数混じっている場合とがあります(データ型はテキスト型にしてあります)。 困っているのは、 1.上記を実行した際に、数字だけの社員番号は問題ないのですが、英数混じりの場合だと"社員番号"テキストボックスが「#Name?」という表示になってしまう 2."基本情報フォーム"のコマンドボタンをクリックして新規の"詳細情報フォーム"を開き(社員番号のみが反映され、他の項目は空欄の状態)、詳細情報を入力→保存したあと、別の社員番号で"基本情報フォーム"を開き、コマンドボタンで"詳細情報フォーム"を開くと、前に入力した社員の情報が出てきてしまう。 (つまり、"詳細情報フォーム"のもととなるテーブルに、1行でもレコードがあると、それが出てきてしまう。) 【詳細情報】は、 1.データを入力する社員としない社員とがいる 2.新規でレコードを作成する場合と、既存のレコードを上書きする場合とがある ので、もととなる"詳細情報テーブル"にその【社員番号の】レコードがなければ新規入力画面を、レコードがあればそのレコードを呼び出す形にしたいのですが、英数混じりの表示の件も含め、どうすれば、正しく表示されるか教えていただきたいです。 ぜひぜひよろしくお願いします。

  • アクセス 開いているレポート名を取得する。

    アクセス初心者です。 VBAにて フォーム1でレポート、レコードを選択後に レポートを開くと同時に印刷フォームも開くように組んでます。 その印刷フォームで印刷をすると、印刷フォーム自体が印刷されてしまうので ”レポート名”を認識させてから印刷しています。 その時の”レポート名”を開いたときに自動的に変数として印刷フォームに引き継ぎたいのですが やり方が分かりません。 意図としては、印刷フォームを汎用的に使いたいためです。 印刷フォームの呼び出しコードは下記にて Private Sub コマンド18_Click() Dim report_name As String Dim report_value As String If Not IsNull(コンボ50.Value) = True Then report_name = コンボ48.Value  ’レポート名です report_value = コンボ50.Value DoCmd.OpenReport report_name, acViewPreview, , "[現場名]='" & report_value & "'" DoCmd.MoveSize Width:=10000, Height:=13000 Reports(report_name).ZoomControl = 75 Else MsgBox "項目を選択してください。" End End If DoCmd.OpenForm "印刷_フォーム", acNormal End Sub Private Sub コマンド53_Click() Dim new_date As String Dim form_name As String If Not IsNull(コンボ48.Value) = True Then form_name = コンボ48.Value DoCmd.OpenForm form_name, acNormal, , , acFormAdd DoCmd.MoveSize Width:=12000, Height:=13000 Else MsgBox "[取引先名]を入力してください。" End If End Sub 下記は印刷フォームにて、印刷設定をする場合のコードです Private Sub コマンド0_Click() Dim report_name As String report_name = "レポート名" On Error Resume Next DoCmd.SelectObject acReport, report_name, True DoCmd.RunCommand acCmdPrint End Sub

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

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

  • ACCESSフォームフィルタで抽出したデータのみをレポートで表示する方法

    フォームフィルターでデータを抽出した後,抽出されたデータのみをレポート上に表示させるコマンドボタンをフォーム上に作っています。 下記のコードを作成しましたが,これだと抽出前の全部のデータが表示されてしまいます。 どうしたら良いでしょうか。 Private Sub ラベルプレビュー_Click() Dim stDocName As String DoCmd.Echo False, stDocName = "rpt宛名ラベル" DoCmd.OpenReport stDocName, acViewDesign DoCmd.SelectObject acReport, stDocName, False ' Reports(stDocName).RecordSource = Me.RecordSource DoCmd.OpenReport stDocName, acViewPreview End Sub