Excel / 如何使用VBA連線FTP 3

接下來要介紹winscp COM Library在excel vba的簡單使用方式

如果照抄範例,有修改連線主機跟帳密,程式還是會出錯的

猜測是版本問題,否則放一個錯誤的範例,真的是搞死人

因為我遇到的問題幾乎都有人問過,不過大部分得不到答案

而歸根究柢其實是程式碼錯誤,但是為了除錯卻跑錯方向

先說這個範例的錯誤,假設DLL已經正確登錄到系統的前提

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
Option Explicit
 
Sub Example()
 
    Dim mySession As New Session
    
    ' Enable custom error handling
    On Error Resume Next
    
    Upload mySession
    
    ' Query for errors
    If Err.Number <> 0 Then
        MsgBox "Error: " & Err.Description
 
        ' Clear the error
        Err.Clear
    End If
     
    ' Disconnect, clean up
    mySession.Dispose
     
    ' Restore default error handling
    On Error GoTo 0
    
End Sub
 
Private Sub Upload(ByRef mySession As Session)
 
    ' Setup session options
    Dim mySessionOptions As New SessionOptions
    With mySessionOptions
        .Protocol = Protocol_Sftp
        .HostName = "example.com"
        .UserName = "user"
        .Password = "mypassword"
        .SshHostKeyFingerprint = "ssh-rsa 2048 xxxxxxxxxxx..."
    End With
    
    ' Connect
    mySession.Open mySessionOptions
    
    ' Upload files
    Dim myTransferOptions As New TransferOptions
    myTransferOptions.TransferMode = TransferMode_Binary
     
    Dim transferResult As TransferOperationResult
    Set transferResult = _
        mySession.PutFiles("d:\toupload\*", "/home/user/", False, myTransferOptions)
     
    ' Throw on any error
    transferResult.Check
     
    ' Display results
    Dim transfer As TransferEventArgs
    For Each transfer In transferResult.Transfers
        MsgBox "Upload of " & transfer.Filename & " succeeded"
    Next
    
End Sub

 

連線主機跟帳密當然根據實際情況來修改設定

因為我連線的ftp主機採用外顯TLS加密協定

#33 .Protocol的值要改成Protocol_Ftp

#37 要改成 .TlsHostCertificateFingerprint,值是TLS的SHA碼

再新增一個屬性 .FtpSecure ,值為FtpSecure.FtpSecure_Explicit

這個屬性值在網站上的寫法是 FtpSecure.Explicit,所以程式在這邊會產生錯誤

 

 

光是排除錯誤就花了好幾個晚上

因為搜尋到的討論,會直接將問題導向是否為DLL本身無法支援

而這個猜測其實是合理的,原因在excel vba使用瀏覽物件功能,來檢視物件的屬性跟方法

確實會發現有些物件的屬性跟方法不存在,或者只有物件名稱,沒有任何的屬性跟方法

例如:session裡只有屬性,沒有方法

 

 

session.option裡面空白

 

 

所以一直走偏,一度用dnSpy來反編譯DLL

但其實是程式本身的錯誤,DLL在C#、VB.net、PowerShell都能正常使用

備註:如果DLL突然無法創建物件

我是因為安裝了6.3版,也安裝過6.4 beta,可能造成版本衝突

winscp論壇提供一個程式自身的清理功能 winscp.com /comregistration

可以把所有的DLL登錄刪除

刪除之後再重新登錄跟視窗程式的版本一樣的DLL應該就可以正常執行