10秒目をつむったら…

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

A 回答 (3件)

メール送信_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が抜けているの
追加しました。

【字数制限のために次に】
    • good
    • 0
この回答へのお礼

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が起動しなくなりました。


何か小生の設定が間違っておりますか?
お手数をおかけいたしますが、よろしくお願いいたします。

お礼日時:2010/11/02 00:55

訂正です。


#1において、

>If IsLoaded("F_研修受付入力") Then

If CurrentProject.AllForms("フォーム1").IsLoaded Then

となっていますが、

If CurrentProject.AllForms("F_研修受付入力").IsLoaded Then

としてください。フォーム名が違っていました。
    • good
    • 0
この回答へのお礼

ありがとうございました。
不明な点も解決いたしました。
とても単純でメールアドレスが入力されていなかったからのようです。

この度は、本当にご丁寧にご教授頂き心から感謝いたします。
また機会がございましたらよろしくお願いいたします。

お礼日時:2010/11/03 00:24

最後になりましたが、メール送信_Click()ですが、


Access2003では標準でファイルのPDF変換はありません。
したがって、DoCmd.SendObjectは提示されているようには
使えません。したがって、PDF変換のソフトを使って一旦
レポートをPDFに変換する工程を入れて、メールに添付
するようにしなければなりません。有償のアドビ、
あるいはフリーのソフトで変換します。したがって
提示されたコードはAccess2007ならば使えますが、
Access2003ではコードを変更しなければなりません。

なお、フリーのPDF変換ソフトは以下にあります。
http://www.lebans.com/reporttopdf.htm
サンプルに必要な変換用のDLL(ソフトのようなもの
と思ってください)が同梱されています。サンプルには
使い方が書いてありますが、すべて英語です。
    • good
    • 0
この回答へのお礼

piroin654様

ありがとうございます。
PDFが入っていない社員もいるので助かります。

そして、No1のお礼のところに補足説明を一緒に書いてしまいました。
大変失礼いたしました。

不慣れで申し訳ございません。<(_ _)>

お礼日時:2010/11/02 00:58

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

関連するカテゴリからQ&Aを探す