人に聞けない痔の悩み、これでスッキリ >>

現在、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サーバーに転送したファイルが0kbになってしまうのは、なぜ??

レンタルサーバー上に、ホームページを持っています。
そのホームページを更新しようと、新しいファイルを転送したところ、転送途中でエラーが起きました。
エラーが起きながらも更新ファイルは送られていたのですが、なぜか0kbになっていて、IEで見ると当然ですが真っ白です。
FTPソフトを変えて転送してみましたが、同じ症状が起きます。
最初は、ドリームウィーバーで作ったファイルを、ドリームウィーバーの転送機能を使用して転送しました。
次は、転送だけホームページビルダーの転送機能を使用しました。
今までこの方法でエラーが起きたことはなかったのですが、、、実は1ヶ月前にPCが故障して、今回は修理から戻ってきて初めての転送でした。
PCの設定に何か問題があるのでしょうか?
どなたか、お助けくださいませ!

Aベストアンサー

結構なりますよ。
単に、通信途中でエラーが生じたってやつです。
一旦サーバ上からその0kbのファイルを削除して再送してください。
ちゃんと送れるはずです。

QFTPのPUT、GETについて

FTPのPUT、GETについてお教え下さい。現在サーバーの設定は完了し、DOS画面よりFTPでPUTを行っているのですが、送信先となるサーバーにファイルサイズがゼロのファイルが作成され、途中で止まった状態になってしまいます。GETも同様でサーバーからクライアントにファイルを取得はしているのですが、ファイルサイズがゼロのファイルが作成され止まった状態になってしまいます。また、他のサーバーでPUT、GETを行うとPUT、GET共にファイルの取得も送信も出来ます(クライアントは同じPCを使っています)。やはりサーバーの設定が足りないのでしょうか?
どなたか対策方法をご存知の方がいましたらお教え下さい。よろしくお願い致します。

Aベストアンサー

http://sakaguch.com/FTPcmd.html

↑の手順のように、PASVモードで転送するとどうなりますか?

Qsleep関数の原理について

sleep関数がPC内でどういった原理で一定時間おきに動作などを行っているのか教えてください。
「Linuxカーネルがどういう働きしている」「ハードがどういう動作している」とかです。

Aベストアンサー

>一定時間おきに動作などを行っているのか
確実にsleep関数で指定した時間はお休みしているだけであり、
厳密には「一定時間おき」に動作はしません。

・LinuxはマルチタスクOSである
・一定時間(確か100Hzだったと思います)ごとにタスク切り換えを行っている

この2点がわかっていれば、
>「Linuxカーネルがどういう働きしている」
は簡単ですよね。

「sleep関数で指定した時間は、タスク切り換えで自分にCPU時間を割り当てることはしない」というだけです。

>「ハードがどういう動作している」
特段ハードでは、sleep関数実現のために何もしていません。

<おまけ>
sleep関数を呼ばなくてもマルチタスクOS上のタスクは、
 ユーザの知らないタイミングで休み休み動いている
ということです。

Qこのプログラムを教えてください。

このプログラムを教えてください。

Aベストアンサー

以下のPGで実現出来ます。
難解なところは特にありません。
初めて見る関数などの無いよう、敢えて四則演算を用いて解を導いています。
これを見て、数式の解を表現する1つの方法をぜひ身に付けて下さい。

/* 課題1 */
/* maru.c */

#include<stdio.h>
#include<string.h>
#define PI 3.14

int main() {

float d; /* 入力の直径 */
float e; /* 円周 */
float m; /* 面積 */
float s; /* 表面積 */
float v; /* 体積 */

printf("直径を入力してください[cm]: ");
scanf("%f", &d);

d = d / 2; /* 入力直径を半径に変換 */
d = d / 100; /* 入力値の単位変換 [cm]→[m] */

printf("(1)円の円周 [m] =%f\n", 2 * PI * d );
printf("(2)円の面積 [m2]=%f\n", PI * d * d );
printf("(3)球の表面積[m2]=%f\n", 4 * PI * d * d );
printf("(4)球の体積 [m3]=%f\n", (4.0 / 3.0) * PI * d * d * d);

return 0;
}

以下のPGで実現出来ます。
難解なところは特にありません。
初めて見る関数などの無いよう、敢えて四則演算を用いて解を導いています。
これを見て、数式の解を表現する1つの方法をぜひ身に付けて下さい。

/* 課題1 */
/* maru.c */

#include<stdio.h>
#include<string.h>
#define PI 3.14

int main() {

float d; /* 入力の直径 */
float e; /* 円周 */
float m; /* 面積 */
float s; /* 表面積 */
float v; /* 体積 */

printf("直径を入力してください[cm]: ");
scanf("%f", &d);

d = d / 2; /* ...続きを読む

Qc言語 立方根

プログラムは全くの初心者です。
数学をしていて級数の計算(収束が遅いので)をするために必要最低限だけ覚えようとしました。

c言語で立方根の計算をしたくてnの立方根を出すときに
n=;\\任意の数
t=pow(n,1/3);
printf("%f",t);
でしました。が、試しにn=2でした時1.000…と小数点以下が切り下げ?四捨五入?されています。そのままの値を返す方法が知りたいです。
簡単な質問ですが、すいません。
回答お願いしますm(._.)m

Aベストアンサー

1 / 3 は0ですよ。C言語の基本の基本です(^-^;

プログラム初心者ではしょうがないかもしれませんが
数学の数式とCの数式は別物。
最初は、演算に対して、演算の入力、演算結果の「型」を強く意識して
「式」を覚えるのが肝要です。

Q卒論の実験に必要なものは自分で買うものですか?

現在、PC内部のCPU温度をC言語のプログラムで出力し
測定する実験を行おうとしています。

精度を重要視しているのですがソフトで頑張っても精度は低く、
精度求めるならarduinoなどのマイコンに温度センサをつなげて
値を拾ってくる必要があると言われました。

こういった卒論の過程で必要なものは自費で購入し
実験を行うものでしょうか?
それとも研究室とかが出してくれるものでしょうか?

皆さんの意見をお聞きしたいです。

Aベストアンサー

その件で回答した張本人です。普通そんなものは全部自腹でしょう。もし卒論に関係するものを研究室なりが出すってことになったら、じゃあ参考文献も買ってくれるんですねってことになっちゃう。そんなのありえると思いますか?

ちなみにarduinoって安いですよ。マイコンのボードと電源やら温度センサーやら一式買っても¥5千くらいで揃うと思います。それにこうしたものを接続して動かすのは、PCの上でソフト書いて動かしておしまいってよりも、もっとずっと良い勉強になります。

http://akizukidenshi.com/catalog/c/carduino1/

QFTPエラー425

FTPで425エラーが出て困っています。
今まで繋がっていたのが突然繋がらなくなりました。
調べてみると20番ポートが遮断されている可能性が高く、
どこで遮断されているか調べる良い方法があれば教えて下さい。

・クライアント
OS:Windows 8.1、ファイアウォール: Norton Inernet Security
・サーバー(AWS)
OS:Red Hat Enterprise Linux Server release 7.1 (Maipo)
ファイアウォール:AWSのネットワークルール設定

接続は出来ていて、lsを打つとエラーになります。
サーバーにTertermでログインしてlocalhostにftpするとlsできるので、
ftpd自体に問題はなさそうです。
また、サーバー側の設定は直しておらず、突如動かなくなったので、
クライアントのファイアウォール設定が変わったのを疑っていますが、
ファイアウォールを一時停止しても解消しませんでした。
どこが悪いか原因を切り分けられるずに困っています。
原因箇所を調べる良い方法があればご教示ください。

FTPで425エラーが出て困っています。
今まで繋がっていたのが突然繋がらなくなりました。
調べてみると20番ポートが遮断されている可能性が高く、
どこで遮断されているか調べる良い方法があれば教えて下さい。

・クライアント
OS:Windows 8.1、ファイアウォール: Norton Inernet Security
・サーバー(AWS)
OS:Red Hat Enterprise Linux Server release 7.1 (Maipo)
ファイアウォール:AWSのネットワークルール設定

接続は出来ていて、lsを打つとエラーになります。
サーバーにTerterm...続きを読む

Aベストアンサー

>FFFTPで繋いでいて拡張オプションのPASVモードにチェックをつけていないのでpassiveモードではないはずですが、

クライアントソフトはActive FTPで接続しようとしているのは間違いないですね。

>WireSharkで見たところ、後ろにPASVと書かれていました。
>Wireshark結果
>3967 345.551600000 52.27.XX.XXX 192.168.0.4 FTP 105 Response: 200 PORT command> successful. Consider using PASV. ← パッシブモードになっている?

良く読んで下さい。単に「Passiveモードでの使用を検討して下さい」というメッセージです。

クライアントソフトはActive FTPで接続しようとしているものの、サーバ側がActive FTPを恐らくサポートしていないので、「Passiveモードに移行してよ」とメッセージを出した。にも関わらずクライアントはPASVコマンドを実行することもなく、LISTコマンドを実行したので「425 Failed to establish connection」、つまり「だぁかぁらぁ、データセション張ってないんだから」と返したわけです。

「Passiveモードでの使用を検討して下さい」というメッセージは柔らかな表現ですが「いいか、俺はPassiveモードしか受け付けないからな。次はPASVコマンドを打てよな。それ以外は知らんからな」と等価です。まぁ、QUITやBINARYやASCII等は受け付けてくれるとは思いますが。

>またサーバーが20番ポートにセッションを張ろうとしている形跡がありませんでした。
>これはPASVモードになっているのでしょうか?

サーバは少なくともPassiveモードしかサポートしていないようです。なので、サーバからクライアントの20/TCPにはコネクションを張らずに、21/TCPでクライアントからのPASVコマンド待ちです。PASVコマンドがクライアントから来れば、21/TCPでEntering Passive Mode (X,X,X,X,A,B)を返しますので、クライアントはサーバの(A*256+B)/TCPポートに対してSYNを送信、所謂3ウェイハンドシェイクでデータセションが繋がるという流れになります。

>FFFTPで繋いでいて拡張オプションのPASVモードにチェックをつけていないのでpassiveモードではないはずですが、

クライアントソフトはActive FTPで接続しようとしているのは間違いないですね。

>WireSharkで見たところ、後ろにPASVと書かれていました。
>Wireshark結果
>3967 345.551600000 52.27.XX.XXX 192.168.0.4 FTP 105 Response: 200 PORT command> successful. Consider using PASV. ← パッシブモードになっている?

良く読んで下さい。単に「Passiveモードでの使用を検討して下さい」というメッ...続きを読む

QPHP~のメールの送信でエラーになり送信できません!?

どうもすみません!
以下のサイトからの質問となります。
http://afurieitohannei.la.coocan.jp/mail.htm
よろしくお願いいたします。

Aベストアンサー

> From:"ヘッダーがありません

このメッセージのとおりです。
何でも良いので受信したメールのヘッダーを表示させてみて下さい。
 From: xxxxxx
の様にメールの送信者の情報があるはずです、その情報がないので不備だとしてエラーになっているのです。


mb_send_mail - PHPマニュアル
http://php.net/manual/ja/function.mb-send-mail.php
-----引用開始
bool mb_send_mail ( string $to , string $subject , string $message [, mixed $additional_headers = NULL [, string $additional_parameter = NULL ]] )

中略

additional_headers(オプション)
メールヘッダの最後に挿入される String または array
通常、これは追加のヘッダ(From、Cc、Bcc)のために用いられます。

注意:
メールを送信する際には、必ず From ヘッダが含まれていなければなりません。 additional_headers パラメータで指定するか、 あるいは php.ini にデフォルト値を指定します。
----引用終了

上記の様にphp.iniで設定おくか、$additional_headers でmb_send_mail の引数として与える必要があります。


# 前も指摘したと思うのですが、何故ドキュメントを参照しないのですか?

> From:"ヘッダーがありません

このメッセージのとおりです。
何でも良いので受信したメールのヘッダーを表示させてみて下さい。
 From: xxxxxx
の様にメールの送信者の情報があるはずです、その情報がないので不備だとしてエラーになっているのです。


mb_send_mail - PHPマニュアル
http://php.net/manual/ja/function.mb-send-mail.php
-----引用開始
bool mb_send_mail ( string $to , string $subject , string $message [, mixed $additional_headers = NULL [, string $additional_parameter = NULL ]]...続きを読む

Q再帰処理をループ処理に変換

趣味プログラマです。

このカテゴリ一個前の質問
https://oshiete.goo.ne.jp/qa/10782948.html
のご回答の中で
> 関数の再帰呼び出しは必ずループで置き換えられる
というものがありました。
このこと自体は、以前にも目にしたことがあるのですが、変換例はいずれも単純な再帰関数のものでした。

そこで質問なのですが2分木を辿るような再帰プログラムの場合は、どの様なループ処理に変換されるのか、教えてください。
具体的なソースをご提示いただければ嬉しいです(C言語でなくても有名どころの言語ならOKです)

また、その処理はメモリ使用の観点において、再帰よりも効率が良くなりますか?
個人的には、プログラム中にスタックの様なものを用意しなければならないので、あまり効率よくならない様な気がします。

ご回答よろしくお願い致します。

※以下は2分木の合計を再帰で求める例です。
----
#include <stdio.h>
#include <stdlib.h>

typedef struct Node_t Node;

struct Node_t {
int value;
Node* left;
Node* right;
};

Node* NewNode(int val){
Node* p = malloc(sizeof(Node));
p->value = val;
p->left = NULL;
p->right = NULL;
return p;
}

int Sum(Node* p){
int lsum = 0;
int rsum = 0;

if(p->left != NULL) lsum = Sum(p->left);
if(p->right != NULL) rsum = Sum(p->right);
return lsum + rsum + p->value;
}

int main() {
int sum = 0;
Node* header;
header = NewNode(10);
header->left = NewNode(20);
header->right = NewNode(30);
header->left->left = NewNode(40);
header->right->right = NewNode(50);

/*もっと深く2分木を作成 */

sum = Sum(header);
printf("%d\n", sum);

return EXIT_SUCCESS;
}
----

趣味プログラマです。

このカテゴリ一個前の質問
https://oshiete.goo.ne.jp/qa/10782948.html
のご回答の中で
> 関数の再帰呼び出しは必ずループで置き換えられる
というものがありました。
このこと自体は、以前にも目にしたことがあるのですが、変換例はいずれも単純な再帰関数のものでした。

そこで質問なのですが2分木を辿るような再帰プログラムの場合は、どの様なループ処理に変換されるのか、教えてください。
具体的なソースをご提示いただければ嬉しいです(C言語でなくても有名どころの言...続きを読む

Aベストアンサー

N分木の総舐めだとすると、こんな感じじゃないですか?
最初に言っておきますが、メモリ効率は平均的によろしくないです。
劣悪な(深い)木よりはましというレベルです。
平衡二分木のように随時木をメンテナンスしていれば別の方法の方が効率は良いと思います。
ただ、スタック領域のメモリ不足は少なくとも私の手元の環境ではエラー検出できませんが、
ヒープ領域のメモリ不足はエラー処理はできます。
DoS攻撃などで勝手に落ちられると困るので、
少なくとも蓄積データのフルダンプや全解放ごときで落ちる心配は取り去りたいという、
ささやかな、見る人によってはくだらないこだわりのような、しかし切実な問題です。

#define N 2
struct tree
{
struct tree *tr_parent; // 追加要素
struct tree *tr_next[N]; // データ構造の小修整
int tr_val;
int tr_ref; // 追加要素
};

int
sum_tree(struct tree *top)
{
struct tree *n, *prev;
int sum = 0;
int updown = 2;

for (n = top, n->tr_ref = 0, n->tr_parent = NULL, prev = n;
n != NULL;) {
if (updown == 0) {
// case down
n->tr_ref = 0;
n->tr_parent = prev;
}
if (n->tr_ref == N) {
sum += n->tr_val;
n = n->tr_parent;
updown = 1;
} else if (n->tr_next[n->tr_ref] == NULL) {
updown = 2;
n->tr_ref ++;
} else {
updown = 0;
prev = n;
n = n->tr_next[n->tr_ref];
prev->tr_ref ++;
}
}
return sum;
}

実際、再帰を使わないようにする変換方法の定式なんてないと思います。
しかし、再起でなければできない処理もなく、等価な別の処理方法はあると思います。

N分木の総舐めだとすると、こんな感じじゃないですか?
最初に言っておきますが、メモリ効率は平均的によろしくないです。
劣悪な(深い)木よりはましというレベルです。
平衡二分木のように随時木をメンテナンスしていれば別の方法の方が効率は良いと思います。
ただ、スタック領域のメモリ不足は少なくとも私の手元の環境ではエラー検出できませんが、
ヒープ領域のメモリ不足はエラー処理はできます。
DoS攻撃などで勝手に落ちられると困るので、
少なくとも蓄積データのフルダンプや全解放ごときで落ちる心配...続きを読む

QFTPの送信結果を検知したい

WindowsでFTPをバッチファイルから呼び出すことを考えています。FTPで送信エラーが発生した場合に、FTPのエラーとして検知したいのですが、その方法をご存じのかたおりましたら教えて下さい。(Windows-NTで標準で提供されるFTPを使用しています)直接私が確認したわけではありませんが、FTP送信でエラーが発生してもFTPの終了コードが0になってしまうらしく、FTPのエラーを検知できないそうです。WindowsであればWindows-NT以外の環境でもかまいませんので、ご存じのかたおりましたら教えて下さい。

Aベストアンサー

標準のツールでやるなら、ftpコマンドの出力をファイルにリダイレクトして、find か findstr コマンドで適当な文字列の有無で判断するしかないですね。

>FTPで転送後に転送先のホスト内のある処理が自動的に動き
とのことですが、転送先ホストで単純にデータファイルの有無で先に進むと、転送途中のファイルを読んだり、転送エラーで途中で終わったファイルを読んだりする可能性があるので、普通は、転送元でデータファイルの正常転送を確認後に目印ファイル(中身は空でよい)を送り、転送先では目印ファイルがあることでデータファイルが正しく受信できたことを判断して目印ファイルを消して先に進む(データファイルを処理する)のが良く使われる手法です。


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

人気Q&Aランキング