|
挨拶・自己紹介: | |
|
[記事一覧、バックナンバーを見る] | |
2011-02-18
QA110218 問い合わせ AccessサブフォームのデータをOutlook本文に転記する
>要望と言うか、教えていただきたいのですがAccessからOutlookを立ち上げ
>本文に定型文を挿入し
>定型文の中にAccessのサブフォームの登録レコードを埋め込みたいのですが
>上手く出来ません、
>三流様のサンプルコードをアレンジしてAccessフォームのデーターを
>メール本文に埋め込むことが出来ますたが
>サブフォームの登録レコードを埋め込むと先頭レコードしか表示出来ず格闘しております。
と質問をいただきました。
また、いつものように問題を切り分けたり、
無駄に初心に帰って(ぉぃぉぃ 初心忘れるべからず ダロ)
頭から作ってみたいと思います。
ア.テスト用のAccessサブフォームの作成
イ.Access メインフォーム、サブフォーム、値の取り出し方?
ウ.AccessサブフォームのデータをOutlookのメール本文に転記する
こんな感じの三分割で行ってみたいと思います。
まぁ、ア.とイ.は、操作動画作りたかっただけですが、お付き合いください
(質問の本命・本題は、ウ.なんだけど、脱線してみます。)
※※処理の全体像は http://ken3hitori.g.hatena.ne.jp/bbs/19?from=1 を見てください。
QA110218 ア.Accessサブフォームの作成 メインフォームとIDで連結する
IDでつなげたデータをよくある形のメインとサブフォームにしてみます。
メインフォームは単票で、
サブフォームは一覧表の形式でつなげてみたいと思います。
Tタイトル ※メインフォーム
ID ドラマタイトル
2 大切なことはすべて君が教えてくれた
3
↑AUTONO で 明細テーブルとリンク
※IDでメインフォームとサブフォームを連結させる
T出演者
※サブフォーム
ドラマID 出演者 役名
1 北川景子 香月翔子役
1 木村多江 結城晶役
1 平岡祐太 新堀圭祐役
1 須藤理彩 奥居マリエ役
1 小澤征悦 藤堂壮一郎役
1 要潤 寺田毅彦役
1 ユースケ・サンタマリア 柘植正樹役
操作の動画
蛇足や無駄が多いですが、下記操作の動画です。
http://www.youtube.com/watch?v=HaIgaI6aNyY
処理のポイント
サブフォームを帳票形式で作成します。(1:15 〜)
IDでサブフォームをつなげます。(6:50 〜)
QA110218 イ.Access メインフォーム、サブフォーム、値の取り出し方?
次に(次の壁は)、値の取り出し方、表現方法です。
メインフォーム
[ドラマタイトル]
と
サブフォーム [SUB出演者]
[出演者]
[役名]
を取り出してみたいと思います。
Private Sub BTEST_Click() 'MsgBox "メイン " & Me.ドラマタイトル 'MsgBox "サブ 出演者 役名 " & Me![SUB出演者]![出演者] & "-" & Me![SUB出演者]![役名] 'MsgBox "メイン レコード数MAX " & Me.Recordset.RecordCount 'MsgBox "サブ レコード数MAX " & Me![SUB出演者].Form.Recordset.RecordCount Dim n As Integer 'カウンター Dim strWORK As String 'サブのデータをまとめる 'サブフォーム の レコードを移動させたいのでフォーカスサブに当てる Me![SUB出演者].SetFocus 'フォーカスのカーソル移動 DoCmd.GoToRecord , , acFirst 'サブの先頭レコードにする strWORK = Me.ドラマタイトル & vbCrLf & vbCrLf 'ワークをタイトルでクリア 2行改行 For n = 1 To Me![SUB出演者].Form.Recordset.RecordCount strWORK = strWORK & Me![SUB出演者]![出演者] & "-" & Me![SUB出演者]![役名] & vbCrLf DoCmd.GoToRecord , , acNext '次のレコードへ Next DoCmd.GoToRecord , , acFirst '再度頭にサブの先頭レコードにする '結果を使う テストで画面に表示 MsgBox strWORK End Sub
動画で解説
蛇足や寄り道、ムダに迷っていたりしますが、下記動画解説です。
http://www.youtube.com/watch?v=g1-v0ryuO6E
処理のポイント
1. !と. 同じようで違ったり?
エラー MsgBox "サブ 出演者 役名 " & Me.SUB出演者.[出演者]
正常が MsgBox "サブ 出演者 役名 " & Me![SUB出演者]![出演者] & "-" & Me![SUB出演者]![役名]
2. サブフォームの全てのレコードを取り出したいんだけど・・・
2.1 レコードカウント(MAXのレコード数)
me.Recordset.recordcount で メインは取れる。
使いたいサブフォームのレコード数は、
Me![SUB出演者].Form.Recordset.RecordCount
で サブフォームのレコード数を取得することができました。
2.2 サブフォームのレコードを動かしたいんだけど・・・
次に、サブフォームのレコードを動かしたいので、
2.2.1 フォーカスの移動
Me![SUB出演者].SetFocus 'フォーカスのカーソル移動
で、フォーカス/操作の対象をサブフォームにセットしてから、
2.2.2 先頭レコードに移動
DoCmd.GoToRecord , , acFirst 'サブの先頭レコードにする
で、サブフォームの先頭にカーソルを移動させ
2.2.3 レコード数分だけ、レコードを移動さながら 値を集める
ワーク変数を1つ作成して、ループで回してみました。
strWORK = Me.ドラマタイトル & vbCrLf & vbCrLf 'ワークをタイトルでクリア 2行改行
For n = 1 To Me![SUB出演者].Form.Recordset.RecordCount
strWORK = strWORK & Me![SUB出演者]![出演者] & "-" & Me![SUB出演者]![役名] & vbCrLf
DoCmd.GoToRecord , , acNext '次のレコードへ
Next
DoCmd.GoToRecord , , acFirst '再度頭にサブの先頭レコードにする
'結果を使う テストで画面に表示
MsgBox strWORK
終わりのあいさつ
※まぁ、そんなことするなら、DAOやADOで処理すると言われそうですが、
こんな感じの三流処理もあるってことで(笑)
サブフォームのデータ処理で何かの参考となれば幸いです。
で、終わりじゃなかった(笑)質問は、Outlookへデータを書く、転記するのかぁ。
続きは少々お待ちを。
※※処理の全体像は http://ken3hitori.g.hatena.ne.jp/bbs/19?from=1 を見てください。
QA110218 ウ.AccessサブフォームのデータをOutlookのメール本文に転記する
AccessからOutlookを起動して、
メールの本文にフォーム(サブフォーム)の内容を転記します。
例題がドラマタイトルと出演者なのでわかりにくいですが、
よくある
台帳と明細
1対nのリンクされたテーブル
メインフォーム と サブフォームのデータ取り出し
に応用してみてください。
動画解説
蛇足や回り道、途中予定外のエラーで解説者本人固まったりしてますが、
下記、作成の流れ と 駆け足解説です。
http://www.youtube.com/watch?v=xI7Pnx66RRw
処理内容
1. Outlookの起動とメールアイテムの作成
手前味噌の
http://www.ken3.org/cgi-bin/group/vba_outlook.asp#MailItem
を参考にコピーしながら作成する
2.メールアイテムにサブフォームの内容をセットする
前回の QA110218 イ.Access メインフォーム、サブフォーム、値の取り出し方?
http://d.hatena.ne.jp/ken3memo/20110218/1297976772
を参考に作成する。
作成したソースコード
ほとんど、コピー貼りつけですが、こんな感じで、
Accessサブフォームからデータを抜き出し、
Outlookのメールにセットしてみました。
Private Sub B_MAIL_Click() Dim oApp As Object Dim myNameSpace As Object Dim myFolder As Object Dim objMAIL As Object 'メールのオブジェクト Dim strMOJI As String '本文 Dim n As Integer 'カウンター 'outlook 起動 Set oApp = CreateObject("Outlook.Application") Set myNameSpace = oApp.GetNamespace("MAPI") Set myFolder = myNameSpace.GetDefaultFolder(6) '規定のフォルダーを指定 myFolder.Display '表示 いつものクセで .Visible = True とやりがちだけど 'メールアイテムの作成 Set objMAIL = oApp.CreateItem(0) 'olMailItem=0 直値はいけないと思いつつ、 objMAIL.Display '画面表示(Mail入力、編集画面を表示) '宛先・件名・本文 などのデータを代入する objMAIL.To = "test@ken3.org" '宛先 ほかに.cc や.Bccも可能です objMAIL.CC = "vba@ken3.org ; oltest@ken3.org" '宛先 .cc 'objMAIL.BCC = "vba@ken3.org ; oltest@ken3.org" '宛先を複数は ; セミコロンで区切る objMAIL.Subject = "ドラマ " & Me.ドラマタイトル & " の資料を送ります " '.Subjectに文字列設定で件名 '本文を作る、(vbCrLfで改行されます) strMOJI = "こんにちは ドラマの出演者を送ります。" & vbCrLf & vbCrLf 'サブフォームの内容を転記する 'サブフォーム の レコードを移動させたいのでフォーカスサブに当てる Me![SUB出演者].SetFocus 'フォーカスのカーソル移動 DoCmd.GoToRecord , , acFirst 'サブの先頭レコードにする strMOJI = strMOJI & Me.ドラマタイトル & vbCrLf & vbCrLf strMOJI = strMOJI & "出演者 役名" & vbCrLf strMOJI = strMOJI & "-------------------------------" & vbCrLf For n = 1 To Me![SUB出演者].Form.Recordset.RecordCount strMOJI = strMOJI & Me![SUB出演者]![出演者] & " / " & Me![SUB出演者]![役名] & vbCrLf DoCmd.GoToRecord , , acNext '次のレコードへ Next DoCmd.GoToRecord , , acFirst '再度頭にサブの先頭レコードにする '作成結果を本文に代入 strMOJI = strMOJI & "-------------------------------" & vbCrLf strMOJI = strMOJI & "以上、よろしくお願いします。 三流君より" & vbCrLf objMAIL.Body = strMOJI '本文の代入 objMAIL.Display '編集画面のまま止めておきたい時 や テスト中に動作を見たいとき 'ここで、普通はオブジェクトの開放など、後始末をする。 End Sub
終わりの挨拶
アクセス サブフォームのデータ抜き出しは、
ADOやDAOがガッコいいんだけど、
フォーカスをセットして、DoCmdでレコード移動、
こんなセコイ方法もあるので、使ってみてください。
何かの参考となれば幸いです。 三流プログラマー Ken3
※処理の全体像 と 開発の流れは http://ken3hitori.g.hatena.ne.jp/bbs/19?from=1 を見てください。
[記事一覧、バックナンバーを見る]
.


