Microsoft Access ClubAccess超初心者対象ForumAccess初級者対象ForumAccess初・中級者対象ForumAccess VBA Tips ForumDAO、ADO、SQL Forum

     

No780.EXCELファイルをメールに添付するには?

タイトルEXCELファイルをメールに添付するには?
記事No: 780
投稿日: 2004/06/24(Thu) 13:40
投稿者: KOU
OS:WIN2000
Access Version:2000

始めまして。
KOUと申します。

今回このサイトを始めて使用する為、この板でよいか分かりませんが、質問させて下さい。

ACCESSのフォームに登録してあるコマンドボタンを押す事で以下の処理を行いたいと考えております。
1:現在PCに登録されているメールソフトを立上げる。
2:立ち上げたメールに特定のサーバに保存してあるEXCELファイルを添付する。
3:メールソフトのタイトルに”例:メールタイトル”というようなタイトルを入力する。
(おわり)

こちらの過去ログ検索にて1番を行う方法は見つかったのですが、2番3番を行う方法が見つからず、
難儀しております。

問題解決に向けて、皆様からのアドバイスを宜しく御願い申し上げます。

タイトルRe: EXCELファイルをメールに添付するには?
記事No: 822
投稿日: 2004/06/28(Mon) 19:00
投稿者: hide
> こちらの過去ログ検索にて1番を行う方法は見つかったのですが、
> 2番3番を行う方法が見つからず、難儀しております。

1番をどうやろうとしてるか不明なので、とりあえずOutlookを
使った場合の一例です。

Dim myOL As Object, myMail As Object
Set myOL = CreateObject("Outlook.Application")
Set myMail = myOL.CreateItem(0)
With myMail
  .To = "メールアドレス"
  .Subject = "例:メールタイトル"
  .Attachments.Add("サーバに保存してあるEXCELのフルパス")
  .Body = "本文 (メッセージ)"
  .send
End With
Set myMail = Nothing
Set myOL = Nothing

タイトルRe^2: EXCELファイルをメールに添付するには?
記事No: 838
投稿日: 2004/06/30(Wed) 10:48
投稿者: KOU
hide様。
返信ありがとうございました。
(御礼が遅れてしまい申し訳ございません)

> 1番をどうやろうとしてるか不明なので、とりあえずOutlookを
> 使った場合の一例です。
1番の方法ですが、以下の方法で行おうと考えておりました。
(フォーム上のボタンを押し、以下のコードを呼び出す)

Function RunCommandMenu()
On Error GoTo エラー
DoCmd.RunCommand acCmdSend
Exit Function
エラー:
'エラーを分岐。
If Err.Number = 2046 Then
MsgBox Err.Description
ElseIf Err.Number = 2501 Then
MsgBox Err.Description
Else
MsgBox "予期せぬエラーが発生しました。: " & Err.Number
End If
End
End Function

hide様から御教授頂いたコードを連結しようとしたのですが、OUTLOOK用との事なので連結する
方法も思いつかない状態です。

現在添付ファイル付メールを送ろうとしている人達のPCにはOUTLOOKもしくはOUTLOOKEXPRESSの
どちらかがバラバラに入っている状態の為、メールソフトがバラバラでも対応できるコードに
したいと考えております。

引き続きアドバイスの程、宜しく御願い申し上げます。

タイトルRe^3: メーラーがバラバラな場合は・・・
記事No: 846
投稿日: 2004/06/30(Wed) 18:14
投稿者: hide
> 現在添付ファイル付メールを送ろうとしている人達のPCにはOUTLOOKもしくはOUTLOOKEXPRESSの
> どちらかがバラバラに入っている状態の為、メールソフトがバラバラでも対応できるコードに
> したいと考えております。

 これって簡単に出来そうで難しいかも・・・

 このような場合は、SendObjectを使えば、PCのデフォルトのメーラーで送る
ことが出来るのですが、添付ファイルを扱えたかわかりません。

<SendObjectを使った例>
Dim sTo As String, sTitle As String, sMsg As String
sTo = "メールアドレス"
sTitle = "件名"
sMsg = "本文 (メッセージ)"
DoCmd.SendObject acSendNoObject, , acFormatRTF, sTo, , , sTitle, sMsg, False

 しかし、Access2000の場合は、SendObjectにバグがあります。(↓参照)

  SendObjectメソッドのsubjectに2バイト文字を使用するとエラー
  http://support.microsoft.com/default.aspx?scid=kb;ja;414212&Product=accJPN
  SendObjectを使用すると複数回目でメール送信ができない
  http://support.microsoft.com/default.aspx?scid=kb;ja;417909&Product=accJPN


 ということで、これ以外は「BASP21」というフリーソフトを使う方法もありますが、
SMTPがそれぞれのPCで違う場合は対応できないし、既存のメーラーに送信履歴が残せなかったり
するので・・・

 BASP21 DLL
 http://www.hi-ho.ne.jp/babaq/basp21.html#0002


(参考)
  もし、Outlook用、Outlook Express用のコードが書けるなら、
 デフォルトのメーラーが何かはレジストリキーを調べればわかるので
 処理を分けるという方法もあります。

 標準で起動するメーラーのパスがある場所
 "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\mailto\shell\open\command"

タイトルRe^4: メーラーがバラバラな場合は・・・
記事No: 849
投稿日: 2004/06/30(Wed) 21:57
投稿者: KOU
hide様。
アドバイスをありがとうございました。

これから出張で出かけてしまうので返信が遅れてしまいますが、参考にさせて頂きます。
(後日ご報告します)

重ねて御礼申し上げます。

タイトルRe^5: メーラーがバラバラな場合は・・・
記事No: 886
投稿日: 2004/07/06(Tue) 11:35
投稿者: KOU
現在レジストリキーを参照し、OUTLOOK or OUTLOOKEXPRESSであるのかの見極めを
行い、メーラー毎の処理へ分岐する方法にしようと考えております。

参照するレジストリキーですが、以下の場所にメーラーの名前がズバリ記入されている事を発見致しました
ので、使用したいと考えております(名前ズバリなので使い易いかと考えております)
\\HKEY_LOCAL_SOFTWARE\Clients\Mail
(値の例:OutlookExpress)

しかしながら、上記レジストリキーを参照させ、メーラーの種類を特定する方法が不明な為、皆様のアドバイスを
御願い致します。

タイトルRe^6: レジストリキー取得の方法
記事No: 887
投稿日: 2004/07/06(Tue) 12:48
投稿者: hide
やり方としては、デフォルトのメールソフトのフルパスを取って、
その文字列から「Outlook Express」等を探すやり方の方が良いと思います。
(やり方は、人それぞれ自由ですが・・・)

以下、レジストリキー取得のサンプルコード

'宣言
Private Const ERROR_SUCCESS As Long = 0
Private Const REG_OPTION_NON_VOLATILE As Long = &H0
Private Const KEY_QUERY_VALUE As Long = &H1 ' サブキーデータの問い合わせを許可。
Private Const KEY_ENUMERATE_SUB_KEYS As Long = &H8 ' サブキーの列挙を許可。
Private Const KEY_NOTIFY As Long = &H10 ' 変更の通知を許可。
Private Const KEY_CREATE_SUB_KEY As Long = &H4 ' サブキーの作成を許可。
Private Const KEY_CREATE_LINK As Long = &H20 ' シンボリックリンクの作成を許可。
Private Const KEY_SET_VALUE As Long = &H2 ' サブキーデータの設定を許可。
Private Const KEY_ALL_ACCESS As Long = KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY Or _
  KEY_CREATE_SUB_KEY Or KEY_CREATE_LINK Or KEY_SET_VALUE

' 指定されたキーをオープンする。
Private Declare Function RegOpenKeyEx Lib "advapi32" Alias "RegOpenKeyExA" _
  (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, _
  ByVal samDesired As Long, phkResult As Long) As Long

' オープンされたキーに関連付けられている指定された値を取得する。
Private Declare Function RegQueryValueEx Lib "advapi32" Alias "RegQueryValueExA" _
  (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, _
  lpType As Long, lpData As Any, lpcbData As Long) As Long

' 指定されたキーのハンドルを閉じる。
Private Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long

Public Enum hKeyConstants
  HKEY_CLASSES_ROOT = &H80000000
  HKEY_CURRENT_USER = &H80000001
  HKEY_LOCAL_MACHINE = &H80000002
  HKEY_USERS = &H80000003
  HKEY_PERFORMANCE_DATA = &H80000004
  HKEY_CURRENT_CONFIG = &H80000005
  HKEY_DYN_DATA = &H80000006
End Enum

' DWORD型のタイプ
Public Enum RegTypeConstants
  REG_SZ = (1) ' NULL で終わる文字列
  REG_DWORD = (4) ' 32 ビット値
  REG_DWORD_LITTLE_ENDIAN = (4) ' リトルエンディアン形式の 32 ビット値
End Enum

' レジストリの指定されたキーの値を読み取る。
Public Function RegGetValue(lnghInKey As hKeyConstants, ByVal strSubKey As String, _
  ByVal strValName As String, lngType As RegTypeConstants, _
  ByVal varDefault As Variant) As Variant
' lnghInKey : キー
' strSubKey : サブキー
' strValName : 値
' lngType : データタイプ
' varDefault : デフォルトの値
' 戻り値 : 対応する値
  Dim varRetVal As Variant, lnghSubKey As Long, lngBuffer As Long, strBuffer As String, _
    lngResult As Long

  varRetVal = varDefault
  ' レジストリの指定したキーをオープンする。
  lngResult = RegOpenKeyEx(lnghInKey, strSubKey, 0, KEY_ALL_ACCESS, lnghSubKey)
  If lngResult = ERROR_SUCCESS Then
    Select Case lngType
      Case REG_DWORD, REG_DWORD_LITTLE_ENDIAN
        lngBuffer = 0
        lngResult = RegQueryValueEx(lnghSubKey, strValName, 0, REG_DWORD, lngBuffer, _
               Len(lngBuffer))
        If lngResult = ERROR_SUCCESS Then
          varRetVal = lngBuffer
        End If
      Case REG_SZ
        strBuffer = String(256, vbNullChar)
        lngResult = RegQueryValueEx(lnghSubKey, strValName, 0, REG_SZ, ByVal strBuffer, _
               Len(strBuffer))
        If lngResult = ERROR_SUCCESS Then
          varRetVal = Left$(strBuffer, InStr(strBuffer, vbNullChar) - 1)
        End If
   End Select
    lngResult = RegCloseKey(lnghSubKey)
  End If
  RegGetValue = varRetVal
End Function

'デフォルトのメールソフトのフルパスを取得
Sub test()
  Debug.Print RegGetValue(HKEY_LOCAL_MACHINE, "SOFTWARE\Classes\mailto\shell\open\command", "", REG_SZ, "")
End Sub

タイトルRe^7: レジストリキー取得の方法
記事No: 894
投稿日: 2004/07/06(Tue) 16:57
投稿者: KOU
hide様。
コードの御提示、誠にありがとうございました。

レジストリ内容の取得方法が私の予想と異なっていた為、この後のメーラーによる分岐(OUTLOOK or Express)
処理をどのように構築すればよいかが分かりませんでした。

大変恐縮でありますが、御教授頂けないでしょうか?
(度重なる質問となってしまい申し訳ございません)

ちなみに私の考えていた案としては、取得したレジストリの結果をIF文で分岐させ、hide様から御教授
頂いた以下のコードをOUTLOOK用とExpress用の2つのどちらかに処理を進ませる。
という物でした。

Dim myOL As Object, myMail As Object
Set myOL = CreateObject("Outlook.Application")←ここをExpress用の記述に変更。
Set myMail = myOL.CreateItem(0)
With myMail
  .To = "メールアドレス"
  .Subject = "例:メールタイトル"
  .Attachments.Add("サーバに保存してあるEXCELのフルパス")
  .Body = "本文 (メッセージ)"
  .send
End With
Set myMail = Nothing
Set myOL = Nothing

タイトルRe^8: Outlook ExpressはOLEオートメーションで制御できません
記事No: 895
投稿日: 2004/07/06(Tue) 17:15
投稿者: hide
> レジストリ内容の取得方法が私の予想と異なっていた為、この後のメーラーによる分岐
> (OUTLOOK or Express)処理をどのように構築すればよいかが分かりませんでした。

 この部分は、メーラーのフルパスをレジストリから取得できれば、後はIF文で処理を
分ければ良いのですが、問題はOutlook Expressの場合のコードをどうするかがポイント
なんです。
 添付ファイルが無ければ、SendObject(バグがあるけど)を使えば簡単なんですが、
添付があるので・・・

> Set myOL = CreateObject("Outlook.Application")←ここをExpress用の記述に変更。

 タイトルの通りで、CreateObjectを使う場合は、「"Outlook.Application"」の箇所
をOutlook Express用にするといったことは出来ません。このやり方をOLEオートメーション
って言うのですが、Outlook Expressはサポートされていないんです。


このAccessフォーラム過去ログ集は、Microsoft Access Club が運営しています


 

ページの先頭へ 前ページへ戻る