プロが教える店舗&オフィスのセキュリティ対策術

仮にディスクトップに1つのフォルダがあるとします。
そのフォルダには、エクセルのファイルが1つ、その他には、.htmlファイルや.css、.gif、.txtなどの複数のファイルがあります。
また、エクセルのSheet1のA1にホスト名、A2にユーザ名、A3にパスワードがあるとします。
そこで、エクセルVBAで、FTPアップロードを行いたいのですが、可能でしょうか?
ちなみに、関係ないファイルがサーバーに上がっては困るので、エクセルの.xlsmの形式や、.txtなど任意のファイル形式を除いたファイルをアップロードしたいと考えています。
いろいろ調べてみたのですが、私の手には負えないので、こちらで質問しています。

どなたか教えて頂けないでしょうか。
よろしくお願いします。

A 回答 (6件)

色々調べたのでしたら既に見つけて勉強済みかもしれませんが。



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/capte …





アップロードするファイルの仕分けは、単純に標準的な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
    • good
    • 0
この回答へのお礼

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

「basp21」と言うのがあると言うのは分かったのですが、具体的に何をどうすればいいかよくわかりません。

お礼日時:2012/07/14 14:53

ん?



紹介したURLに「BASP21のダウンロードおよびインストールに関しては、上記サイトをご覧ください。」と書いてある通り、そのリンクを見る

リンクには「BASP21のインストール 適当なディレクトリに BASP21.exe をダウンロードします。 インストールは、BASP21.exe を実行するだけ。すぐ終わります。 」と書いてある通り、ダウンロードしてWクリックして実行する
他のアップデートも置いてあるので、状況を見て必要に応じてダウンロードし、入れ替える。

以上です。
    • good
    • 0
この回答へのお礼

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を書けばいいか具体的に教えていただけないでしょうか?

お礼日時:2012/07/15 12:44

>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

補足日時:2012/07/15 14:48
    • good
    • 0

アップロード先の指定が間違ってるんじゃないですか?




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]を実行しています
も実行してみたらどうでしょう。
    • good
    • 1
この回答へのお礼

度々ありがとうございます。
試してみたのですが、エクセル上では「you get ファイル名」「FTPアップロード 無」が繰り返し表示れます。(ちょっと時間がかかる感じです)

ffftpソフトで調べてみると、実際はアップされていませんでした。

もう少し、考えてみたいと思います。

お礼日時:2012/07/15 16:37

繰り返しますが、アップロード先の指定が間違ってるんじゃないでしょうかね。


アナタガやってるマクロの具体的なフィードバックが無いので、こちらもお話しするネタ切れです。


内容は変わりませんが、試しにこちらも参考にしてみたらどうでしょう。
http://officetanaka.net/excel/vba/tips/tips47.htm

この回答への補足

keithinさん、度々の回答ありがとうございます。
やはり、なぜか上手くいかないようです。
そこで、今回は、諦めて別の方法でやってみようと思います。

「FFFTPを立ち上げて、ホスト一覧からサイト名を選んで接続」までをVBAで出来たらいいなと思いました。

そこで以下のような感じでffftpは立ち上がったのですが、ホスト一覧からサイト名を選択して接続するやり方がわかりません。

ちなみにエクセルA1にサイト名があるとします。
(これって、もしかして、不可能でしょうか?)

Sub Sample()
Dim rc As Long
rc = Shell("C:~\FFFTP.exe", vbNormalFocus)
If rc = 0 Then MsgBox "起動に失敗しました"

End Sub

度々の質問で申し訳ありません。

補足日時:2012/07/17 15:26
    • good
    • 0

ご相談内容を変更して新たなご相談とされるのでしたら,こちらのご相談投稿は解決で閉じる操作を忘れず行っておいてください。



FFFTPを直接ExcelVBAから操作したいという事のご様子ですが,おそらく出来ませんので,残念ですが私の方からアドバイスできる内容はありません。
Sendkeyで無理矢理操作するのは,まぁ必要に応じてタイマーを噛ませるなどしてゆっくりキーを送っていけば,もしかすると?出来るかも??しれませんが,この点についての追加のアドバイスはありません。
    • good
    • 1

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