戻る

インターネット上の自分の場所に何かをアップロードしたりそこからダウンロードしたりする話なんで、そういう場所を持っていないんじゃ話になりません。

そういう場所を持っていて、そこに出入りするために必要な文字列もすでに揃っている、とします。
サーバー名: "www.hoyopuni.co.jp"
アカウント: "ahya8hya0"
パスワード: "disaster777"
この3つのほかに、もうひとつ、何というか、玄関先というか門のあたりというか敷地全体というか、 "/public_html/" みたいな形をした文字列、/---/このスラッシュで挟まれた部分は人によって違う可能性があるのかないのか、たとえばローカルでいう C:\ みたいなものなら話は楽、なんて思っていると痛い目にあうかもしれないような文字列。

これらが全て揃っているとして

以下をアタマに書いておけば、アップロード、ダウンロード、ファイル削除、フォルダ作成ができます(Access, Excel, Word 共通)
べつにアタマじゃなくても、PrivateをPublicにして・・・とか、面倒くさい話はひとまず抜きで
Option Explicit

Private Const INTERNET_DEFAULT_FTP_PORT As Long = 21
Private Const INTERNET_SERVICE_FTP As Long = 1
Private Const INTERNET_OPEN_TYPE_PRECONFIG As Long = &H0
Private Const FTP_TRANSFER_TYPE_ASCII As Long = &H1
Private Const FTP_TRANSFER_TYPE_BINARY As Long = &H2
Private Const FILE_ATTRIBUTE_NORMAL As Long = &H80

Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" _
        (ByVal lpszAgent As String, _
        ByVal dwAccessType As Long, _
        ByVal lpszProxyName As String, _
        ByVal lpszProxyBypass As String, _
        ByVal dwFlags As Long) As Long
                                                        
Private Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" _
        (ByVal hInternet As Long, _
        ByVal lpszServerName As String, _
        ByVal nServerPort As Long, _
        ByVal lpszUsername As String, _
        ByVal lpszPassword As String, _
        ByVal dwService As Long, _
        ByVal dwFlags As Long, _
        ByVal dwContext As Long) As Long
                                                        
Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInternet As Long) As Boolean

Private Declare Function FtpPutFile Lib "wininet.dll" Alias "FtpPutFileA" _
        (ByVal hConnect As Long, _
        ByVal lpszLocalFile As String, _
        ByVal lpszNewRemoteFile As String, _
        ByVal dwFlags As Long, _
        ByVal dwContext As Long) As Boolean 'こっちからあっちにアップロード
        
Private Declare Function FtpGetFile Lib "wininet.dll" Alias "FtpGetFileA" _
         (ByVal hConnect As Long, _
         ByVal lpszRemoteFile As String, _
         ByVal lpszNewFile As String, _
         ByVal fFailIfExists As Boolean, _
         ByVal dwFlagsAndAttributes As Long, _
         ByVal dwFlags As Long, _
         ByVal dwContext As Long) As Boolean 'あっちからこっちにダウンロード
         
Private Declare Function FtpDeletefile Lib "wininet.dll" Alias "FtpDeleteFileA" _
         (ByVal hConnect As Long, _
         ByVal lpszFileName As String) As Boolean 'あっちのファイルを削除
         
Private Declare Function FtpCreateDirectory Lib "wininet.dll" Alias "FtpCreateDirectoryA" _
        (ByVal hFtpSession As Long, _
        ByVal lpszDirectory As String) As Long 'あっちにフォルダ作成
アップロードもダウンロードもファイル削除もフォルダ作成も、処理の流れは一緒。

インターネット開いて
FTPつないで
何か処理して
切断して
閉じる

だいたい↓みたいな感じ

Private Sub CommandButton1_Click()
    Const cSERVER = "www.hoyopuni.co.jp", cACCOUNT = "ahya8hya0", cPASSWORD = "disaster777"

    Dim MyCnnINET As Long
    Dim MyCnnFTP As Long
    
    MyCnnINET = InternetOpen(vbNullString, INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
    If Err.LastDllError = 0 Then
        MyCnnFTP = InternetConnect(MyCnnINET, cSERVER, INTERNET_DEFAULT_FTP_PORT, cACCOUNT, cPASSWORD, INTERNET_SERVICE_FTP, 0, 0)
        If Err.LastDllError = 0 Then

            'Call FtpPutFile(MyCnnFTP,〜
            'Call FtpGetFile(MyCnnFTP,〜
            'Call FtpDeletefile(MyCnnFTP,〜
            'Call FtpCreateDirectory(MyCnnFTP,〜
            'アップロードとかダウンロードとかファイル削除とかフォルダ作成とか、やりたい放題ここに書く

        Else
            Call InternetCloseHandle(MyCnnINET)
            MsgBox "InternetConnect失敗"
            Exit Sub
        End If
        Call InternetCloseHandle(MyCnnFTP)
    Else
        MsgBox "InternetOpen失敗"
        Exit Sub
    End If
    Call InternetCloseHandle(MyCnnINET)
End Sub

アップロード
Call FtpPutFile(MyCnnFTP, "こっちのフルパス", "あっちのフルパス", アスキーかバイナリか, 0)
Call FtpPutFile(MyCnnFTP, "C:\MyTmp00\test.jpg", "/public_html/MyDir/test.jpg", FTP_TRANSFER_TYPE_BINARY, 0)
Call FtpPutFile(MyCnnFTP, "C:\MyTmp00\test.html", "/public_html/MyDir/test.html", FTP_TRANSFER_TYPE_ASCII, 0)



ダウンロード
Call FtpGetFile(MyCnnFTP, "あっちのフルパス", "こっちのフルパス", False, FILE_ATTRIBUTE_NORMAL, アスキーかバイナリか, 0)
Call FtpGetFile(MyCnnFTP, "/public_html/MyDir/test.jpg", "C:\MyTmp00\test.jpg", False, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY, 0)
Call FtpGetFile(MyCnnFTP, "/public_html/MyDir/test.txt", "C:\MyTmp00\test.txt", False, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_ASCII, 0)



あっちのファイル削除
Call FtpDeletefile(MyCnnFTP, 削除したいあっちのファイルのフルパス)
Call FtpDeletefile(MyCnnFTP, "/public_html/MyDir/test.html")



あっちにフォルダ作成
Call FtpCreateDirectory(MyCnnFTP, つくりたいフォルダ)
Call FtpCreateDirectory(MyCnnFTP, "/public_html/testDir")

False とか FILE_ATTRIBUTE_NORMAL とか 0 とか。こっちで勝手に決め打ちしちゃった引数があります。当面は気にしないでください。
要はいろんな設定があるってことですけど、必要になるときが来るようだったら、たぶんすぐに検索で答が出せる程度には物分りが良くなっていると思います(何が言いたいのかというと、これらの引数については自分もほとんど理解していないってこと)

ところで、Functionってのは、戻り値を取らずにただそれだけをぽんと置いたんじゃ怒られるんでしたっけ。
捨ての戻り値用変数用意しなきゃならないなんて面倒くせーと思ってたら、Callでしのげることを思い出した。
(ちょっとの期間離れただけでこんな基本的なことも忘れちゃう)
いや、本当はちゃんと戻り値とったうえ、その値に応じて分岐処理するべきなんでしょうけど。
とりあえず暑苦しい話は後回しってことで。