- 締切済み
エクセルVBAを使ってサーバーにアップロードしたい
仮にディスクトップに1つのフォルダがあるとします。 そのフォルダには、エクセルのファイルが1つ、その他には、.htmlファイルや.css、.gif、.txtなどの複数のファイルがあります。 また、エクセルのSheet1のA1にホスト名、A2にユーザ名、A3にパスワードがあるとします。 そこで、エクセルVBAで、FTPアップロードを行いたいのですが、可能でしょうか? ちなみに、関係ないファイルがサーバーに上がっては困るので、エクセルの.xlsmの形式や、.txtなど任意のファイル形式を除いたファイルをアップロードしたいと考えています。 いろいろ調べてみたのですが、私の手には負えないので、こちらで質問しています。 どなたか教えて頂けないでしょうか。 よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- keithin
- ベストアンサー率66% (5278/7941)
ご相談内容を変更して新たなご相談とされるのでしたら,こちらのご相談投稿は解決で閉じる操作を忘れず行っておいてください。 FFFTPを直接ExcelVBAから操作したいという事のご様子ですが,おそらく出来ませんので,残念ですが私の方からアドバイスできる内容はありません。 Sendkeyで無理矢理操作するのは,まぁ必要に応じてタイマーを噛ませるなどしてゆっくりキーを送っていけば,もしかすると?出来るかも??しれませんが,この点についての追加のアドバイスはありません。
- keithin
- ベストアンサー率66% (5278/7941)
繰り返しますが、アップロード先の指定が間違ってるんじゃないでしょうかね。 アナタガやってるマクロの具体的なフィードバックが無いので、こちらもお話しするネタ切れです。 内容は変わりませんが、試しにこちらも参考にしてみたらどうでしょう。 http://officetanaka.net/excel/vba/tips/tips47.htm
- keithin
- ベストアンサー率66% (5278/7941)
アップロード先の指定が間違ってるんじゃないですか? Sub CommandButton1_Click() Set BASP21 = CreateObject("Basp21.FTP") rc = BASP21.Connect(Worksheets("Sheet1").Range("A1").Value, Worksheets("Sheet1").Range("A2").Value, Worksheets("Sheet1").Range("A3").Value) If rc = 0 Then myPath = "c:\test\" myfile = Dir(myPath & "*.*") Do Until myfile = "" If myfile Like "*.xlsx" Or myfile Like "*.txt" Then ’do nothing Else msgbox "you get " & myfile rc = BASP21.PutFile(myPath & myfile, "", 1) If rc = 0 Then MsgBox "FTPアップロード 無" ElseIf rc > 0 Then MsgBox "FTPアップロード OK" Else MsgBox "FTPアップロード NG" End If End If myfile = Dir() Loop rc = BASP21.Close() Else MsgBox "FTP接続 NG" End If End Sub マクロからBasp21の呼び出し自体は成功してるっぽいので大丈夫だと思いますが、もしもコネクト自体出来てない気配があるようなら、 http://kchon.blog111.fc2.com/blog-entry-170.html のサンプルマクロのコメントにあるように ' FTPアップロードのサンプル(VBA) ' Basp21.dllとBsmtp.dllをC:\Windowsにコピーしています ' [Regsvr32.exe Basp21.dll]を実行しています も実行してみたらどうでしょう。
お礼
度々ありがとうございます。 試してみたのですが、エクセル上では「you get ファイル名」「FTPアップロード 無」が繰り返し表示れます。(ちょっと時間がかかる感じです) ffftpソフトで調べてみると、実際はアップされていませんでした。 もう少し、考えてみたいと思います。
- keithin
- ベストアンサー率66% (5278/7941)
>rc = BASP21.Connect("ftp.xxx.com", "ftp_id", "ftp_ps") これはそのまま rc = BASP21.Connect(worksheets("Sheet1").range("A1").value, worksheets("Sheet1").range("A2").value, worksheets("Sheet1").range("A3").value) のようになりますね。 >また、"c:\temp\test.dat"ここの部分 対象のファイル(「test.dat」の部分)の拾い出し方は、先の回答で回答済みです。 丸ごとまたマクロを書かないと、全然応用できませんか? 作成例: dim myPath dim myfile mypath = "c:\test\" myfile = dir(mypath & "*.*") do until myfile = "" if myfile like "*.xlsx" or myfile like "*.txt" then 'do nothing else rc = BASP21.PutFile(mypath & myfile, "/home", 1) end if myfile = dir() loop >フォルダの場所がいつも決まっているとは限りません。 それで? 決まってないにしても「マクロを実行したいギリギリのこの瞬間」には、当然「どこか」にはファイルはあるんですよね。 それを前述のmypathに放り込んでやるような事になります。 どこにあるのか判りませんだけでは、具体的なマクロの書きようもありません。それは判りますよね? 要は、マクロを実行するときに「具体的にファイルはここにある」をマクロに示し、回答マクロのmypathが「mypath = "c:\test\"」のようになっていればイイという事です。どうしたらフォルダを指定できるのか、アナタの実際の作業の中で、具体的に出来ることを考えて下さい。 繰り返しますが「違います、出来ません」では、全く何一つ先に進まないので、「こうです、こうすればできます、こうしたいです」を具体的に考えて下さい。 どうしても自分じゃどうしたらいいのか考え付かないけどマクロは書かなきゃならないなら、回答したマクロに合うように、具体的には「C:\test\」の中にファイルを放り込んでください。
補足
度々、すいません。 以下のように書いて、試してみたのですが、「FTPアップロード無」と出てしまいます。 「c:\test\」ここの場所にエクセルやhtmlのファイルとおいてみたのですが、なぜかアップロードしません。 書き方が間違っているでしょうか? Sub CommandButton1_Click() ' FTP用コンポーネントの宣言 Set BASP21 = CreateObject("Basp21.FTP") ' FTP接続(オープン) rc = BASP21.Connect(Worksheets("Sheet1").Range("A1").Value, Worksheets("Sheet1").Range("A2").Value, Worksheets("Sheet1").Range("A3").Value) ' FTP接続結果チェック If rc = 0 Then ' FTPアップロード Dim myPath Dim myfile myPath = "c:\test\" myfile = Dir(myPath & "*.*") Do Until myfile = "" If myfile Like "*.xlsx" Or myfile Like "*.txt" Then 'do nothing Else rc = BASP21.PutFile(myPath & myfile, "/home", 1) End If myfile = Dir() Loop ' FTPアップロード結果チェック If rc = 0 Then MsgBox "FTPアップロード 無" ElseIf rc > 0 Then MsgBox "FTPアップロード OK" Else MsgBox "FTPアップロード NG" End If ' FTP切断(クローズ) rc = BASP21.Close() Else MsgBox "FTP接続 NG" End If End Sub
- keithin
- ベストアンサー率66% (5278/7941)
ん? 紹介したURLに「BASP21のダウンロードおよびインストールに関しては、上記サイトをご覧ください。」と書いてある通り、そのリンクを見る リンクには「BASP21のインストール 適当なディレクトリに BASP21.exe をダウンロードします。 インストールは、BASP21.exe を実行するだけ。すぐ終わります。 」と書いてある通り、ダウンロードしてWクリックして実行する 他のアップデートも置いてあるので、状況を見て必要に応じてダウンロードし、入れ替える。 以上です。
お礼
keithinさん、回答ありがとうございます。 BASP21のインストールをしてftpに接続するところまでは出来ました。 しかし、 rc = BASP21.Connect("ftp.xxx.com", "ftp_id", "ftp_ps") rc = BASP21.PutFile("c:\temp\test.dat", "/home", 1) この2つ部分がよくわかりません。 ftp.xxx.com", "ftp_id", "ftp_psの部分でエクセルSheet1のA1、A2、A3を反映させるとか基本的なことがわかっていません。 また、"c:\temp\test.dat"ここの部分では、フォルダの場所がいつも決まっているとは限りません。 すいませんが、今回の場合では、どのようなVBAを書けばいいか具体的に教えていただけないでしょうか?
- keithin
- ベストアンサー率66% (5278/7941)
色々調べたのでしたら既に見つけて勉強済みかもしれませんが。 BASP21を使う例が下記に解説されています。こちらの方が簡単なのでお勧めです。 http://www.moug.net/tech/exvba/0150107.html http://kchon.blog111.fc2.com/blog-entry-170.html API関数を使う方法が下記に解説されています http://www.happy2-island.com/access/gogo03/capter90302.shtml アップロードするファイルの仕分けは、単純に標準的なdir関数のループで十分に思えますが、それも判らないのでしたら。 dim myfile myfile = dir("c:\test\*.*") do until myfile = "" if myfile like "*.xlsx" or myfile like "*.txt" then 'do nothing else 'ftp upload end if myfile = dir() loop
お礼
回答ありがとうございます。 「basp21」と言うのがあると言うのは分かったのですが、具体的に何をどうすればいいかよくわかりません。
補足
keithinさん、度々の回答ありがとうございます。 やはり、なぜか上手くいかないようです。 そこで、今回は、諦めて別の方法でやってみようと思います。 「FFFTPを立ち上げて、ホスト一覧からサイト名を選んで接続」までをVBAで出来たらいいなと思いました。 そこで以下のような感じでffftpは立ち上がったのですが、ホスト一覧からサイト名を選択して接続するやり方がわかりません。 ちなみにエクセルA1にサイト名があるとします。 (これって、もしかして、不可能でしょうか?) Sub Sample() Dim rc As Long rc = Shell("C:~\FFFTP.exe", vbNormalFocus) If rc = 0 Then MsgBox "起動に失敗しました" End Sub 度々の質問で申し訳ありません。