• ベストアンサー

エクセルでメール配信

例えば、あるエクセルのファイルがあって、2日経っても更新されていないと、ある一定の人にメールで知らせるという方法はありますか? 会社のネットワークで共有しているファイルがあるのですが、毎日更新するべきものなのに、担当者がルーズなため、ちっとも更新しないので、その者を管理する人にメールで知らせようと思います。 どうやったらできるのか、まったく思いつきません。 どうかアドバイスお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

winarrow07です。 とりあえずファイルの更新日時を見て判断でよければ、案をひとつ。 WSHスクリプトでやる方法です。メールは社内STMPサーバを利用を想定しています。SMTP認証が必要な場合は設定追加が必要かと思います。 1.下記コードをメモ帳にコピーする。 2.中身を環境に合わせて修正する(監視するファイル名、メールサーバの設定など) 3.修正したら保存して終了する。 4.保存後、拡張子を.txtから.vbsに変更。 5.ファイルをダブルクリックして実行し試す。 はじめはテスト用のファイルを作成してそれを監視して自分宛てにメールが来るなどして動作確認するのがいいと思います。(.vbsに拡張子を変更したあとそのファイルを編集する場合は右クリック→編集です。ダブルクリックするとスクリプト実行されますので。。) ファイル更新日時を変更できるフリーソフトなどを使い検証してみるといいかもしれません。 うまくいったら本番用の設定にしてタスク等で定期的に実行すればOKかと思います。 コード================================================== Option Explicit REM ####################################### REM 監視対象のファイル名を設定 REM ####################################### Dim strFilename strFilename = "C:\test\test.bat" REM ################################################### REM ファイルの最終更新日時が2日以内であれば何もせず終了 REM ################################################### Dim objFSO Dim objFile Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.GetFile(strFilename) If DateDiff("d",Now,objFile.DateLastModified) > -2 then Set objFile = Nothing Set objFSO = Nothing WScript.Quit End If REM ####################################### REM メールの設定 REM ####################################### Dim objMessage Dim mySMTPServer Dim mySMTPPort mySMTPServer = "mail.example.jp" mySMTPPort = 587 REM ####################################### REM メールの送信 REM ####################################### Set objMessage = CreateObject("CDO.Message") objMessage.From = "xxxxx@example.jp" objMessage.To = "yyyy@example.jp" objMessage.Subject = objFile.Name & "ファイル未更新" objMessage.TextBody = objFile.Name & "ファイルの内容が更新されていません。" & vbCrLf & "更新をお願いします。" objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = mySMTPServer objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = mySMTPPort objMessage.Configuration.Fields.Update objMessage.Send Set objFile = Nothing Set objFSO = Nothing Set objMessage = Nothing

acchandesu
質問者

お礼

ありがとうございます。ご提案頂いた内容は私にとって少し難しそうですが、チャレンジしてみます。

acchandesu
質問者

補足

Option Explicit から下をコピーしてやってみたのですが、以下のようなエラーが出てしまいました。 行:39 文字:98 エラー:文字が正しくありません コード:800A0408 ソース:Microsoft VBScript コンパイルエラー 原因がわかりますか?

その他の回答 (5)

回答No.6

再度winarrow07です。 自分でも「この記事からメモ帳にコピペして保存」をしてみたところ、 「このANSI テキストファイルとして保存すると失われてしまうunicode形式の・・・・」 というメッセージがでました。 まぁ、何かが起きているんでしょうが、もし同じことが起きたら下記をやってみてください。 ・上記のメッセージが表示されたら構わず「OK」を押して保存する。 ・一旦閉じて再度保存したファイルを開く ・すると下から7行目付近にhttp:で始まるURLを囲んでいる行が3行  ほどあると思いますが  そこの「("http://」が「("?http://」と「?」が入っていると思うので「?」を削除してください。  また、URLを囲い終わった「")」のところも「")?」となっているかも  しれません。これも「?」を削除してください。  「?」は全部消してください。 それで、エラーが出なくなればOKです。 別のエラーでコード80040213の場合はメールサーバに接続できない等のエラーとなります。  

acchandesu
質問者

補足

やってみました。教えていただいた通りにやってみたら、同じような感じになって、?は全部消しました。しかしまたエラーが出て、コードが80040211が出ました。わかりますか?

回答No.5

winarrow07です。恐らく文字コード当たりの影響かと思うのですが、 メモ帳で保存するときは特にエラー出ませんでしたか? 一部修正したものをもう一度掲載してみますので再度試してください。 =============================== Option Explicit REM ####################################### REM 監視対象のファイル名を設定 REM ####################################### Dim strFilename strFilename = "C:\test\test.bat" REM ################################################### REM ファイルの最終更新日時が2日以内であれば何もせず終了 REM ################################################### Dim objFSO Dim objFile Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.GetFile(strFilename) If DateDiff("d",Now,objFile.DateLastModified) > -2 then Set objFile = Nothing Set objFSO = Nothing WScript.Quit End If REM ####################################### REM メールの設定 REM ####################################### Dim objMessage Dim mySMTPServer Dim mySMTPPort mySMTPServer = "mail.example.jp" mySMTPPort = 587 REM ####################################### REM メールの送信 REM ####################################### Set objMessage = CreateObject("CDO.Message") objMessage.From = "xxxxx@example.jp" objMessage.To = "yyyy@example.jp" objMessage.Subject = objFile.Name & "ファイル未更新" objMessage.TextBody = objFile.Name & "ファイルの内容が更新されていません。" & vbCrLf & "更新をお願いします。" objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = mySMTPServer objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = mySMTPPort objMessage.Configuration.Fields.Update objMessage.Send Set objFile = Nothing Set objFSO = Nothing Set objMessage = Nothing

  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.3

その放置ファイルを開きもしないのに時間の経過と共に、更新してないと言う事実を掴み、メイルを送信するのは、高等(根源的・基礎的レベルでスキルのある人の)技術でしょう(特に前者)。VBA程度では判らない。 ーー (1)ブックを開くと開いた機会にプログラムが走る、というのはVBAの普通の知識で出来る (2)放置しているという事実の自動判定は、更新日時と今日を比べるなど考えられる。しかしTODAY関数などが使われていると、開く(いて保存する)と同時に今日が更新日時になるのではないかな。 決ったセルに更新日が入る仕組みである場合は、確実にチェック出きると思うが。 (3)放置されていると決ったとして、決った文言を決った相手にメイルするのは、OEやOUTLOOKを使うなどがありえる。OUTLOOKにはVBAも在る。しかし解説書など体系的情報はない(市販されていない)。OEの場合も含めて、自動送信のコード例はWEBには在る。調べると良い。 しかしVBAの熟練者でないと旨く進まないのではないかと思う。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

#1さんのご指摘の通りですが、毎日データが増えていくべきであれば、更新日にファイルサイズも併用すると、判別できるかもしれませんね。 VBSで、任意のファイルの更新日と、ファイルサイズを調べ、条件に合っていればメールを送信するスクリプトを作成し、Windowsのタスクに登録しておけば良いと思います。 「VBS メール送信」で検索すると、参考スクリプトが見つかると思います。 ファイルの更新日と、サイズ取得は、「VBS FileSystemObject」で検索してみてください。ご参考まで。

回答No.1

的確な更新されているか/いないかを判断する材料はどこかにあるのでしょうか? 例えばファイル更新日などを見て判断する方法もあると思いますが、 とりあえず開いて上書きボタン押して閉じれば見た目上は"ファイルは更新された"という扱いになります。コンピュータは更新されたと判断したけど実際は更新されてないという状況で逃げることも可能です。 人間ならば内容を見て判断できるのですが、コンピュータに判断させるには明確な基準の判断材料がなければいけません。 本気でやるなら。。

acchandesu
質問者

お礼

ファイルの更新日だけで判断するだけでも判断材料になるのかなと思います。その担当者がそのファイルを毎日開くだけでも、その担当者としては少しの進歩かなと思います。はずかしい話ですが...会社の足を引っ張っている社員で困っているところです。よって、更新日だけを見てメールを送る手段を考えたいと思います。ほんとうはもっと本気でやりたいのですが、それはその担当者のでかたを見て、次のステップとして考えたいです。

関連するQ&A