[三流君] −−> [プログラマー業務の愚痴] −−> [バックナンバー一覧]
−−> No.032 OutLook97から添付ファイルを抜き出す

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


本文(発行内容)


<OutLook97から添付ファイルを抜き出す>
目次
1.はじめの挨拶
2.参照設定を使用して、オブジェクトの構造を知ろう、、 
3.まず、読み込みだけ、作成しよう
4. [三流PG No.031]の再調理、、
5.ハッシュと二分検索
6.おわりの挨拶
----------------------------------------------------------------------------
/*
 * 1.こんにちは
*/
こんにちは。
紹介文から、C言語を削りました。。。
そのうち、ネタたまったら、復活させます。

今回の依頼は、
OutlookExpress5から、添付ファイルを取りたい、、です。
----------
 >とあることがやりたいのでEucの過去ログをさぐったところ
 >唯一ひかっかた話題をされていた貴殿のWebに迷い込み、バックナンバーを
 >2,3見たところ、面白そうなので今後メルマガを購読しようかと思ってお
 >ります。
 >で、「やってみたいあること」についてですが、
 >ExcellのVBAでOutolookExpress5の添付ファイルをどっかのフォルダにコ
 >ピーしたい! ということです。もしご存知なればぜひぜひアドバイスをお
 >願いしたいです。
----------
前に作成したサンプルに肉付けをして(簡単に調理して、、)
出そうと思います。

オイオイ、、新しい、おしながき(ジャンル)じゃなくて、簡単にすませたね、、、
それじゃ、実力あがらないよ。。。

カツ丼のうまいそば屋をめざしているんじゃなかったっけ?
あれ、チャーハン・餃子のうまい、ラーメン屋?だったっけ

なんか、本業ダメだけど、オプションはうまい店、、みたいじゃん?

そこそこ食べれる、ファミリーレストラン目指してるんだけど、、、
味にうるさい人は、専門店へ、、、なんてね。

目玉商品が無い店は、つぶれる?だろうし、、、
このメルマガのウリ、他店に負けない、おいしいところって、なんだろう?

速い・ウマイの牛丼屋をめざしますか、、、

いつもの、わけわからない話は、これくらいにして、そろそろ、やりますか。。。

/*
 * 2.参照設定を使用して、オブジェクトの構造を知ろう、、、
*/
OutlookExpress5かぁ、、、構造、わからないんだよな、、ヘルプに載ってないし
今回もOutlook97で行きます。。
料理の鉄人さんへお願いです、
OutlookExpress5の調理の仕方・ポイント、教えてください。

添付ファイルか、、さて、どうしよう?

参照設定を使用して、オブジェクト構造を知ろう
( hosoku/032/index.html 参照 )

まず、ExcelのVBA画面を出し、モジュールを入力可能とします。
*Alt+F11、、それから、、挿入モジュールだったけ?

次に、
sub test()

end sub
とモジュールを書きます。

ここから、ポイント、
ツール・参照設定を選択します
すると、ものすごい数の参照可能なライブラリが表示されます。
画面をスクロールさせ、目的のライブラリ・オブジェクトを探します。
*名前で、あたりをつけるの、、難しいが。。。

ここでは、
Microsoft outlook 8.0 Object library を選択してみた。
あれ、その下に、エクスプレス5.0?あるじゃん、、もしかして?
*今回は、興味があるけど、そのままにします。
 (あたらしい新鮮な食材に目を奪われそうになるが、ガマン)

dim aaa asと入力すると、型の一覧が出ます。
( hosoku/032/index.html#004 参照 )
ここで、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.終わりの挨拶
*/
今回は、読者に頼りっぱなしの講座でした、、
積み残し、食べ残し、まだまだ、、、、

では、また。 三流PG Ken3でした。



ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、

リンクや広告など

項目別に本音?それとも建て前?的な記事をまとめました。

気になったジャンル↓を選択してください。
[ルーキー rookies]・・・ 新人さん達 初心者さんへ
[学ぶ study]・・・学習、技術の取得
[仕様書 doc]・・・仕様書・設計書関係の話
[共同作業 team]・・・チーム、グループ作業
[プログラムは心? spirit]・・・プログラマー 心・気質・魂

[掲示板デビューしようぜ bbs]・・・掲示板関係の話、質問者・回答者の気持ちほか
[昔はできた seo]・・・三流式の効果無しSEOとアフィリエイト
[仕事や作業、転職 job]・・・仕事や転職、評価、作業など
[その他 etc]・・・その他 分類外の記事

※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。
※※読んで、気分を悪くされたらスミマセン。

Blogとリンク:[三流君の作業日記]/ [愚痴(Bookmark)]/ [広告Blog(Bookmark)]



[三流君(TOP ken3.org へ戻る)] / [プログラマー業務の愚痴] / [バックナンバー 一覧]