2024/12/04

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應該就可以正常執行

0 comments:

張貼留言