| 
 Работа с FTP из VBA (без использования WinAPI)   
- Инструменты разработчика VBA 
 
- Макросы VBA Excel 
 
- Скачивание файлов 
 
- Разное 
 
- Интернет 
 
- Логин и пароль 
 
- Работа с FTP 
 
- Текстовые файлы 
 
- Модули класса 
 
- Работа с файлами  
 
  |   
Представляю вашему вниманию инструментарий для работы с файлами по FTP, не требующий использования системных функций (WinAPI) 
Как известно, отправить файл на FTP сервер (или загрузить файл с FTP, создать папку на FTP сервере, и т.д.) можно при помощи таких API-функций из библиотеки wininet.dll, как FtpPutFile, FtpGetFile, FtpRenameFile, FtpDeleteFile, FtpRemoveDirectory, FtpCreateDirectory, FtpFindFirstFile и т.д. 
Как именно использовать эти функции - можете посмотреть в коде надстройки для отправки файлов Excel на FTP сервер  
В чем недостаток этого способа - так это в необходимости обеспечения совместимости кода с различными платформами. В частности, чтобы код с функциями API работал и в Office 2010, и в 64-битной Windows, необходимо заметно увеличить объём кода . А, поскольку описание этих функций из wininet.dll и без того занимает много места (а универсальный код вообще займёт сотню строк), да и надо ещё и разбираться во всех этих функциях, т.к. в разных версиях Windows возможны различия в способе вызова функций из wininet.dll, и были созданы аналоги этих функций для работы с FTP, не использующие WinAPI 
Сподвигла меня на это решение необходимость реализации средств обновления надстроек Excel , где необходимо было реализовать функционал отправки файлов Excel на FTP сервер, причем так, чтобы это стабильно работало на всех компьютерах. Попутно, кстати, родилась и функция загрузки файла с сервера без использования WinAPI , которая тоже вошла в состав данного инструментария. 
  
Основу предлагаемого мной решения составляет модуль класса FTPcommander, который предоставляет вам следующие функции: 
- Function DownloadFile(ByVal FtpFolder$, ByVal FtpFilename$, ByVal LocalPath$) As Boolean
 (Функция скачивает файл с FTP-сервера с именем FtpFilename$ из папки FtpFolder$. Скачанный файл сохраняется на компьютере под именем (и по пути) LocalPath$. Функция возвращает TRUE, если загрузка файла завершилась успешно) 
- Function UploadFile(ByVal LocalPath$, Optional ByVal FtpFolder$, Optional ByVal FtpFilename$ = "") As String
 (Функция загружает файл LocalPath$ по FTP на сервер в папку FtpFolder$. Если задан параметр FtpFilename$, отправленный файл получает имя FtpFilename$. Функция возвращает ссылку на файл, если закачка файла завершилась успешно) 
- Function CreateNewFolder(ByVal FtpFolder$) As Boolean
 (Функция создаёт папку FtpFolder$ на FTP сервере. Возвращает TRUE, если папка была успешно создана, или существовала ранее) 
- Function DeleteFile(ByVal FtpFolder$, ByVal FtpFilename$) As Boolean
 (Функция создаёт папку FtpFolder$ на FTP сервере. Возвращает TRUE, если папка была успешно создана, или существовала ранее) 
- Function DownloadFileFromURL(ByVal URL$, ByVal LocalPath$) As Boolean
 (Функция скачивает файл по ссылке URL$, и сохраняет его по пути LocalPath$. Возвращает TRUE, если файл был успешно загружен) 
- Функция GetLastError возвращает информацию об ошибке, если некая функция была завершена некорректно (возвратила FALSE)
  
Дополнительно в составе модуля класса есть функции чтения и записи текстовых файлов ReadTXTfile и SaveTXTfile , а также функции перекодировки файлов и текста ChangeFileCharset и ChangeTextCharset  
  
Как использовать модуль класса FTPcommander для работы с файлами по FTP: 
1) Откройте прикреплённый к статье файл Excel, и мышом перетащите модуль класса FTPcommander в свой файл 
2) Пропишите настройки FTP аккаунта в специальной функции, или сохраните их в реестре Windows (подробнее об этом - ниже) 
3) В своём макросе создаёте экземпляр класса FTPcommander, и используете его методы для работы с файлами Создать экземпляр класса вам поможет следующий код:  Dim FTP As New FTPcommander Примеры макросов отправки и скачивания файлов доступны в прикреплённом файле (в модуле mod_TestFTP): 
Вот один из примеров использования класса FTPcommander: 
Private Sub ЗагрузкаФайлаНаFTPсервер() 
    ' Этот макрос загружает файл "C:\ПЖиВ.jpg" в корневую папку FTP сервера, 
    ' переименовывая файл в "ER" 
    Dim FTP As New FTPcommander 
    Link$ = FTP.UploadFile("C:\ПЖиВ.jpg", , "ER")
  
    ' В переменную Link$ возвращается ссылка вида "http://u3661.seiko.vps-private.net/ER", 
    ' по которой доступен загруженный через FTP файл 
End Sub 
Как видите, всего 2 строки кода, - и ваш файл оказался загружен на FTP сервер. 
Ещё один пример использования: 
Private Sub ЗагрузкаСПоследующимСкачиваниемФайла() 
    Dim FTP As New FTPcommander 
    fn$ = "C:\Documents and Settings\Admin\Рабочий стол\stamp.png" 
  
    ' отправляем файл с рабочего стола на FTP сервер 
    ' (на сервере файл получит имя "1 2 3.png") 
    Link$ = FTP.UploadFile(fn$, , "1 2 3.png") 
    If Len(Link$) Then 
        Debug.Print "Загруженный файл доступен по ссылке: ", Link$ 
    Else 
        Debug.Print "Ошибка: ", FTP.GetLastError 
    End If 
  
    ' а теперь скачиваем с сервера ранее загруженный файл "1 2 3.png" 
    ' Скачанный файл окажется в той же папке (Рабочий стол), 
    ' и получит имя "stamp.png222" 
    res = FTP.DownloadFile("", "1 2 3.png", fn$ & "222")
    If res Then 
        Debug.Print "Файл успешно загружен с FTP" 
    Else 
        Debug.Print "Ошибка: ", FTP.GetLastError 
    End If 
End Sub 
  
Есть 2 способа задать настройки FTP аккаунта для использования объектом FTPcommander: 
  
1 способ - один раз запустить макрос следующего вида: 
Sub Save_FTP_Account_Information()    ' достаточно запустить ОДИН РАЗ! 
    ' Cохраняем в реестре Windows настройки FTP-аккаунта по-умолчанию 
    SaveSetting Application.Name, "FTP", "Host", "Имя или IP адрес сервера FTP" 
    SaveSetting Application.Name, "FTP", "Login", "Имя пользователя (логин)" 
    SaveSetting Application.Name, "FTP", "Password", "Пароль к FTP серверу" 
    SaveSetting Application.Name, "FTP", "BaseFolder", "путь к стартовой папке, например, /www/" 
    SaveSetting Application.Name, "FTP", "BaseURL", "http://Адрес Вашего Сайта, куда будут закачиваться файлы/" 
End Sub 
Этот макрос запишет все необходимые настройки в реестр Windows, и впоследствии будет брать их оттуда 
Преимущество этого способа: один раз запустили макрос, потом удалили его, - и можно нигде в коде не прописывать секретные данные FTP аккаунта 
Недостаток этого способа: при хранении настроек в реестре, возможен доступ только к одному FTP серверу 
  
2 способ - для инициализации объекта FTPcommander использовать специальные функции с настройками: 
Function MyFTPaccount() As FTPcommander 
    ' возвращает объект типа FTPcommander, с нужными настройками 
    Set MyFTPaccount = New FTPcommander 
    With MyFTPaccount 
        .Host = "Имя или IP адрес сервера FTP" 
        .Login = "Имя пользователя (логин)" 
        .Password = "Пароль к FTP серверу" 
        .BaseFolder = "путь к стартовой папке, например, /www/" 
        .BaseURL = "http://Адрес Вашего Сайта, куда будут закачиваться файлы/" 
    End With 
End Function 
Пример использования функции: 
Sub test() 
    Dim FTP As FTPcommander    ' объявляем переменную 
    Set FTP = MyFTPaccount    ' создаём объект с нужными настройками 
    FTP.UploadFile ("C:\123.jpg")    ' отправляем файл на сервер
End Sub 
Преимущества этого способа: возможно работать с несколькими FTP серверами одновременно, конфиденциальные данные (настройки FTP аккаунта) не хранятся в открытом виде в реестре 
Недостаток этого способа: настройки FTP аккаунта хранятся в коде VBA - если файл попадёт постороннему человеку, он легко сможет добраться до этих настроек (как известно, любые пароли на VBA ломаются за секунду) 
| 
 Вложение  | 
 Размер  | 
 Загрузки  | 
 Последняя загрузка  |  
| 
 FTP.xls   | 
 45.5 КБ  | 
 36  | 
 48 недель 5 дней назад  |  
| 
 ftp_new_version_WinAPI.xlsb   | 
 89.81 КБ  | 
 0  | 
 Ещё не загружался  |   
 |