dポイントプレゼントキャンペーン実施中!

忍者へFTP接続でVBAでファイルをアップロードしたいです。

http://officetanaka.net/excel/vba/tips/tips47.htm
を参考に実践してるのですがうまくできません。
FFFTPを使っての手動でのアップロードは問題なく行えます。

-----------------------------------------------------------------
Sub Sample1()
Dim FTP, rc As Long, Server As String, User As String, Pass As String
Dim Target As String, Folder As String
Set FTP = CreateObject("basp21.FTP") ''FTPオブジェクト
Server = "ftp.xxxxx.com" ''ホストアドレス
User = "toru_tanaka" ''ユーザー名
Pass = "password" ''パスワード
Target = Application.GetOpenFilename() ''送信ファイル
If Target = "False" Then Exit Sub
Folder = "/" ''送信フォルダ
rc = FTP.Connect(Server, User, Pass)
If rc <> 0 Then
MsgBox "FTP接続できませんでした。", vbCritical
FTP.Close
Exit Sub
End If
rc = FTP.PutFile(Target, Folder)
If rc <> 1 Then
MsgBox Dir(Target) & "を送信できませんでした。", vbCritical
FTP.Close
Exit Sub
End If
MsgBox Dir(Target) & "を送信しました。", vbInformation
FTP.Close
End Sub
-----------------------------------------------------------------

rc = FTP.Connect(Server, User, Pass)
If rc <> 0 Then
MsgBox "FTP接続できませんでした。", vbCritical
FTP.Close
Exit Sub
End If

これは通過できるのですが、

rc = FTP.PutFile(Target, Folder)
If rc <> 1 Then
MsgBox Dir(Target) & "を送信できませんでした。", vbCritical
FTP.Close
Exit Sub
End If

で0が返るようで、送信できませんでした。となります。

トップページの階層にアップしたい場合は
Folder = "/"
でいいんですよね?

Folder = "/" にしても
Folder = ""にしても失敗します。

FFFTPのメッセージランを見ていると、
VBAで送信できなくても

-----------------------------------------------------------------
>TYPE A
200 転送タイプを A にセットしました
>PASV
227 Entering Passive Mode (***).
ダウンロードのためにホスト *** (***) に接続しています. (TCP/IPv4)
接続しました. (TCP/IPv4)
>MLSD
150 ASCIIモードのデータ接続をオープンします MLSD
226 転送が完了しました
ファイル一覧の取得は正常終了しました. (821 Bytes)
-----------------------------------------------------------------

が表示されます。

何が間違ってるのでしょうか?
ご教授よろしくお願いします。

A 回答 (2件)

トップページの階層=/ ルートとは限りません。



指定したパスはルート指定です。もちろん、これは、UNIX系、Linux系のOSである場合ですが、まあ、FTP、HTTPサーバーであれば、解釈できるような事もおおいが。

FTP、HTTPなどは、公開用フォルダーを指定されています。その場合、そこがHOMEとなり、/ or c:\ ではないですね。FTPなどリモート操作は、ログインしてコネクションした場合、ログインしたユーザーのHOME又は、そのサービスが公開されているパスに導かれます。それで絶対してしまうと、アクセス不能な場所を指定しまうこともあります。

これはクライアントツールにもよるし、サーバー側のサービスにもよります。

例えば、ログインして呼び出された所を指定するならカレントを意味するドット

" . " -> ログインした時のフォルダーを指定したければ
” ./../”     → HOMEの一つ上の階層が指定された事に。 ” ../ ”と同じ


を指定すれば、ほぼ動作は期待とおりになります。相対パス指定を試してみてください。””でフォルダー指定なしでも通じると思います。仕様が明確でないので、何ともいえませんが、””はリモートフォルダーを指定しなかった。という事だと思いますよ。第2引数が必須だと思われるので、””でHOME指定ということでしょう。

ただ、No1さんが指摘したように / or c:\ 直下や FTPサーバーのログインした時のHOME(ルート)は書き込み不可であることが多い。そこを確認してからですね。

なお、
>トップページの階層にアップしたい場合は

で意味は通じますが、このような操作の場合、HOMEの方が一般的かと。

この辺に例が
http://www.b21soft.co.jp/basp21/basp21pftp.html# …

rc = bftp.PutFile("c:\html\images\*","html/images",1) ' バイナリファイルの送信
ここでは"html/images"と絶対パス指定になっていません。これを"/html/images" とすると同じようになるでしょうね。
    • good
    • 0
この回答へのお礼

難しい言葉が出てきたので
まずそこから確認していきたいと思います。

URLの方もよく見てみます。
ありがとうございます。

お礼日時:2013/10/13 08:55

検証ができないので、はっきりとは言えないけど



>トップページの階層にアップしたい場合は
>Folder = "/"
>でいいんですよね?

取り敢えずこれは違うと思う
質問文中に掲載されたサイトによると
---
PutFileメソッドの構文は
rc = ftp.PutFile(Local,Remote[,Type])

引数Remoteを空欄にするとルートフォルダに保存されます。たとえば、ftp.xxxxx.com/test/subの場合は「test/sub」のように指定します。
---
ルートフォルダに保存する場合は
Folder = ""
ですが、ルートフォルダ(ftp.xxxxx.com)への書き込みは許可されているのでしょうか?

一般的なHPスペースの場合、ルートフォルダー内の public_htmlフォルダとかdataフォルダへのアクセスになるとおもうのですが
Folder = "public_html"
Folder = "data"
のような形式だとうまくいきませんか?

後はアップロードするファイル名が日本語表記の場合なども失敗します 
    • good
    • 0
この回答へのお礼

Folder = "public_html"
Folder = "data"

もダメでした。

ルートフォルダ(ftp.xxxxx.com)への書き込みが許可されてるかどうかわからないので
まずそこから確認してみます。

ありがとうございます。

お礼日時:2013/10/12 13:51

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