ラベル Outlook の投稿を表示しています。 すべての投稿を表示
ラベル Outlook の投稿を表示しています。 すべての投稿を表示

2011年12月1日木曜日

step5 メール受信時間から日付情報のみを取り出す

「Outlook VBAでさくさく効率化」で取り上げたかった重要なポイントも大分カバーできました。
今回は、以前に紹介したメールの受信時間を調べる方法の応用です。
今回のエントリーでは、日付情報のみを取得します。

これができるようになれば、日付ごとに添付ファイルを整理することが可能になります。

NTTフレッツ光

ReceivedTimeは秒単位で受信時間を管理している

ReceivedTimeを使って受信時間を調べると、左の画像のようにやたらと細かい単位で習得できることがわかります。

これはこれでいいんですが、大抵の場合日付以下の部分は不要な情報です。

ここから日付情報だけ抜きだしてやりましょう。


*"受信時間:"は自分で明記しているので、
Debug.print XXX.ReceivedTime
としている場合は、もちろん受信時間:は表示されません。

データ型を調べてみる
step3.5で文字列操作について紹介しました。(→復習しますか?)
left, right, mid関数を駆使することで、今回の目標ももちろん達成可能です。
でも、勉強がてら、もう少しいじってみましょう。

そこで、このReceiveTimeで返ってくるデータ型を調べます。
こういうときに便利なのが、TypeName関数です。ヘルプで見てみると、

構文
TypeName(varname)
引数 varname は必ず指定します。引数 varname には、ユーザー定義型の変数を除く、任意のバリアント型 (Variant) の変数を指定します。

ということで、早速調べてみましょう。次のコードを書いてみて下さい。
Debug.Print TypeName(myfolder.Items(i).ReceivedTime) 
イミディエイト・ウィンドウにはどう表示されるでしょうか?
Dateと返ってくるはずです。
ということで、ReceiveTimeで返ってくるデータは文字列ではなく、日付型のデータということが分かりました。

日付型データのいろいろ

日付データの加工というのは、地味な作業ですが思いのほか色々な場面で使用します。
代表的な例だけいくつか取り上げてみましょう。

1.年、月、日のデータだけを取り出す。

・Year(varname) → 年 yyyy
・Month(varname)→ 月 m
・Day(varname)→ 日 d

という感じです。

ですので、スマートではありませんが、
でスラッシュぬきで、yyyymd形式のデータが取れます。

2.Format関数を使う
最強なのがFormat関数です。
構文
Format(日付データ, 表示形式)
yymmdd形式が欲しければ、
Format(日付データ, "yymmdd")
と指定してあげます。
もちろん年データはいらないという場合であれば
Format(日付データ, "mmdd")とすればいけます。

これで、ReceivedTimeはかなりしゃぶりつくしたことになります!!



<関連エントリー>
step3.5 これだけは押さえておきたい文字列操作の3パターン
step3 Outlook アドレス、件名、受信時間を調べる

<参考サイト>
Tatsuya's Home Page










PVランキング 人気ブログランキングへ

2011年11月20日日曜日

step4.5 添付ファイルを連番で保存

step4では、Outlookで受信した添付ファイルをとりあえず保存する方法を紹介しました。
これはこれで便利だと思います。
ただ、これは結構大ざっぱな作りです。

というのも、「SaveAs」は同一のファイル名のファイルが存在する場合上書き保存になってしまうからです。
ですので、一度に同一名ファイルのものを処理しようとすると最後に処理したファイルのみがポツンとフォルダに残った状態に。






NTTフレッツ光





いろいろ回避の仕方はありますが、その一つがファイルを連番で保存するというやり方です。
abc_2.csv、abc_3.csv、abc_4.csv、…、abc_n.csv (n = 2,3,4…)
という感じです。

こうした形式の保存方法のヒントはすでに文字列についてのエントリーで紹介済みです。
考え方としては、下のフローチャートのようになります。






















これであれば、100個でも200個でも大丈夫です。
さて、コードは以下の通り。

file_name = myfolder.Items(i).Attachments(j).DisplayName
If Dir(path & file_name) = "" Then
myfolder.Items(i).Attachments(j).SaveAsFile (path & file_name)
Else
'同じ名前のファイルが保管フォルダーにあるので、名前を変更
k = 2
While Dir(path & Replace(file_name, Right(file_name, 4), "") & "_" & k & Right(file_name, 4)) <> ""
k = k + 1
Wend
myfolder.Items(i).Attachments(j).SaveAsFile (path & Replace(file_name, Right(file_name, 4), "") & "_" & k & Right(file_name, 4))

コードの冒頭で読みやすくするために、file_nameという変数の中に添付ファイルのオリジナルのファイル名を突っ込んでいます。
これで可読性が上がり、自分に優しいコードになります。 簡単ですが、これで連番で保存することが出来るようになります。



PVランキング 人気ブログランキングへ

2011年11月13日日曜日

step1.5 受信トレイ以外のフォルダを指定

step1では、デフォルトで指定されているフォルダ(受信トレイ)を指定先としてオブジェクトを作りました。
当たり前ですが、このままコードを書きすすめていくと、受信トレイにあるメールしかマクロで動かせません。
他のフォルダのメールも操作したいですよね?
という要望があるはずなので、ここでは番外編として好きなフォルダを指定する方法をまとめておきます。


ここでは試しに、受信トレイ直下にある「TEST」というフォルダを指定してみましょう。
Outlook上ではこんな感じの表示なっている状態です。



















コードは以下のようになります。

Set objOL = CreateObject("Outlook.Application")
Set objNAMESPC = objOL.GetNamespace("MAPI")
Set myfolder = objNAMESPC.Folders(olFolderInbox).Folders("TEST")
Debug.Print myfolder



イミディエイト・ウィンドウにTESTって表示されましたか?
objNAMESPC.Folders(olFolderInbox)で受信トレイまでたどり着いているので、その傘下にあるFolderを名前で指定してあげいるわけですね。



では、TESTフォルダーの下にある子TESTを指定したいときはどうするのでしょう?
こういう状態ですね。




















答えはこうですよね
Set objOL = CreateObject("Outlook.Application")
Set objNAMESPC = objOL.GetNamespace("MAPI")
Set myfolder = objNAMESPC.Folders(olFolderInbox).Folders("TEST").Folders("子TEST")
Debug.Print myfolder


ここまでやるとどれだけ下層のフォルダーでも指定できますね! ってそんな深くフォルダを作る人はいない気がしてきたが↓


PVランキング 人気ブログランキングへ

Outlook VBAの便利なサイト集

先人たちの知恵をここから学びに行きましょう!

三流君

ここがすごいのは、動画も一緒にアップしてくれているのでホントに「見て」分かります。






NTTフレッツ光





Outlook研究所

読者投稿に応えてエントリーを増やしたりしていてインタラクティブなサイトです。
エントリー数が多くて参考になる記事が多いのが特徴。







Outlook VBA Sample

シンプルな作りで、必要なパーツ毎にまとめられています。
コピペプログラマー向きなサイトです。






見つけたらまた追加していきます!
PVランキング 人気ブログランキングへ

step3 Outlook アドレス、件名、受信時間を調べる

前回は届いていたメールの総数を数えました。(step2)
いよいよ個別メールの情報を調べていきましょう。
これが自在にできれば、目標にかなり近づきます!!
コードは↓のような感じ

Sub Outlook_test()
Dim objOL As Object
Dim objNAMESPC As Object
Dim myfolder As Object

Set objOL = CreateObject("Outlook.Application")
Set objNAMESPC = objOL.GetNamespace("MAPI")
Set myfolder = objNAMESPC.GetDefaultFolder(olFolderInbox)
Debug.Print myfolder

myfolder.Items.Count
Debug.Print myfolder.Items.Count

Dim i As Long
i = 1
Dim ItemNumber As Long
ItemNumber = myfolder.Items.Count
Do While i <= ItemNumber
   Debug.print "受信時間" & myfolder.Items(i).ReceivedTime & "アドレス" & myfolder.Items(i).SenderEmailAddress & "件名" & myfolder.Items(i).Subject

i = i + 1
Loop
End Sub
動きましたか? やってることは 「myfolderにあるi番目のアイテム(メールのこと)の受信時間(ReceivedTime)、アドレス(SenderEmailAddress)、件名(Subject)を表示する」 という作業をItemNumber(受信メール総数)回だけ繰り返す ということです。

NTTフレッツ光

ちなみに、プチネタですがプログラムを少し早く動かすために工夫があります。 ItemNumber = myfolder.Items.Count Do While i <= ItemNumber の部分です。 次のエントリーではいよいよ添付ファイルの情報を調べるやり方について書きます。 これって Do While i <= myfolder.Items.Count と書いても同じ意味ですよね? 変数も一つ減るし楽な感じがします。 でも、実はこの書き方の方が実行速度は落ちます。 なぜかというと、毎回myfolderにあるアイテムの数を数えているからです。 件数が少なければ大したことありませんが、1,000件も10,000件も溜っているメールボックスの情報を取る場合は目に見える差が出ます!! まぁちょっとしたこだわりです。 別に気にしなくても構いません。笑 PVランキング 人気ブログランキングへ

2011年11月12日土曜日

step2 Outlook受信トレイのメールの件数を数える

前回は、デフォルトで指定しているOutlookのメールボックスをオブジェクト化するところまで説明しました。
メールをいじるところの直前までいったことになります。
今回は、メールボックスに届いているメール件数を調べてみます。
コードは以下の通り、前回分に2行増えます。

Sub Outlook_test()
Dim objOL As Object
Dim objNAMESPC As Object
Dim myfolder As Object

Set objOL = CreateObject("Outlook.Application")
Set objNAMESPC = objOL.GetNamespace("MAPI")
Set myfolder = objNAMESPC.GetDefaultFolder(olFolderInbox)
Debug.Print myfolder
myfolder.Items.Count
Debug.Print myfolder.Items.Count
End Sub

動きましたか?これで受信トレイにあるメールの総数がイミディエイト・ウィンドウに表示されるはずです。
コードを手入力された場合は、「Items」と複数形になっているのに注意して下さい。
自分で書いてて、単数形で書いたせいでばっちり途中で止まりました 汗

より下層のオブジェクトを作成するときは…
お気づきかと思いますが、上記で書いたことは結局↓のように書いても同じことになります。
CreateObject("Outlook.Application").GetNamespace("MAPI").GetDefaultFolder(olFolderInbox).Items.Count
XX.YY.ZZという流れで、大きいモノから小さいモノへと「.」でつないで行き、最後にメソッドとなるcountで数えています。
これをいちいち書いてられないし、読みたくもないので、Setを使って名前を付けてあげているわけです。


人気ブログランキングへ

step1 オブジェクトの生成 Outlookをエクセルからいじるスタートポイント

前回のエントリー(最初にすること 参照設定 )では、参照設定をしました。
次は、OutlookをエクセルVBAでいじるために、Outlookのオブジェクトを作ります。

Sub Outlook_test()
Dim objOL As Object
Dim objNAMESPC As Object
Dim myfolder As Object

Set objOL = CreateObject("Outlook.Application")
Set objNAMESPC = objOL.GetNamespace("MAPI")
Set myfolder = objNAMESPC.GetDefaultFolder(olFolderInbox)
Debug.Print myfolder
End Sub

意味不明からもしれませんが、くじけずに。
これを実行すると、イミディエイト・ウィンドウにデフォルトで指定されているフォルダ名が表示されます。
多分、「受信トレイ」とかが出ると思います。(人によって違うけど普通いじってない)

上記でやっているのは、
・「Outlook Application」をオブジェクトにしてあげて
・NameSpace(名前空間)の取得して
・それをobjNAMESPCってオブジェクトにして
・その中にあるデフォルトのフォルダをmyfolderというオブジェクトにする
という作業。

あくまでイメージですが、↓な感じで具体的にいじりたい対象であるメールまでたどり着くための設定をやっています。
上のコードではメールまではたどり着いてませんが、直前のフォルダまではたどり着いてます。
次のエントリーで、もう一歩進みましょう!






NTTフレッツ光






PVランキング 人気ブログランキングへ

step0 最初にすること 参照設定

Outlookのみでコードを書いているのなら、不要な設定です。
でも当ブログが目指すエクセルでOutlookをいじる場合には、絶対必要なことです。
しょうもない話ですが、最初にやるときは忘れるので記事にしておきます。

◆やり方
(エディターの画面で)ツール(T) → 参照設定(R) → 参照可能なライブラリファイル(A)
といって大量にある中から、Outlookを選びます。
↓な感じです。使っているバージョンによってOutlook XX は違うはず。ボクのは12.0みたいです。

これで終了。
あとはお好みのコードを書いていけばいい。


PVランキング 人気ブログランキングへ

2011年11月10日木曜日

これが手元にないなら、モグリです~武器になるレファレンス~

いきなり変なタイトルですが、武器を配りたいんすよw
エクセルでVBAのコードを書くときに分からないことがあったらどうしてますか?
ググって誰かのサイトを見るのも手です。
ピンポイントで回答が見つかればいいんですが見つからないことも多々あるし、細かいところ正しいところってのは確認しにくいもんです。

そういうときは、ボクはヘルプ機能を使って調べるってのをよくやります。


こんな感じです。細かい部分を調べるときには、メンドーですがこれが神です。

ただ、新しいことをやる際にはどうメソッドがあるのか分からないし、名称も知らない。
こういうときは、ググりようがないですよね。
そんな中で役に立つのがここ。
マイクロソフトが作成しているDeveloper Referenceです。



日本語があればいいんですが、残念なことに英語のみです。

ただこれだけ読んどけば簡単にコードが書ける!!、わけはなく…。
もちろんプロはこれで十分なんでしょうが…。

このサイトでも適宜ここを参考に大事なポイントをまとめていきます!




BLOG・SNSレンタル部門 PVランキング 人気ブログランキングへ  

2011年11月9日水曜日

このブログの目標

このブログを読んで何ができるようになるかを簡単にまとめておきます。
■目標
<何を>
Outlookで受信したメールに添付されているファイルを
<どこに>
事前に指定したフォルダに
<どうやって>
自動で、予め指定したファイル名で
<どうする>
保存する
■どんな人向け?どんなことに使えるの?
1)毎日大量の添付ファイルを受信している人
2)受信したファイルを特定のルールで保存しなきゃいけない人
3)しかも、保存フォルダを間違えたり、ファイル名を手で修正しないといけない人
■このプログラムの特徴は?
1)使い慣れたエクセルで管理して、誰でも簡単にツール管理ができるようになります。
2)基礎を覚えたら、色々と応用できるので結構いろんな用途に対応できるようになります。
■管理人はどう使ってる?
業務でガンガン毎日使ってます!
海外から山のようにデータファイルが届いて、日本の翌朝に所定のフォルダに保存してます。
毎日、100件くらいメールが届いていて、その中から必要なものを(大体80件くらい?)のを各々のフォルダにしてます。
手でやると死ぬほどめんどくさい作業です…。
そんな業務から解放するのが、当ブログの目標です。
みんな楽して下さい。
*もちろんプログラムのミスなどによる影響は自己責任でお願いしますね!





NTTフレッツ光







ブログランキング PVランキング 人気ブログランキングへ