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 が運営しています

|