アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在、Excel VBAでcsvデータを作り出し、それをFTPソフトでFTPサーバにアップロードする作業をしています。
このアップロード作業もExcelでやることで自動化しようと考え、Windows標準のFTPを使ってアップロードするようにしてみましたが、ファイルはアップロードされるものの、サーバ上では0バイトになります。
(コマンドプロンプト表示でput後、successfulが出たまま止まってしまいます。asciiモードでも同じ。)

Dim strPNAME As String
Dim nFNO As Integer

strPNAME = ThisWorkbook.Path & "\ftptest.txt" 'ファイル名作成
nFNO = FreeFile '空いてるファイル番号を取る

Open strPNAME For Output As #nFNO 'ファイルを新規作成

'データ書き込み
Print #nFNO, "open ftp.**********" 'openホスト名
Print #nFNO, "user *** ++++" 'userコマンド ユーザー名 パスワード
'Print #nFNO, "quote PASV"
Print #nFNO, "binary"
Print #nFNO, "put " & ThisWorkbook.Path & "\data_spy.csv"
'Print #nFNO, "put quantity.csv"
Print #nFNO, "bye"

Close #nFNO
Shell "ftp -n -s:" & strPNAME


次に、BASP21を使ってみましたが同じ結果になりました。

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.************" ''ホストアドレス
User = "**********" ''ユーザー名
Pass = "+++++++" ''パスワード
Target = "data_spy.csv" ''送信ファイル
'Target = Application.GetOpenFilename() ''送信ファイル
'If Target = "False" Then Exit Sub
'Folder = "test/sub" ''送信フォルダ
rc = FTP.Connect(Server, User, Pass)
If rc <> 0 Then
MsgBox "FTP接続できませんでした。", vbCritical
FTP.Close
Exit Sub
End If
rc = FTP.PutFile(Target, "")
If rc <> 1 Then
MsgBox Dir(Target) & "を送信できませんでした。", vbCritical
Text = FTP.GetReply()
MsgBox Text
FTP.Close
Exit Sub
End If
MsgBox Dir(Target) & "を送信しました。", vbInformation
FTP.Close

そこで、単純なFTPバッチファイルを作ってそれを実行させてみましたが結果は同じです。

url接続(でいいのでしょうか ftp://***:+++@>>>>>)では、フォルダが開いたのでそこにファイルをいれてみたところ、正常にアップロードできていました。

FTPソフト、url接続 → 成功
VBA、バッチファイル → 失敗、0バイト

接続先はyahooショッピングのftpサーバ、当方の環境はWindows7pro+Excel2013です。
セキュリティソフトの終了、ファイアウォールのファイル転送許可などもチェックしました。

原因がわかる方おられませんでしょうか。
よろしくお願い致します。

A 回答 (4件)

ANo.1です。

パッシブモードの問題かもしれません。
Windowsのftp.exeはパッシブモードに対応していません。quote PASVを行っても意味はないようです。
クライアントがルータ環境内からインターネットに接続している場合だと基本パッシブモードでないとftpでファイル転送セッションが開けないのでファイル転送できません。
コマンドライン実行にはftp.exe以外のftpクライアントが必要です。
IEのftp機能(url指定の場合はおそらくこちらが使われる)はパッシブモードに対応しているので使えるようです。

なお、basp21.FTPの方はネットで調べたところCommandの中にpasvのいうpassiveモードに切り換えるコマンドがあるので、これを使えば上手くいくかもしれません。
# http://www.hi-ho.ne.jp/babaq/basp21f.html
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
basp21.FTPにpasvモードへの変更を追加したところ、正常にput出来ました!
大変感謝しております。

rinkun様、tatsu99様、ご回答頂きありがとうございました。

お礼日時:2018/09/03 10:01

No2です。



>コマンドプロンプト表示でput後、successfulが出たまま止まってしまいます。asciiモードでも同じ。
ということは、コマンドプロンプトでも確かめられたということですね。No2は無視してください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
念のため、No2でご指摘頂いた点を再確認しました。
1~3)は特に問題なく、4)の結果もsuccessfulで止まってしまいました。
ファイルも同様に空ファイルです。

他にお気づきの点がありましたら、ご教示頂ければ幸いです。

お礼日時:2018/09/02 13:20

こちらで、同じようにexcelから呼び出す方法を実行してみました。


正しく、転送されています。
コマンドプロンプトでいかのことを確認されてはいかがでしょうか。
1)当該excelファイルのディレクトリに移動(ftptest.txtのあるディレクトリ)
2)type ftptest.txtでftptest.txtの内容を確認
3)type data_spy.csvでdata_spy.csvの内容を確認(内容があること。サイズが0でないこと)
4)ftp -n -s:c:\xxx\yyyy\ftptest.txt でftpを実行(c:\xxx\yyyは移動したこのディレクトリとします)

1)2)3)は直ちに確認できます。それがあっていれば、4)のときにエラーメッセージが表示されるはずです。
それが手掛かりになるかと。(例えばセキュリティでポートがブロックされているなどの場合)
    • good
    • 0

気になる点。


・putはパス指定ではなくファイル名のみの指定では?
・ローカルのファイルはちゃんとできてる?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

>・putはパス指定ではなくファイル名のみの指定では?

ファイル名のみで試したところ、動きませんでした。

>・ローカルのファイルはちゃんとできてる?

はい、問題ありません。

他にお気づきの点がありましたら、ご教示頂ければ幸いです。

お礼日時:2018/09/02 13:09

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A