ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 28472|回复: 17

[原创] 使用EXCEL VBA操作FTP服务器的技术汇总(附源代码)

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2012-8-15 22:56 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
FTP访问代码有三种实现方式,总结如下技术特征,请大家根据实际情况选择使用。

方法一代码最简洁,
方法二与系统结合度高,运行稳定,代码复杂,
方法三代码简单但需要第三方控件支持

方法一 使用SHELL启动FTP命令
  1. Sub 从FTP自动下载文件_SHELL()
  2. Dim strPNAME As String '参数文件名
  3. Dim nFNO As Integer '文件编号

  4. strPNAME = ThisWorkbook.Path & "\ftptest.txt" '文件名生成
  5. nFNO = FreeFile '获取空的文件号

  6. Open strPNAME For Output As #nFNO '生成新的文件

  7. Print #nFNO, "open plaza14.mbn.or.jp" 'open主机名
  8. Print #nFNO, "user ken3 XXXXXX←路径" 'user命令 用户名 密码
  9. Print #nFNO, "cd www"
  10. Print #nFNO, "pwd"
  11. Print #nFNO, "get index.html " & ThisWorkbook.Path & "\index.html"

  12. Close #nFNO '关闭
  13. 'shell启动FTP -n为参数
  14. Shell "ftp -n -s:" & strPNAME

  15. End Sub

  16. Sub 向FTP自动上传文件_SHELL()
  17. Dim strFILENAME As String

  18. strFILENAME = Application.GetOpenFilename
  19. Call ftp_upfile("ftp.xxxx.jp", "username", "pass", "data/pc/", strFILENAME)

  20. End Sub

  21. Sub ftp_upfile(strHNAME As String, _
  22. strUSERNAME As String, _
  23. strPASS As String, _
  24. strDIR As String, _
  25. strUPFILE As String)
  26. Dim strPNAME As String
  27. Dim nFNO As Integer

  28. strPNAME = ThisWorkbook.Path & "\ftppara.dat"

  29. nFNO = FreeFile
  30. Open strPNAME For Output As #nFNO

  31. Print #nFNO, "open " & strHNAME
  32. Print #nFNO, "user " & strUSERNAME & " " & strPASS
  33. Print #nFNO, "cd " & strDIR 'cd xxxx 进入待写目录
  34. Print #nFNO, "put " & strUPFILE 'put 上传文件
  35. Print #nFNO, "quit" '退出

  36. Close #nFNO
  37. Shell "ftp -n -s:" & strPNAME

  38. End Sub
复制代码
方法二 使用Win内置DLL进行FTP传输
  1. 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
  2. Declare Function InternetConnect Lib "WinInet.DLL" Alias "InternetConnectA" (ByVal hInternet As Long, ByVal lpszServerName As String, ByVal nServerPort As Integer, ByVal lpszUsername As String, ByVal lpszPassword As String, ByVal dwService As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Long
  3. 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
  4. Declare Function InternetCloseHandle Lib "WinInet.DLL" (ByVal hInternet As Long) As Integer

  5. Const FTP_TRANSFER_TYPE_ASCII As Long = &H1 '文本模式
  6. Const FTP_TRANSFER_TYPE_BINARY As Long = &H2 '2进制模式

  7. Sub 从FTP自动下载文件_SHELL()
  8. Dim server As String
  9. Dim user As String
  10. Dim passwd As String
  11. Dim localFile As String
  12. Dim serverFile As String
  13. server = "ftp.server.jp" '主机名
  14. user = "user" '用户名
  15. passwd = "password" '密码
  16. localFile = "C:\test.xls" '本地文件
  17. serverFile = "/upload/zaiko/test.xls" 'FTP服务器端文件

  18. Dim hOpen As Long
  19. Dim hConnection As Long
  20. Dim result As Long
  21. Do
  22. hOpen = InternetOpen(server, 1, vbNullString, vbNullString, 0)
  23. If hOpen = 0 Then
  24. MsgBox "Open错误:" & Err.LastDllError
  25. Exit Do
  26. End If
  27. hConnection = InternetConnect(hOpen, server, 0, user, passwd, 1, 0, 0)
  28. If hConnection = 0 Then
  29. MsgBox "连接错误:" & Err.LastDllError
  30. Exit Do
  31. End If
  32. If FtpPutFile(hConnection, localFile, serverFile, FTP_TRANSFER_TYPE_BINARY, 0) = 0 Then
  33. MsgBox "传输错误:" & Err.LastDllError
  34. Exit Do
  35. End If
  36. Loop Until True
  37. If (hConnection <> 0) Then InternetCloseHandle hConnection
  38. If (hOpen <> 0) Then InternetCloseHandle hOpen
  39. MsgBox "成功鸟!"
  40. End Sub
复制代码
方法三 使用basp21DLL进行FTP传输
  1. Sub 从FTP自动上传文件_basp21()
  2. Dim FTP, rc As Long, Server As String, User As String, Pass As String
  3. Dim Target As String, Folder As String
  4. Set FTP = CreateObject("basp21.FTP") ''FTP对象
  5. Server = "ftp.xxxxx.com" ''主机地址
  6. User = "toru_tanaka" ''用户名
  7. Pass = "password" ''密码
  8. Target = Application.GetOpenFilename() ''上传
  9. If Target = "False" Then Exit Sub
  10. Folder = "test/sub" ''上传文件夹
  11. rc = FTP.Connect(Server, User, Pass)
  12. If rc <> 0 Then
  13. MsgBox "FTP无法连接", vbCritical
  14. FTP.Close
  15. Exit Sub
  16. End If
  17. rc = FTP.PutFile(Target, Folder)
  18. If rc <> 1 Then
  19. MsgBox Dir(Target) & "无法上传", vbCritical
  20. FTP.Close
  21. Exit Sub
  22. End If
  23. MsgBox Dir(Target) & "上传成功", vbInformation
  24. FTP.Close
  25. End Sub

  26. Sub 从FTP自动下载文件_basp21()
  27. Dim FTP, rc As Long, Server As String, User As String, Pass As String
  28. Dim Target As String, Folder As String
  29. Set FTP = CreateObject("basp21.FTP")
  30. Server = "ftp.xxxxx.com"
  31. User = "toru_tanaka"
  32. Pass = "password"
  33. Folder = ThisWorkbook.Path & "\data" ''本地文件夹
  34. Target = "test/sub/sample.dat" ''下载文件名
  35. rc = FTP.Connect(Server, User, Pass)
  36. If rc <> 0 Then
  37. MsgBox "FTP无法连接", vbCritical
  38. FTP.Close
  39. Exit Sub
  40. End If
  41. rc = FTP.GetFile(Target, Folder)
  42. If rc <> 1 Then
  43. MsgBox "文件无法下载", vbCritical
  44. FTP.Close
  45. Exit Sub
  46. End If
  47. MsgBox "文件下载成功", vbInformation
  48. FTP.Close
  49. End Sub
复制代码

该贴已经同步到 xiamen168的微博

TA的精华主题

TA的得分主题

发表于 2012-8-15 23:14 | 显示全部楼层
挺好的资料

TA的精华主题

TA的得分主题

发表于 2012-8-15 23:16 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-10-26 12:36 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
非常有用的东东!谢谢!

TA的精华主题

TA的得分主题

发表于 2012-10-29 10:11 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-11-8 19:10 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
学习一下,收藏了。谢谢分享。

TA的精华主题

TA的得分主题

发表于 2014-3-24 09:53 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-10-23 10:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Ftp登陆提示连接超时这个有没有办法可以解决?

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-1-9 10:23 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
7176386 发表于 2014-10-23 10:17
Ftp登陆提示连接超时这个有没有办法可以解决?

需要调试排除环境问题

TA的精华主题

TA的得分主题

发表于 2015-1-23 17:03 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
xiamen168 发表于 2015-1-9 10:23
需要调试排除环境问题

如果是使用VB6.0采用多线程的方式来处理Ftp访问超时的话,还是真心不好整,其一是Vb6多线程不稳定,调用Dll来处理的话,有时候也是会出现卡死的情况,我已经采用Asp动态网页+Access,这种稳定多了。。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-3-15 19:21 , Processed in 0.026088 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表