2011-08-25 117 views
1

我編寫了VBA代碼,該代碼根據Excel數據(Websphere MQ Define Job)爲IBM主機創建一個包含作業代碼的.txt文件。在VBA中使用FTP

有可能通過FTP自動將該文件傳輸到主機將是很酷的。

(評論:LPAR =主機名)

ftp <LPAR> 
'user' 
'password' 
put 'dateiname' 

它工作的罰款。在這一點上我通過手動完成。但是我不知道如何將這個轉換成VBA代碼。我發現了一個類似的問題在這裏和那裏該解決方案被張貼:

Public Sub FtpSend() 

    Dim vPath As String 
    Dim vFile As String 
    Dim vFTPServ As String 
    Dim fNum As Long 

    vPath = ThisWorkbook.path 
    vFile = "path" 
    vFTPServ = "<LPAR>" 

    'Mounting file command for ftp.exe 
    fNum = FreeFile() 
    Open vPath & "\FtpComm.txt" For Output As #fNum 
    Print #1, "user *******" ' your login and password" 
    'Print #1, "cd TargetDir" 'change to dir on server 
    Print #1, "bin" ' bin or ascii file type to send 
    Print #1, "put " & vPath & "\" & vFile & " " & vFile ' upload local filename to  server  file 
    Print #1, "close" ' close connection 
    Print #1, "quit" ' Quit ftp program Close 

    Shell "ftp -n -i -g -s:" & vPath & "\FtpComm.txt " & vFTPServ, vbNormalNoFocus 

    SetAttr vPath & "\FtpComm.txt", vbNormal 
    Kill vPath & "\FtpComm.txt" 

End Sub 

我不知道如果我完全理解的代碼。我想我用用戶數據和內容創建一個虛擬文件FtpComm.txt,並使用該文件打開連接併發送數據。

它的工作原理,不知何故,直到點

*SetAttr vPath & "\FtpComm.txt", vbNormal* 

在那裏,我得到的錯誤

Runtime-Error: 55 - File already opened.

到LPAR的連接設置在這一點上。但是「SetAttr ...」是做什麼的?這是輸入完成的地方嗎?我該怎麼辦?

+0

您不妨看看http://wiki.lessthandot.com/index.php/FTP_in_Access – Fionnuala

+0

您是否在shell中嘗試了命令?即鍵入shell'ftp -n -i -g -s: \ FtpComm.txt ?或一步一步? – JMax

回答

1

SetAttr用於設置文件(或文件夾)的屬性。在你的情況下,它將其設置回正常(所以不能隱藏,只讀等)。但是,由於您的文件仍然處於打開「輸出打開」狀態,因此會失敗,並顯示「文件已打開」錯誤。

雖然我沒有看到任何爲什麼要調用SetAttr函數的原因,因爲您不會在其他地方更改屬性。所以隨時刪除它,看看它是否仍然有效。

+0

刪除此行後,我在下一行中收到相同的錯誤(已打開):「Kill vPath&\ FtpComm.txt」。但是,文件FtpComm.txt或Shell命令不會將我的文件發送到主機。它只連接但不登錄或發送文件。 – Ocalion

8

兩件事。

首先,你是從下獲得fNum = FreeFile()文件編號#fNum打開一個文件,然後只是假設,這將在Print #1等:

Open vPath & "\FtpComm.txt" For Output As #fNum 
Print #1, "user *******" ' your login and password" 

改變返回1,因爲所有你Print #1Print #fNum

其次,您打開文件的I/O,但從不關閉它。所以當然,當你試圖修改它的屬性或刪除它時,系統會抱怨它已經打開並且正在使用中。解決方案是關閉文件 - 只要完成寫入/讀取文件,您應該始終執行此操作。

Close #fNum ' add this line 
' Can now manipulate the file without risking conflict 

Shell "ftp -n -i -g -s:" & vPath & "\FtpComm.txt " & vFTPServ, vbNormalNoFocus 

SetAttr vPath & "\FtpComm.txt", vbNormal 
Kill vPath & "\FtpComm.txt" 

至於你的代碼是在高水平上做:如果你在命令行中鍵入ftp -help,你會看到那些-n -i -g -s標誌的意思。所以是的,你正在編寫FTP命令來記錄FtpComm.txt,然後通過-s標誌將該文件提供給ftp

-s:filename Specifies a text file containing FTP commands; the 
       commands will automatically run after FTP starts. 
+0

謝謝。我只是試着發表以下 - 但coudn't回答我自己的問題!當試圖將FtpComm.txt的格式添加到我的問題中時,我提到了以下內容: 文件FtpComm.txt在關閉之前未被寫入。但沒有關閉命令。 所以在這個過程中FtpComm.txt總是空的! 我加了一個 關閉#1 現在它似乎工作。我無法在主機上找到我的轉發器,並且在我可以讀取任何內容之前命令窗口已經消失,但我正在嘗試單獨解決此問題。 感謝您的幫助!我會報告進度:) – Ocalion

4

你走在正確的道路上,下面讓 - 弗朗索瓦的答案應該讓你在那裏。

如果你想要一些你可以剪切和粘貼的東西,你可以嘗試下面的代碼。這是幾年前我寫的東西的變體。

最大的缺陷是,一旦你shell命令FTP,你不知道文件是否真正轉移,直到你手動檢查。

但是,如果你只限於嚴格VBA,那麼這是要走的路:

Option Explicit 
Const FTP_ADDRESS = "ftp.yourdestination.com" 
Const FTP_USERID = "anon" 
Const FTP_PASSWORD = "anon" 

Sub Macro1() 
    If Not SendFtpFile_F() Then 
     MsgBox "Could not ftp file" 
    Else 
     MsgBox "Sent" 
    End If 
End Sub 

Function SendFtpFile_F() As Boolean 
    Dim rc As Integer 
    Dim iFreeFile As Integer 
    Dim sFTPUserID As String 
    Dim sFTPPassWord As String 
    Dim sWorkingDirectory As String 
    Dim sFileToSend As String 

    Const FTP_BATCH_FILE_NAME = "myFtpFile.ftp" 
    Const INCREASED_BUFFER_SIZE = 20480 

    SendFtpFile_F = False 

    sWorkingDirectory = "C:\YourWorkingDirectory\" 
    sFileToSend = "NameOfFile.txt" 

    On Error GoTo FtpNECAFile_EH 

    'Kill FTP process file if it exists 
    If Dir(sWorkingDirectory & FTP_BATCH_FILE_NAME) <> "" Then 
     Kill sWorkingDirectory & FTP_BATCH_FILE_NAME 
    End If 

    'Create FTP process file 
    iFreeFile = FreeFile 
    Open sWorkingDirectory & FTP_BATCH_FILE_NAME For Output As #iFreeFile 
    Print #iFreeFile, "open " & FTP_ADDRESS 
    Print #iFreeFile, FTP_USERID 
    Print #iFreeFile, FTP_PASSWORD 
    Print #iFreeFile, "mput " & sWorkingDirectory & sFileToSend 
    Print #iFreeFile, "quit" 
    Close #iFreeFile 

    'Shell command the FTP file to the server 
    Shell "ftp -i -w:20480 -s:" & sWorkingDirectory & FTP_BATCH_FILE_NAME 

    SendFtpFile_F = True 

    GoTo FtpNECAFile_EX 

    FtpNECAFile_EH: 
     MsgBox "Err", Err.Name 

    FtpNECAFile_EX: 

    Exit Function 

End Function 

注意:當步進通過代碼,你可以在即時窗口中鍵入以下命令,然後複製/結果粘貼到一個命令窗口:

? Shell "ftp -i -w:20480 -s:" & sWorkingDirectory & FTP_BATCH_FILE_NAME 
+0

我用你的代碼,它完美的工作在我的電腦上,但是當我把它發給我在另一個國家的團隊成員之一時,它不適合他們,是否有任何需要設置的預定義設置我們可以運行這個之前 – Anarach

0

在第一個例子,這句話後

Print #1, "quit" ' Quit ftp program Close 
由於該文件是目前使用

Close #fNum 

必須關閉用於與句子連接文件。