1つだけ過去を変えられるとしたら?

ネットなどで調べたコードをつなぎ合わせ、なんとか下記のようなコードを作成しました。
Sub TEST2()
ActiveSheet.Protect UserInterfaceOnly:=True
Dim fname As String
fname = Range("C3").Text

ActiveSheet.Select
ActiveSheet.Copy

Cells.Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False

Range("A1").Select
ActiveWorkbook.SaveAs _
Filename:="C:\Documents and Settings\***\My Documents\ファイル\" & fname & ".xls", FileFormat:=xlNormal
Dim MailSmtpServer As String
Dim MailFrom As String
Dim MailTo As String
Dim MailSubject As String
Dim MailBody As String
Dim MailAddFile As Variant
Dim strMSG As String
' 添付ファイルの選択
MailAddFile = "C:\Documents and Settings\***\My Documents\ファイル\" & fname & ".xls"
' 送信確認
If MsgBox("メールを送信します。" & vbCr & _
"SMTP,発信者,宛先等は正しいですか?", vbYesNo) <> vbYes Then Exit Sub
MailSmtpServer = "mail.***.co.jp" ' SMTPサーバ
MailFrom = "***@***.co.jp" ' 発信者
MailTo = "***@***.co.jp" ' 宛先
MailSubject = fname ' 件名
MailBody = "" ' 本文
' メール送信(CC,BCCはブランク)
strMSG = SendMailByCDO(MailSmtpServer, MailFrom, MailTo, "", "", _
MailSubject, MailBody, MailAddFile)
' 文字コードを任意に指定する場合は以下のようにします。
' strMSG = SendMailByCDO(MailSmtpServer, MailFrom, MailTo, "", "", _
MailSubject, MailBody, MailAddFile, cdoISO_2022_JP)
If strMSG <> "OK" Then MsgBox Mid(strMSG, 3)
End Sub

しかし、このようなエラーがでました。’宛先等は正しいですか?’のメッセージのあとです。
’2147024864プロセスはファイルにアクセスできません’。
ところで私がやりたいことは、(1)作成したエクセルの("C3").Textをファイル名にして、アクティブシートを(値のみ貼り付けして)保存し、(2)その作成されたファイルを添付してメールで送付する。ということです。
(2)のどこかで失敗しているものと思われますが、どこを直したらいいのかわかりません。
ここまで自分でできただけでも奇跡的なので、これ以上、どうしてよいか全くわからず。。
不足の情報があれば補足いたしますのでどうぞお願いいたします。

A 回答 (2件)

番号だけで検索するとこういうのが出てくる。


http://support.microsoft.com/kb/294424/ja
文書番号: 294424 - 最終更新日: 2003年5月12日 - リビジョン: 2.1
PRB: エラーがファイルから ADO レコードセットを開く

また、
「’2147024864プロセスはファイルにアクセスできません’。」
単純に考えると
アクセスできないことがおかしい、か、
アクセスできる状況なのに(生成した)ファイル名がおかしい、か。

そのファイルは普通のメールソフトで送受信できているか。

ほかのファイルならうまく稼働する仕組みか。

「(2)のどこかで失敗しているものと思われます」
少なくともどこ、どの行が原因かは追求、
それをどう直すべきかはまた別の話。

継ぎはぎでなく、
別途稼働するマクロを確保してから、必要な部分を今回用につくり直す。

正しい部分とあやしい部分が明確でないならそれをはっきりさせる。

そんなところからか・・・。
    • good
    • 0
この回答へのお礼

ありがとうございます。エラーメッセージをよく確認したところ、単にアタッチしたかったエクセルが開いたままになっていたから添付できなかったことがわかりました。ありがとうございます。

お礼日時:2011/01/24 14:11

了解しました~。

って、ナンにやね~ん。
いいですね、いいですね、今って「なんとなく」で
ここまでのコーディングが出来てしまうほど
情報が集まってしまうんですね。うーんうらやましい。

なんて、個人的ハイテンションはおいといて
問題を順に解きほぐしていきましょう。

まずは質問文でも推測されている通り、メールに添付するファイルの指定
あるいはアクセスに失敗しているようです。

なのでカギを握るのは

MailAddFile = "C:\Documents and Settings\***\My Documents\ファイル\" & fname & ".xls"' 送信確認

の部分です。
ここで確認すべき点はこんなに
1.パス名も含めてファイル名の設定は正しく行われているか。
  これは MsgBox でもで MailAddFile を表示させれば確認できます。

2.パス名、ファイル名は合っており、そこにそのファイルは存在しているか。
  これは大文字小文字程度のミスが無いかどうかです。
  テスト当初は全部小文字が無難。

3.パス名、ファイル名も合っており、ファイルも存在しているが、本当にアクセスできるものか。
  これがこっそり大問題。実はこの質問文にあるプログラムには、
  Windows が抱える小さな大問題が隠れていたりするのです。
  その大問題とは!…えーと…なんでしたっけ…あっ、ちゃんと答えますから。。。
  なんと、「ファイルのパス名中にスペースが有るとそこで途切れてしまう」
  とかいうものです。
  分かりにくいですが、つまりは SendMailByCDO では「C:\Documents 」までしか
  認識していない可能性があるのです。
  このテストは簡単。その対象ファイルを「C:\」に置く、つまり
    MailAddFile = "C:\" & fname & ".xls"' 送信確認
  にしてみればよいのです。
  それでエラーが取れるなど変化があればこれが原因、けってー、だんてー。
  これが原因ならば、後はパス名を適切に設定してあげればOK。
   MailAddFile = chr(??) & "C:\Documents and Settings\***\My Documents\ファイル\" & fname & ".xls" & chr(??)' 送信確認
  ダブルクォテーションを示すキャラ文字を前後に加えてあげればよいはずです。
  文字の指定の仕方やコード番号は覚えていないです。すみません。

この3つ目の問題はいわゆる専門家となるプログラマさんでも知らない人が多そうな内容で
開発環境(開発会社)では動くのに本番稼動(現地)では動かないといった
クレーム的難問にもなっているようです。

さて、これで本当に先に進めるのでしょうか?
ではまた遭遇する機会がありましたら、次のステップに挑みませぅ。

この回答への補足

まことにありがとうございます。3は、ファイルを作成し保存する時点で、直接Cドライブにファイルを保存し、そしてそれを添付するように命令したらよい、ということでしょうか?

ところで、エラーメッセージの続きがあったことにつづきました。(別のプロセスが使用中です)と出てくるのです。ここにヒントがあるかもしれないと思い、お伝えさせていただきました。私がひとつ気になっているのは、このエクセルはもともと作成したところから、active sheetだけを(そのときセルのC3に入っている文字をファイル名にして)保存しています。
それは下記のコードにあるとおりです。
MailAddFile = "C:\Documents and Settings\***\My Documents\ファイル\" & fname & ".xls"
それを添付して送りたいのですが、私は下記のとおりに書きました。
MailAddFile = "C:\Documents and Settings\***\My Documents\ファイル\" & fname & ".xls"

もしかすると、別プロセスが使用中、というのは、このエクセルを保存したとき、このエクセルは開いたままになっていますので、それを添付しようとしているところにうまくいかない原因があるのかもしれない、と今思い始めています。

もしアドバイス等あればどうぞお願いいたします。

補足日時:2011/01/17 13:05
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!