-
三流君の [コンビニ系HPへ] [VBA系HPへ] [ASP系HPへ] [愚痴系HPへ]

OutLook97から添付ファイルを抜き出す

戻 る
サンプル→032.LZH 30KB をダウンロードして、見てください。
OutLook97から添付ファイルを抜き出す
Excel 97 OutLook.xls

Excel97 VBA CRLF抜きの固定長ファイルを処理
kotei.xls の修正版が入っています



Alt+F11、、それから、、挿入モジュールだったけ?

ツール・参照設定を選択します すると、ものすごい数の参照可能なライブラリが表示されます。 画面をスクロールさせ、目的のライブラリ・オブジェクトを探します。 *名前で、あたりをつけるの、、難しいが。。。
Microsoft outlook 8.0 Object library を選択してみた。 あれ、その下に、エクスプレス5.0?あるじゃん、、もしかして? *今回は、興味があるけど、そのままにします。
dim aaa asと入力すると、型の一覧が出ます。
ここで、Dim aaa As MailItem とします。 次に、 aaa. とピリオドを打つと、MailItemのプロパティ、メソッドが表示されます。 *いろいろあるので、大変です。。。
.Attachments の添付関係のオブジェクトを選択します。 ここから、ピリオドを打って、さらに深く読んでいきます。
.Attachments.Itemや.Count を押さえて、さらに、Itemの下にある、 .Attachments.Item.DisplayName や .SaveAsFileメソッドを見ます。
なんて、スムーズに書きましたが、実際は、英単語の辞書で単語変換したり、 いろいろ、目的のプロパティ・メソッドを探すのに、苦労しました。 だいたい、アタッチですぐ添付って頭の中、ひらめきます? うん、ひらめくよ、、、えっ、、、私だけ、わからなかったの、、、 テストデータ作成





<OutLook97から添付ファイルを抜き出す> 目次 1.はじめの挨拶 2.参照設定を使用して、オブジェクトの構造を知ろう、、  3.まず、読み込みだけ、作成しよう 4. [三流PG No.031]の再調理、、 5.ハッシュと二分検索 6.おわりの挨拶 ---------------------------------------------------------------------------- /* * 1.こんにちは */ こんにちは。 紹介文から、C言語を削りました。。。 そのうち、ネタたまったら、復活させます。 今回の依頼は、 OutlookExpress5から、添付ファイルを取りたい、、です。 ---------- >とあることがやりたいのでEucの過去ログをさぐったところ >唯一ひかっかた話題をされていた貴殿のWebに迷い込み、バックナンバーを >2,3見たところ、面白そうなので今後メルマガを購読しようかと思ってお >ります。 >で、「やってみたいあること」についてですが、 >ExcellのVBAでOutolookExpress5の添付ファイルをどっかのフォルダにコ >ピーしたい! ということです。もしご存知なればぜひぜひアドバイスをお >願いしたいです。 ---------- 前に作成したサンプルに肉付けをして(簡単に調理して、、) 出そうと思います。 オイオイ、、新しい、おしながき(ジャンル)じゃなくて、簡単にすませたね、、、 それじゃ、実力あがらないよ。。。 カツ丼のうまいそば屋をめざしているんじゃなかったっけ? あれ、チャーハン・餃子のうまい、ラーメン屋?だったっけ なんか、本業ダメだけど、オプションはうまい店、、みたいじゃん? そこそこ食べれる、ファミリーレストラン目指してるんだけど、、、 味にうるさい人は、専門店へ、、、なんてね。 目玉商品が無い店は、つぶれる?だろうし、、、 このメルマガのウリ、他店に負けない、おいしいところって、なんだろう? 速い・ウマイの牛丼屋をめざしますか、、、 いつもの、わけわからない話は、これくらいにして、そろそろ、やりますか。。。 /* * 2.参照設定を使用して、オブジェクトの構造を知ろう、、、 */ OutlookExpress5かぁ、、、構造、わからないんだよな、、ヘルプに載ってないし 今回もOutlook97で行きます。。 料理の鉄人さんへお願いです、 OutlookExpress5の調理の仕方・ポイント、教えてください。 添付ファイルか、、さて、どうしよう? 参照設定を使用して、オブジェクト構造を知ろう まず、ExcelのVBA画面を出し、モジュールを入力可能とします。 *Alt+F11、、それから、、挿入モジュールだったけ? 次に、 sub test() end sub とモジュールを書きます。 ここから、ポイント、 ツール・参照設定を選択します すると、ものすごい数の参照可能なライブラリが表示されます。 画面をスクロールさせ、目的のライブラリ・オブジェクトを探します。 *名前で、あたりをつけるの、、難しいが。。。 ここでは、 Microsoft outlook 8.0 Object library を選択してみた。 あれ、その下に、エクスプレス5.0?あるじゃん、、もしかして? *今回は、興味があるけど、そのままにします。  (あたらしい新鮮な食材に目を奪われそうになるが、ガマン) dim aaa asと入力すると、型の一覧が出ます。 ここで、Dim aaa As MailItem とします。 次に、 aaa. とピリオドを打つと、MailItemのプロパティ、メソッドが表示されます。 *いろいろあるので、大変です。。。 ..Attachments の添付関係のオブジェクトを選択します。 ここから、ピリオドを打って、さらに深く読んでいきます。 ..Attachments.Itemや.Count を押さえて、さらに、Itemの下にある、 ..Attachments.Item.DisplayName や .SaveAsFileメソッドを見ます。 なんて、スムーズに書きましたが、実際は、英単語の辞書で単語変換したり、 いろいろ、目的のプロパティ・メソッドを探すのに、苦労しました。 だいたい、アタッチですぐ添付って頭の中、ひらめきます? うん、ひらめくよ、、、えっ、、、私だけ、わからなかったの、、、 /* * 3.なんとか、作った手抜きのサンプルです */ なんとか、作った手抜きのサンプルを載せます。 小骨とか丁寧に処理していないので、 食べるとき、のどにささるかも知れません、、(エラーが発生するかも?) 注意して下さい。。。 *小骨があったほうが、栄養的には、いいでしょう。。なんて、、、  ホントは、彼女にやさしく食べさせてもらいたいって?  甘ったれんなよ、、、(いいなぁ、、そんな人は、、、) ---------------------------------------------------- Sub aaa() test5 ("下書き") End Sub '手抜きで、C:¥に添付ファイルを保存する Sub test5(strFNAME As String) Dim olAPP As Object Dim olNameSPC As Object Dim objItem As Object Dim dteCreateDate As Date Dim strSubject As String Dim strItemType As String Dim strBody As String Dim intCounter As Integer Dim strOKNG As String Dim strMSG As String Dim nFCNT As Integer Dim objATT As Object '添付情報格納用 Dim n As Integer 'カウンター Dim strATTNAME As String '添付ファイル名 Set olAPP = CreateObject("Outlook.Application") Set olNameSPC = olAPP.GetNamespace("MAPI") ' Namespace オブジェクト strOKNG = "NG" For nFCNT = 1 To olNameSPC.Folders(1).Folders.Count If olNameSPC.Folders(1).Folders(nFCNT).Name = strFNAME Then strOKNG = "OK" Exit For '見つかったので抜ける End If Next nFCNT If strOKNG = "NG" Then MsgBox strFNAME & "フォルダーは、見つかりませんでした" Exit Sub End If For Each objItem In olNameSPC.Folders(1).Folders(nFCNT).Items intCounter = intCounter + 1 With objItem dteCreateDate = .CreationTime strSubject = .Subject strItemType = TypeName(objItem) strBody = .Body Set objATT = .Attachments '添付ファイル情報を参照可能にする End With '添付ファイルが存在したら、 For n = 1 To objATT.Count 'ファイル名を取り出す strATTNAME = objATT.Item(n).DisplayName 'C:¥に保存する objATT.Item(n).SaveAsFile "c:\" & strATTNAME MsgBox "C:\" & strATTNAME & "に保存しました" Next n strMSG = vbTab & "アイテム番号" & intCounter & " - " _ & strItemType & " - 作成日 " _ & Format(dteCreateDate, "yyyy/mm/dd hh:mm am/pm") _ & vbCrLf & vbTab & vbTab & "件名 : '" _ & strSubject & "'" & vbCrLf _ & strBody If MsgBox(strMSG, vbOKCancel) = vbCancel Then Exit For End If Next objItem End Sub ---------------------------------------------------- 調理のポイント、 Set objATT = .Attachments '添付ファイル情報を参照可能にする ここで、オブジェクト変数に代入し、 添付関係のオブジェクトにアクセス可能とする。 '添付ファイルが存在したら、 For n = 1 To objATT.Count           ↑添付ファイルの数だけ処理する、、0は無し2は2個 'ファイル名を取り出す strATTNAME = objATT.Item(n).DisplayName               ↑表示名をファイル名とする、、、 'C:¥に保存する objATT.Item(n).SaveAsFile "c:\" & strATTNAME           ↑saveasfileメソッドを使用して、ファイルを取りだし保存 MsgBox "C:\" & strATTNAME & "に保存しました"           ↑オマケ Next n う〜ん、、、自分でも、わからなくなってきた、、、 味付けにも、自信ないし、、、食べやすい・消化しやすいサンプルになってない。 自分で、いろいろ、変更しながら、探ってください。 /* * 4. [三流PG No.031]の再調理、、 */ 読者から、積み残しの回答、いただきました、 こんな、調理方法・味付け、あったんですね。 参考になりました。 In message "はじめまして。(Re: [三流PG No.031])", >今回のプログラム講座、以前に同じようなことをしようとやりかけたことがあったので、 >実際はどうやるのか興味深く読ませていただきました。 >とても勉強になりました。 > >また、興味があったので「漢字氏名だけ、スペースが取れない」原因を自分なりに調べてみました。 > >今回、「漢字氏名だけ、スペースが取れない」状態になってしまった原因はString型が文字を >UNICODEで格納しているせいだと思います。 >ファイルから読み込むときはShift-JISを読み込むため、ちゃんと全角文字は半角2文字分で読み込 >まれているのですが、それをString型に代入したところでコードがUNICODEになってしまいます。 >このため、"織田 信長 " (半角20文字) >が、UNICODEの16文字として変数に入ってしまい、固定長のString型の残りの部分は名にも入らな >いため、Nullになってしまうようです。 >そして、Trim()では文字列の最後が空白ではなくNullであるためそのまま何もしていない、 >ということのようです。 > >だから、一番簡単な解決策は、データをファイルから読み込む前に > strREADBUF.漢字氏名 = " " '20個の空白で初期化 >と、することじゃないでしょうか。 > >もしかしたら、もう分かっていることを書いてしまったかもしれませんが・・・、 >原因と解決策が分かったのがうれしかったので、つい書いてしまいました。 -------------------- バッチリでした、OKです。 ありがとうございました。 カッコつけて、 strREADBUF.漢字氏名 = Space$(20) 'スペースで初期化する を加えました。*タダ表現変えただけの盗作です。 面白いですね。始めは、strconvで変換しようかと考えていたのですが、 スペースを代入(初期化)で良かったんですね。 これからも、味付けテクニック、何かあったら、教えてください。 あとは、空行が1行出る問題か、、ループの作りが悪いんだけど、 今回は、小細工で、 LOF(filenumber)を使用して、ファイルサイズを算出します。 これを64で/って、レコード数を出します。 For n = 1 To (LOF(IN_FNO) / 64) 'ファイルサイズを64で割って、レコード数算出 strREADBUF.漢字氏名 = Space$(20) 'スペースで初期化する ' Get ステートメントを使って、サンプル ファイルを読み込みます。 Get #IN_FNO, n, strREADBUF ' n番目のレコードを読み込みます。 '読み込まれたデータを書き込むCSVにする、、、 'カンマだけ付ける””は好みで? Print #OUT_FNO, Trim(strREADBUF.社員番号) & ","; '←セミコロンを付けると Print #OUT_FNO, Trim(strREADBUF.漢字氏名) & ","; '改行されない Print #OUT_FNO, Trim(strREADBUF.ローマ字) & ","; 'ここがポイント Print #OUT_FNO, Trim(strREADBUF.yobi1) & ","; Print #OUT_FNO, Trim(strREADBUF.yobi2) '最後は改行したいので付けない Next n 手抜きだなぁ、、、EOFの正しい使い方(位置)、オボエナイト、、、 ----- LOF Open ステートメントを使用して開いたファイルの長さをバイト単位で 示す長整数型 (Long) の値を返します。 構文 LOF(filenumber) 引数 filenumber には有効なファイル番号を整数型 (Integer) で指定します。 この引数は必ず指定します。 メモ 開いていないファイルの長さを取得するには、FileLen 関数を使用します。 ----- /* * 5.ハッシュ法・二分検索 */ 読者の方に、先に、解説されてしまった。。。 チョットなさけないと思いつつ、 楽な道(そのまま掲載)を選んでしまった。 *自分で、味付け方法わからなくて、ただ、レンジで温めるだけじゃ、、、ねぇ、 ------------------------------------------------------ >三流プログラマさま、こんばんは。 > >二分探索とハッシュについてなかなか調べて頂けないので、 >私からお答えしましょう。 > >二分探索 > >二分探索はキーがきちんと順番に並んでいる時に有効です。 > > > ○○○○○○○○○○○○○○○○○○○○○○○○○ > 小← →大 > >○が探索するデータだとします。キーは左にいくほど小さく、右にいくほど >大きいとします。 > >まず、真中のデータを取り出して、探索キーと比較します。 > > ○○○○○○○○○○○○●○○○○○○○○○○○○ > >ここで、キーが等しければ運良く探索が終了します。 >探索キーが●のデータのキーより小さければ左半分、大きければ右半分に >探索したいデータがあるはずです。 > >そこで、さらに左半分あるいは右半分に対して同じことを繰り返せば、 >どこかで見つかります。 > >このように、二分探索は探索候補を半分に絞り込んでいって探索しますので、 >頭から順番に探索するよりずっと効率的に探索できます。 >最悪の場合でも log_2 n 回(n は探索データの数)の比較で探索を終了することが >できます。順番に探索する場合は最悪の場合で n回の比較が必要なので、 >データの数が多くなると二分探索がだいぶ有利になることが分かるでしょう。 > >ハッシュ法 > >ハッシュ法はデータを格納する時にちょっとした工夫をすることによって、 >探索効率をあげます。 > >まず、ハッシュ関数というものを考えます。 >これは、検索の対象になるキーからある範囲の値を導くような関数です。 > >具体例で説明します。 > >文字列をキーとして検索をする場合を考えます。ハッシュ関数としては、 >文字列の ascii コードの和を 100 で割ったあまりを求める関数とします。 > >キーをハッシュ関数にかけて得られる値をハッシュ値と呼びます。 >例ではハッシュ値は0〜99の値を取ります。 > >ハッシュ法ではデータを格納する時にハッシュ値を求めてそれをインデックス >として格納します。データを検索する時には、検索キーをハッシュ関数 >にかけてハッシュ値を求めて、そのインデックスからデータを取り出します。 > >しかし、ハッシュ値は別のキーから同じハッシュ値を得られる場合もあります。 >この場合どうするのでしょう? > >答え場簡単です。同じインデックスに複数のデータを格納できるようにします。 >検索する時には、ハッシュ関数を使ってインデックスを求めてから、 >そのインデックス中のデータからさらにキーの一致するものを探せば良いのです。 > >ハッシュ値の取り得る範囲を十分大きくとっておけば、この方法で十分高速に >探索できます。なんといっても最初のインデックスを求めるところまでは >一回の計算で求めることが出来るわけですから。 > > >あまり厳密的ではありませんが説明としてはこんなところです。 >仕組みとしては、非常にシンプルですので容易に理解できると思います。 > ># この文章は掲載可です。 -------------------------- 丁寧な解説、ありがとうございます。 ご好意に甘えて、そのまま載せさせていただきました。 また、テクニック不足なところなど、あったら、 ガンガン、指摘してください。 *みなさんのここは違うだろ、、、などの毒舌メールまってます。  (あたたかい、励ましメールも、まってますよ、、) /* * 6.終わりの挨拶 */ 今回は、読者に頼りっぱなしの講座でした、、 積み残し、食べ残し、まだまだ、、、、


質問や要望、クレームを送る(三流君に連絡する 連絡方法)

質問や要望など連絡方法でお互い確認が取りやすく、便利なのが掲示板なのですが、私の対応のまずさから不定期で荒れてしまい、掲示板は現在封鎖中です。(反省しなきゃ)
感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。
あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい

(感想や質問・要望・苦情はHPで記事に載せることがあります。)

急ぎで連絡がほしい、そんな時は:[
三流君連絡先]に連絡してください。

番外編 愚痴系で書いてた今日の一品 (短いサブ関数など)

2000/05/13 SQL Count関数を使ってみる
2000/05/11 Access97 標準関数Midなどが使えない
2000/05/09 SendObjectのエンコード
2000/05/08 クエリーで〜以外とは
2000/04/27 Imagingコントロールを使ってみた
2000/04/25 Excel97 VBA イベントなど
2000/04/24 Access97で複数のプリンタを切替えて使用
2000/04/20 書式付きエクスポート DoCmd.OutputToで、できます
2000/04/19 Access97でExcel形式へExport時に書式設定を行いたい
2000/04/13 Access97でOutlook97/98とリンクする方法
2000/04/13 VBA Nameステートメント
2000/04/04 Accessでキー取得
2000/04/04 AccessでFile参照ダイアログ?
2000/04/03 縦書用数値変換改良
2000/04/01 Access Err テーブルを消したい
2000/03/31 縦書き数値、どうしてますか?
2000/03/29 VBA 手抜きで、処理後、explorerを開く
2000/03/28 Access --> Word へデータ
2000/03/24 名前一覧Excelの機能で、同じことできました
2000/03/23 Excel97 VBA セルに付けた名前一覧を作成する
2000/03/21 Excel セルに名前付け
2000/02/25 iniFileを読む GetPrivateProfileString
2000/02/15 Excel VBA Rangeオブジェクトとサンプル
2000/02/14 Access97 SizeMode/OLEサイズ で画像調整
2000/02/10 Access97 Pictureプロパティとサンプル
2000/02/09 Access97 集計クエリーで重複値をハジク
2000/02/07 Access97 サブフォームへ値をセット
2000/02/04 Access97 コントロールソース、チョットした使用法
2000/02/01 Access97 フォームフッター
2000/01/18 Access97 now()関数で有効期限処理、、、

←パソコンの技術系の書籍を探しているなら コンピュータ関連の出版社33社(アスキー、インプレス等)が共同運営するコンピュータの本・専門店 種類が豊富で探し易い※在庫ありが48時間以内発送


[三流君(TOP)]へ戻る。