[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.149 VBAでFTP.EXEを使い、ファイルをアップロードしてみる

VBAでFTP.EXEを使い、ファイルをアップロードしてみる

メルマガ発行内容

<VBAでFTP.EXEを使い、ファイルをアップロードしてみる>

どうも、三流プログラマーのKen3です。 今回は、 コマンドプロンプトのFTPを使用して、 ファイルをアップロードしてみたいと思います。 関連項目、 VBAでFTP.EXEを使う http://www.ken3.org/cgi-bin/group/vba_ftp.asp もヨロシクね。

/* * 1.今回のキッカケ */

VBA系の掲示板 http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi に来た質問です。 ---- >エクセルVBAから、ファイルを自動でFTPしたいのですが、自分なりには >相当しらべてみたのですが、現時点での私の能力では・・・限界にきています。 >しかし、現在作りかけている子供用問題集において、自分の成績をWEBにアッ >プするために、どうしてもその機能がほしいのです。 >過去ログを読むことも、検索も、自分なりにがんばったのですが・・・どうかそ >の部分のプログラムを教えてください。 ---- と もらった質問にいつものように、質問に質問で返し(オイオイ) ※出来るだけ、質問に質問で返さないように心がけてるんだけど・・・ ---- こんな質問返しをしてみたり --- やりたいこと、仕様は ExcelのVBAで、 aaa.txt(ファイルは1つ?) を FTPで(FTP.EXE?それともフリーのDLL?)、 指定したディレクトリにUPする でいいのかなぁ? 私も詳しくないのですが、 WebにUPする、リアルタイム性が無いなら、 メールアドレスを1つ作って(成績回収用に専用で1つ) 回収するのが楽そうな気もするし、 FTPにこだわらないで、 WebにデータをPOSTして、回収するとか。 なんて代案もあるけど、 FTPで送信、少し、私も探ってみますね。 ---- ヤバイ・ヤバイ、、、掲示板のお偉い人達みたいに、 コッチのほうがいいよと質問者のやりたいことを否定して、 自分の好きな方法を強引に進めようとしてしまった・・・(少し反省) FTP.EXEの使用方法、まとめも兼ねて、作ってみますか。

/* * 2.処理の構想を考える */

Set objFTP = CreateObject("FTP.application") なんて感じの、スマートな方法、あればいいのですが、 チョット見つからなかったので、 パラメータファイルにFTPのコマンドを書き、 ftp.exe で実行、そんな感じの処理を作成してみたいと思います。 -- 参考バックナンバー -- No.25 コマンドラインのFTPを使ってみた http://www.ken3.org/backno/backno_vba06.html#25 'shellでFTPを起動 Shell "ftp -s:" & strPNAME と、Shellでftp.exeを起動して、-s のコマンドを実行させる、そんな構想でした。 No.26 FTP -n オプションとuserコマンド</A></h3> http://www.ken3.org/backno/backno_vba06.html#26 In message "-n と user 使えよバカ", s***@********.ne.jpさん wrote... >ここ見ろ-->http://www.zdnet.co.jp/help/tips/linux/l0462.html >-n と user 使えよバカ --- ftp -n とやると、ログインを聞いてこないので、 user ユーザ名 パスワード でログイン出来るんですね。

/* * 3.昔の復習を兼ねて、-n -sオプション */

http://www.ken3.org/backno/backno_vba06.html#26 で、作成したのが、下記のサンプルです。
Sub test()

    Dim strPNAME As String   'パラメーターファイル名
    Dim nFNO     As Integer  'ファイル番号

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

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

    'データ書き込み
    Print #nFNO, "open plaza14.mbn.or.jp" 'openホスト名
    Print #nFNO, "user ken3 XXXXXX←パス" 'userコマンド ユーザー名 パスワード
    Print #nFNO, "cd www"
    Print #nFNO, "pwd"
    Print #nFNO, "get index.html " & ThisWorkbook.Path & "\index.html"

    Close #nFNO  '開いたら閉じようね
    
    'shellでFTPを起動 -nのオプションを付ける
    Shell "ftp -n -s:" & strPNAME

End Sub
パラメータファイルの作成をまず行います。 open plaza14.mbn.or.jp で、FTPサーバーに接続しますOPEN要求 user ken3 XXXXXX で userコマンドを使用してログイン(ユーザー名 パスワード) cd www で 目的のディレクトリに移動する pwd ←これは、関係ないですね(現在ディレクトリ表示) get index.html " & ThisWorkbook.Path & "\index.html" ↑getコマンドで、Index.htmlをexcelブックと同じ位置にget(ダウンロード) なんて感じのパラメータファイルを作成して、 Shell "ftp -n -s:" & strPNAME と、ftp.exe-n と -s:パラメータファイル名 で起動してます。

/* * 4.必要なのは?なんだろう? */

固定で、index.htmlのやりとり、Ftpサーバー名やパスワードも固定でした。 これを汎用的に関数化したい時、どうしましょう? そんな時は、必要なデータを洗い出します。 えっと、必要なのは、 どのサーバーってことで、サーバーの名前 ログインしたいので、ユーザー名とパスワード どこへ?ってことで、ディレクトリ どのファイルを?なので、書き込みファイル名(UPLOAD File) ftp_upfile(ホスト名,ユーザー名、パスワード,ディレクトリ,書き込みファイル) と関数化してみたいと思います。 'ホスト名,ユーザー名、パスワード,ディレクトリ,書き込みファイル 'を受け取り、ftp.exeを起動して、ファイルをUPLOADする
Sub ftp_upfile(strHNAME As String, _
               strUSERNAME As String, _
               strPASS As String, _
               strDIR As String, _
               strUPFILE As String)

End Sub
中身を書かないとなぁ。

/* * 5.パラメータファイルを作成して、Ftp.exeを起動する */

パラメータ(コマンド)ファイルを作成する ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ パラメータファイル名をブック位置+ftppara.datで、作成しました。 strPNAME = ThisWorkbook.Path & "\ftppara.dat" 'ファイル名作成 nFNO = FreeFile '空いてるファイル番号を取る Open strPNAME For Output As #nFNO 'ファイルを新規作成 あとは、受け取った、パラメータをそのまま、ファイルにしてます。 'コマンドデータを書き込む Pint #nFNO, "open " & strHNAME 'open ホスト名 Print #nFNO, "user " & strUSERNAME & " " & strPASS 'user ユーザー名 パスワード Print #nFNO, "cd " & strDIR 'cd xxxx 書き込みディレクトリへ移動 Print #nFNO, "put " & strUPFILE 'put ファイル名 で、ファイルをアップする Print #nFNO, "quit" 'bay で コマンド終了 最終的に、下記のようなファイルが作成されます (ftppara.datの中身) --- open plaza14.mbn.or.jp user ken3 passwordXXX cd www/mm/ put E:\TEST\data999.txt quit ---ここまで。 あとは、ftp.exeを呼べばOKです。 Shell "ftp -n -s:" & strPNAME で、単純に呼んでます。 ※実は、単純に呼びすぎなので、  My Document など、スペースの空いたフォルダーで実行すると、 ftp -n -s:" & strPNAME  が ftp -n -s:c:\My Documents\ftppara.dat となってしまい、正しくファイルが認識されなかったり。  同様に、 put E:\TEST\data999.txt のFTPのPUTコマンドもスペースでデータを区切るので、  put c:\My Documents\data001.txt となると、c:\MyとDocuments\data001.txtの2つと誤認してしまいます。  (たしか、””で囲むとOKだったような記憶があるけど) 下記が、作成したモジュールとテストモジュールです。
Sub TEST()

    Dim strFILENAME As String  'ファイル名受け取り用

    'ファイル名を選択する
    strFILENAME = Application.GetOpenFilename

    'プログラムの中にパスワード埋め込むのよくないけど
    '作った関数をコールする
    Call ftp_upfile("ftp.xxxx.jp", "username", "pass", "data/pc/", strFILENAME)

End Sub
上記のように、パラメータを渡して、下記の作成したモジュールを呼んでいます。 'ホスト名,ユーザー名、パスワード,ディレクトリ,書き込みファイル 'を受け取り、ftp.exeを起動して、ファイルをUPLOADする
Sub ftp_upfile(strHNAME As String, _
               strUSERNAME As String, _
               strPASS As String, _
               strDIR As String, _
               strUPFILE As String)

    Dim strPNAME As String   'パラメーターファイル名
    Dim nFNO     As Integer  'ファイル番号

    'パラメータファイル名をブック位置\ftppara.datとする
    strPNAME = ThisWorkbook.Path & "\ftppara.dat" 'ファイル名作成
    
    'ファイルを新規作成する
    nFNO = FreeFile  '空いてるファイル番号を取る
    Open strPNAME For Output As #nFNO 'ファイルを新規作成

    'コマンドデータを書き込む
    Print #nFNO, "open " & strHNAME  'open ホスト名
    Print #nFNO, "user " & strUSERNAME & " " & strPASS 'user ユーザー名 パスワード
    Print #nFNO, "cd " & strDIR      'cd xxxx 書き込みディレクトリへ移動
    Print #nFNO, "put " & strUPFILE  'put ファイル名 で、ファイルをアップする
    Print #nFNO, "quit"              'bay で コマンド終了

    'ファイルを閉じる(作成が終了したので)
    Close #nFNO  '開いたら閉じようね
    
    'shellでFTPを起動 -n,-s:ファイル名 のオプションを付ける
    Shell "ftp -n -s:" & strPNAME

End Sub
-【けんぞう!】--------------------------------------------------------- ASPが利用可能なレンタルサーバーをお探しのアナタ、 http://www.ken3.org/asp/server.html ← けんぞうも使っているサーバーの紹介 『おっIISでbasp21でメール送信、mdbも使えるよ』(三流PG:31歳) ------------------------------------------------------------------------ 

/* * 6.終わりの挨拶 */

今回は、ftp.exeを使用して、ファイルをFTPでUP(put)してみました。 いろいろとまだまだ、改良点が必要だけどなんとかなったかなぁ? 改良点?問題点も間違いだろ?って? 厳しいなぁ、みなさん。 問題点は、スペースありのフォルダー名と複数ファイルのUPかなぁ。 まだまだ、ですね。 こんな方法もあるってことで、何か読者の心に残れば、うれしいです。 *私の独り言をうまく消化してくださいね。 偉そうな感じ悪い人になりかけてる不親切なKen3でした。 ~~~~~~~(↑オイオイ、また攻撃食らうぞ(笑))

フィードバック

VBA系の→[掲示板]←を覗く、質問を書き込む

評価・感想

No.149を読んだ満足度(評価)は?
5満足(参考になった)
4まぁまぁ(一部参考になった)
3普通(どちらとも言えない)
2なんかなぁ(期待と違った)
1不満(読んで損した気分)
作者に感想・質問を送る場合は下記に気軽に書いてください
あなたのお名前(ニックネーム) さん

作者からの返信は、 不用 E-mail で受信したい
*質問・感想はメルマガで紹介する場合があります

ページフッター(リンクや広告など)


[三流君(TOP ken3.org へ戻る)]
-- [VBA系TOPへ]
---- [VBA系バックナンバー目次へ移動]
------ [VBAでIEを操作 CreateObject("InternetExplorer.application")]・・・実は当店一番人気、VBAでIEを操作するサンプルです
------ [VBAでOutlookの操作 CreateObject("Outlook.Application")]・・・Outlookを使い、メール関係の処理です
------ [Access から Excel 連携 CreateObject("Excel.Application")]・・・人気のAccessからExcelへデータ書き出しなどです
------ [AccessのUserForm/サブフォームを操作]・・・アクセスでフォームを使ったサンプルです
------ [Accessのレポートを操作]・・・レポートを操作してみました
------ [Access クエリー関係やその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です
------ [Excel UserForm(ユーザーフォーム)を操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
------ [ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
------ [Excel関係 関数、その他]・・・その他Excel関係です
------ [VBAでテキストファイル(*.txt,*.html,*.csv)の操作]・・・テキストファイルを使ったサンプルです
------ [VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます


広告
-- [通販系の売れ筋広告へ] ←主に楽天やAmazonのランキングです
blog
-- [三流君の作業日記] ← 日々の作業を少々
-- [通販あしあと] ← 通販ページの足跡を一覧で羅列

情報を探す

情報を探すならGoogleかな?

↓Web全体、サポート情報(support.microsoft.com)や三流君VBA(ken3.org)から検索する
Google
Web www.ken3.org
www.microsoft.com support.microsoft.com

あとは、項目別にMSでお勉強かな?
◆ マイクロソフト サイトの歩き方
◇ How-To インデックス
◇ FAQ インデックス
◇ スキルレベル別おすすめコンテンツ
◇ テクノロジ マップ
◇ テーマ別技術資料一覧

書籍の購入

Webだけじゃさすがに勉強しきれないので、プログラミング関係の書籍も読んでみては??

コンピュータ書籍の発送がハヤイ専門店

コンピュータの本・専門店
種類が豊富で探し易いです。※在庫ありが48時間以内発送が急ぎで資料や書籍がほしい時、とても助かります。
お奨め本の目次を見るだけでも勉強になったり

amazon.co.jpでキーワード別チェック

下記、私が設定したキーワードですが、こんな感じで資料や書籍を探ってみては?
[VBA全体を把握する] -- やはり全体をさらっと見たいですよね。
[SQL関連でDB力UP] -- システムはデータベース設計が重要
[ADO接続を探る] -- VBAなのでADO接続を押さえておく
[Windows APIを探る] -- さらにAPIになて知ってれば強力だ!
[.NETを探る] -- と言っても時代は.NETに流れてるし
プログラミング以外でも知りたいことは多くって、
[人間関係] -- で、客先・上司、まわりに気を使い。
[プログラマーの自己啓発] -- プログラムだけじゃなくいろいろと向上したいよ
[コーチング・育成] -- 先輩になったら後輩(部下)の面倒をみてね。
そんなこんなでプログラマーっていろいろと大変なんだってば・・・