三流君 ken3のmemo置き場

メモ置き場、保管庫として利用。まとまっていませんがヨロシク

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。
(※詳細は[三流君 三流プログラマーとは?]を見てください)


広告:


[記事一覧、バックナンバーを見る]

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 ドラマタイトル
1 LADY〜最後の犯罪プロファイル〜
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 を見てください。