Работа с FTP из VBA

Представляю вашему вниманию инструментарий для работы с файлами по FTP

Как известно, отправить файл на 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 ломаются за секунду)

Вложения:

Комментарии

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Коллеги подскажи... столкнулся с такой проблемой, что данный алгоритм категорически не работает с буквой Я на фтп сервере... при загрузке файлов на ФТП в имени которых есть буква Я, она просто пропускается, а при попытке обратиться к папке с буквой Я он ее просто не находит...
Вч ем может быть проблема???

Вы вводите недопустимый IP адрес, оттого и ошибка.

IP адрес:порт
Подскажите, почему адрес сервера с портом для доступа не работает?
например завожу в поле сервер 121.121455.86:2121 при проверке пишет ошибка, при удалении порта начинает проверять, но естественно ошибка, так как требуется порт...

Виталий, спасибо за отзыв
По поводу NAT, — ну, не знаю, не было у меня никогда проблем с ним. Все компы, на которых я использовал этот код, были за NAT (за роутером). Вот только без файрвола (ибо зачем создавать себе проблемы)

Т.е. если это обычный комп с интернетом, всё будет работать.
А если это организация, где есть сисадмины, которые постоянно там что-то настраивают, защищают, используют хитрые файрволы и т.п., - то да, потом фиг разберешься, что почему не работает.

Ещё раз здравствуйте! Хотел бы поделиться результатами испытаний на различных компьютерах данного этого скрипта и класса.
Вкратце, всё удручающе плохо, но не потому что автор что-то не учёл или допустил ошибку. Тут как раз наоборот, код логически блестящен, а класс построен безукоризненно на мой взгляд дилетанта.
Проблема заключается совсем другом: утилита ftp, встроенная в систему Windows, крайне капризна в плане работы через различные файрволлы с NAT, которыми изобилуют локальные подсети как у частных лиц, так и организациях. В некоторых случаях, эту утилиту (ftp) не удалось заставить работать должным образом даже при деятельном содействии нескольких системных администраторов разных корпоративных подсетей.

Решение было подсказано "внезапно" работающей программой командной строки на моём компьютере с Windows 10 (это вендорская сборка ОС от бренда, имя не указываю, чтобы не сочли за рекламу). Её имя - cURL, которая чаще привычна пользователям *NIX операционных систем. Чаще всего, cURL на Windows не предустановлен. Вкратце, основной функционал:

'скачивает c FTP указанный файл (file.txt) в указанную папку под нужным именем (my_file.txt)
curl -u user:password -o c:\tmp\my_file.txt ftp://my_ftp.server.ru/files/file.txt

'закачивает файл my_file.txt из указанного места на FTP с тем же именем
curl -u user:password -T c:\tmp\my_file.txt ftp://my_ftp.server.ru/files/

С использованием этой утилиты: все пляски с бубнами по поводу NAT, открытием портов, раздачей прав в политиках и проброски портов через шлюзы - сразу закончились!
Установка cURL на Windows любой версии проста и легко ищется по запросу "cURL Windows", я её устанавливал на компьютеры даже в условиях ограниченной учетной записи (т.е., без прав Администратора).
Мне пришлось модифицировать представленный Игорем код в соответствии с задачами моего конкретного случая, и полагаю, это послужит толчком для остальных пытливых пользователей этого замечательного сайта. Код публиковать не буду нигде по многим соображениям, просто подсказал путь принципиального решения проблемы.

Ещё раз спасибо Игорю - автору, программисту и администратору этого замечательного проекта!

Прежде всего хотелось бы поблагодарить Администратора этого замечательного сайта за этот скрипт. Спасибо Игорь, вы делаете хорошее дело!
Заметил, что некоторые пользователи жалуются на то, что при закачке и скачивании файла они получают файл с нулевой длиной.
С ровно такой же проблемой пришлось столкнуться и мне. При этом способ, подсказанный в обсуждении - добавить процесс Excel.exe в исключения для брандмауэра - мне не помог.
Пришлось копнуть немного глубже.
Как оказалось, при отключении брандмауэра, весь функционал класса работает вполне нормально.
Не буду рассказывать долго из-за чего это произошло и как.
Мне помогло добавление правила в исходящие и входящие соединения для файла ftp.exe , который обычно находится в папке Windows/system32/. Правило разрешает все соединения этого файла по протоколу TCP по всем портам. Для справки: у меня Windows 10 Home, которая в мае 2018 обновилась до версии 1803.

Доработки бесплатных макросов, либо консультации по их использованию, - только на платной основе.

ЭЭх, блин, я поищу конечно в нете перебор, ибо сам могу только на Js сейчас написать перебор, на VBA - к сожалению слишком вскользь сталкивался. А так - я конечно понимаю что вам это не прям надо - но мб скинули бы вариант?Или через заказ только?

Да, можно
Получаете список файлов, в цикле перебираете их, проверяя на совпадение с нужными расширениями.
Если совпадение есть, - скачиваете очередной файл

Здравствуйте. подскажите - можно ли как-то сделать загрузку всех файлов из папки по опр. шаблону (типа как по формату, *.jpg/*.ico и т.д.)

В файле с использованием WinAPI прописаны условия для разных версий VBA. А в случае с разными ОС (32 и 64 бит) всё идентично?

День добрый!
Возникла проблема при загрузке файла с фтп... если попытаться сохранить файл в корневой каталог например c:\1.xlsm то он его просто туда не записывает не выдавая никакой ошибке о доступе и т.д. там просто не появляется файла...
А вот если указать путь c:\users\public\1.xlsm то все нормально сохраняется

Здравствуйте, Иван.
Да, можно
Код под ваш случай писать лень, - в комментах его уже дважды писал. (могу под заказ сделать макрос)
Сначала к одному подключаетесь и отправляете файл, потом точно также к другому подключаетесь и отправляете
Можно 2 отдельных макроса сделать (отличающихся только настройками доступа), можно в один макрос объединить.

Здравствуйте, Игорь!
Подскажите, пожалуйста, можно ли с помощью вашего решения загружать файлы одновременно на два разных сервера? Можно ли в настройках задать два фтп? Если да, то подскажите, пожалуйста, каким образом? Где это задать?

Да, как всегда, спешишь и только все усложняешь сам себе )) Благодарю, так все работает. Отправил так же небольшую благодарность за помощь на Я.кошелек.
Заметил маленький недочет, если интересно.
В настройках сайт прописываю так:
.BaseURL = "http://site.ru/"
загрузку файла запускаю так:
link$ = FTP.UploadFile(filename$, "/wp-content/uploads")
или так
link$ = FTP.UploadFile(filename$, "wp-content/uploads")
файл в любом случае закачивается норм, а вот в окне отладки результат всегда пишется с пропущенным слэшем:
"Загруженный файл доступен по ссылке: http://site.ru/wp-contentuploads/111.txt"

Андрей, надо быть внимательнее :)
Из примера, где вы взяли код, вы потеряли самую первую строку кода:

Dim FTP As New FTPserver

А я так и написал в посту ниже: "Создал новый файл Access, из вашего примера по ссылке с WinAPI экспортировал в него все что было внутри."
Я думаю "перетащить" и экспортировать/импортировать это же без разницы?
Вот скриншот с файла Access - https://yadi.sk/i/DaVsKN63pgxuL - все модули и формы называются точно также и содержат точно такой же код как в вашем примере.

Но дело не в этом. Сейчас скачал ваш пример с WinAPI, вставил в НЕГО новую процедуру test() - код ее ниже я писал - запустил и получил ровно ту же ошибку объекта.
Так что я явно что то не так запускаю. Взгляните плиз на код моей процедуры запуска еще разок, как будет время...

Надо из файла Excel в примере перетащить в Access ВСЁ - все 4 модуля класса, форму, и модуль
Тогда всё должно заработать

Вы написали "поставить какие-то галочки", а их там тьма... ) Ну не суть.
Теперь на самую первую строку моей процедуры ругается "Требуется объект", то есть "New FTPsettings" не может выполнить.
В каком классе этот объект задается? Не найду..
Форму я никак не запускал и не сохранял через нее данные, если что. Ведь это наверно не нужно, раз я руками в процедуре прописываю доступы?

Андрей, я же написал, что нужно сделать.
Надо в Tools - References (в редакторе VBA) поставить галочку для библиотеки Microsoft XML v.6.0
(версия может быть и 3.0. или 4.0. - какая найдется)
И ошибка эта исчезнет.

Создал новый файл Access, из вашего примера по ссылке с WinAPI экспортировал в него все что было внутри.
Создал для теста новую процедуру по примеру из коммента:

Sub test()
    Set FTP.settings = New FTPsettings
    With FTP.settings
        .Host = "site.ru"
        .Login = "login"
        .Password = "pass"
        .BaseURL = "http://site.ru/"
        .Mode = 0
    End With
    If Not FTP.OpenConnection Then
        MsgBox "Не удалось соединиться с сервером site.ru" & vbNewLine & _
               FTP.GetLastError, vbCritical, "Ошибка доступа на сервер по FTP"
        Exit Function
    End If
    MsgBox "Success"
End Sub

(данные конечно меняю на свои)
И она тут же выплевывает ошибку: https://yadi.sk/i/SI4s5kX_futdG
Это тупик?..

Здравствуйте, Андрей.
Код без WinAPI использовать не советую, - он не везде работает.
Новая версия (на WinAPI) в плане настроек - аналогичная старой версии, почти все также
Почитайте комменты, - буквально 3 комментами ниже написано, как задавать настройки в коде.

По Access - возможно, надо в Tools - References поставить какие-то галочки (я на access код не тестировал, - но, по идее, все должно работать без серьезных переделок)

Здравствуйте.
Спасибо за код что вы пишите.
Столкнулся с такой же проблемой что и Сергей - при использовании модуля без WinAPI на одном компе все проходит нормально, а тот же код на другом компе пишет пустой файл на FTP.
В результате хочу попробовать модуль с использование WinAPI, но там все в разы сложнее понять... Никак даже не могу найти где мне прописать настройки. В этой версии модуля их нельзя прописать в коде VBA?
И второй вопрос, попробовал использовать этот модуль для VBA Access, но при запуске тестового примера выдает какую-то ошибку связанную с DOM. Может ли модуль на основе WinAPI работать из Access 2010?

Здравствуйте!
А с помощью вашей надстройки возможно получить список файлов с контрольными суммами md5 из определенной папки ftp-сервера, не скачивая эти файлы?

Спасибо огромное, все работает! Правда пришлось так же заменить пять слов на Object )

    Dim FTP As New FTPserver
 
    ' вместо  FTP.LoadSettings "название набора настроек из реестра"
    ' пишем что-то подобное:
    Set FTP.Settings = New FTPsettings
    With FTP.Settings
        .Host = "your_site.ru"
        .Password = "123"
        .Login = "user"
        .BaseURL = "http://your_site.ru/folder"
        .Mode = 0        ' пассивный режим FTP (1 если активный)
    End With
 
    ' а далее - как в примере

    If Not FTP.OpenConnection Then
        MsgBox "Не удалось соединиться с сервером your_site.ru" & vbNewLine & _
               FTP.GetLastError, vbCritical, "Ошибка доступа на сервер по FTP"
        Exit Function
    End If
 
    ' и т.д.

Не подскажете где искать? Прошлая версия была проще, в этой, слегка заблудился. Буду крайне признателен.

Сергей, в этом плане, в новой версии всё также, - настройки могут быть и в коде прописаны, разницы нет.

Попробую ) Подскажите пожалуйста, можно ли обойти внесение в реестр данных о сервере? Можно ли внести данные непосредственно в код VBA, как было в старой версии? Безопасность не волнует совсем.

Здравствуйте, Сергей.
У меня такая же проблема была пару раз, - но я не помню, что там было не так.
Сейчас отправкой по FTP пользуюсь редко, и только с одного компа, - потому, проблем нет.
Увы, ничего подсказать не могу, - не получилось у меня вспомнить, что я там делал.
PS: Если пользуетесь старым модулем, - попробуйте новый (который на WinAPI)

Пользуюсь Вашим модулем с удовольствием, но в процессе тестирования обнаружил такую проблему: в большинстве случаев отправка происходит нормально. Файл сохраняется и отправляется. Но иногда происходит так, что на сервер отправляется АБСОЛЮТНО пустой файл, с нулевым размером. Я использую один и тот же ноутбук, но в разных местах: на работе и дома. Дома не работает. На работе - легко. В чем причина - понять не могу. Разный в этих случаях лишь интернет. Но при этом в том же total commander файл на тот же сервер доходит нормально. И сохраняется файл тоже нормально. Следовательно проблема в пересылке. Не подскажете с чем мне поковыряться? Потому что сегодня мне поставщик точно так же не смог ответить, пришли дважды пустые файлы (

Огромное спасибо все заработало.

Здравствуйте, Евгений.
Замените в коде все слова IXMLDOMElement и DOMDocument на слово Object

Или нажмите в редакторе VBA в меню Tools - References, и отключите ссылку на библиотеку Microsoft XML v.3.0
включив вместо неё ссылку на аналогичную версии 4.0 (или какая там найдется у вас)

Здравствуйте. Большое спасибо за новую версию, проверил в оригинале работает.
Но возникла проблема при переносе в другой - документ, при запуске формы появляется ошибка в функции
Function ExportToXML() As IXMLDOMElement. Office 2013 x64

Новая версия работает только в 32-битном Excel. Если сам Excel 64-битный, то некоторые функции не работают, как минимум GetDirectoryListing. Видимо, связано с изменением размера указателей.

Федор, 4 дня назад я прикрепил усовершенствованный файл к этой статье.
Скачивайте и пользуйтесь

Добрый день!
Скачал ваш модуль, пользуюсь для закачки файлов на сервер, все отлично работает!
Не могли бы вы отправить мне на почту усовершенствованный вариант с функциями SetFTPDirectory, GetDirectoryListing и др.
Заранее спасибо!

в принципе, пользуясь вашим советом в комментах 1-го файла:
' Информацию по параметрам командной строки FTP.exe можно найти здесь:
' http://computers.deria.ru/article/~pr/sprav/166/282/
- можно все действия ручками в FTP.exe перевести в код, как в вашем примере на planetaexcel (http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=8&TID=3...) в ветке "адрес файла на фтп с неизвестной переменной"

по линку, указанному мной ниже - дополнение класса модуля выглядит так: !!!
Function FilesFromFolder(ByVal FtpFolder$, Optional ByVal Mask$ = "*")
On Error Resume Next: Kill TMP_FILE_PATH$
folder$ = Replace(FtpFolder$, "//", "/")

TXT_DIR$ = "user " & Login & " " & Password & vbNewLine
TXT_DIR$ = TXT_DIR$ & "cd " & folder$ & vbNewLine
'ls [удаленный_каталог] [локальный_файл] - Вывод сокращенного списка файлов и подкаталогов в удаленном каталоге.
TXT_DIR$ = TXT_DIR$ & "ls " & Mask$ & " """ & TMP_FILE_PATH$ & """" & vbNewLine
TXT_DIR$ = TXT_DIR$ & "close" & vbNewLine & "bye" & vbNewLine

res$ = Execute(TXT_DIR$)
s = Split(res, "150 Here comes the directory listing.")(1)
res$ = Split(s, "226 Directory send OK.")(0)

FilesFromFolder = res$

Kill TMP_FILE_PATH$
While Right(FilesFromFolder, 2) = vbNewLine: FilesFromFolder = Left(FilesFromFolder, Len(FilesFromFolder) - 2): Wend
FilesFromFolder = Split(FilesFromFolder, vbNewLine)
End Function

а сам Обычный модуль так: !!!
Private Function FTPacc() As FTPcommander
'account ' возвращает объект типа FTPcommander, с нужными настройками
Set FTPacc = New FTPcommander
With FTPacc
.Host = "ftp.cmegroup.com"
.Login = "anonymous"
.Password = ""
.BaseFolder = "ftp.cmegroup.com"
.BaseURL = "C:\"
End With
End Function

Sub test()
On Error Resume Next
strPath = "forwardpoints"

Dim FTP As FTPcommander ' объявляем переменную
Set FTP = FTPacc ' создаём объект с нужными настройками

' загружаем с FTP список файлов
arr = FTP.FilesFromFolder(WEB_FOLDER$, strPath)
MsgBox "Найдено файлов: " & UBound(arr)
MsgBox "Последний файл: " & arr(UBound(arr))

' перебираем имена файлов в массиве
'For i = LBound(arr) To UBound(arr)
'MsgBox "Найден файл: " & vbNewLine & arr(i)
'Next i

Set FTP = Nothing
End Sub

Спасибо вам ещё раз. Новые технологии буду осваивать, наверно, попозже... у меня пока работает и прошлое ваше творение!

JeyCi, я давно не использую код, описанный в статье, - он не на всех компах работает.
Прикрепил к статье новый файл - ftp_new_version_WinAPI.xlsb
Эта версия кода более стабильна, и функциональна (возможностей больше)
Используются WinAPI функции.

Принцип использования - похож на то, что описано в статье.
Настройки FTP вводятся через форму.
Пример использования в файле присутствует.

Игорь, все программисты - волшебники. - ваш модуль класса в FTPфайле очередной раз доказывает это. Вобщем, поэкспериментировав с !! TotalCommander выявила параметры нужного ftp: (если кто-нибудь захочет заглянуть на CMEgroup)

Function MyFTPaccount() As FTPcommander
' возвращает объект типа FTPcommander, с нужными настройками
Set MyFTPaccount = New FTPcommander
With MyFTPaccount
.Host = "ftp.cmegroup.com"
.Login = "anonymous"
.Password = ""
.BaseFolder = "/settle/"
.BaseURL = "C:\"
End With
End Function

смогла закачать файл:
Sub MY_test()
Dim FTP As FTPcommander ' объявляем переменную
' создаём объект с нужными настройками
' необязательно, если настройки записаны в реестре
Set FTP = MyFTPaccount
fn$ = "C:\1\"
res = FTP.DownloadFile("", "stlcur", fn$ & "mysett.txt")
If res Then
Debug.Print "Файл успешно загружен с FTP"
Else
Debug.Print "Ошибка: ", FTP.GetLastError
End If
End Sub

правда, "дебугнулось", что ошибка... но файл, оказался, благополучно загруженным... Спасибо вам большое!.. мой выходной прошёл не зря!...
попробую разобраться ещё, КАК считать имена и время последнего файла в папке на ftp... (ftp://ftp.cmegroup.com/forwardpoints/)... может быть, у вас найдутся идеи и мысли в свободное время?? успехов вам.

Игорь, я знаю ответ вместо Яны, поскольку попала в такую же ситуацию... - с ftp всё время берутся старые данные (которые хоть раз открывались в IE) - похоже, отпечатались где-то в Temporary IE Files... - если брать через ваш GetHttpResponce... поэтому вынуждена искать др. вариант для доступа на ftp.cmegroup.com (в моём случае)... через ftp.exe - могу войти ок, как аноним в командную строку:(ftp -A ftp.cmegroup.com)>dir>cd settle>dir>lcd c:\>get stlcur mysett.csv... потом >quit... - РУЧКАМИ ЭТО ВСЁ РАБОТАЕТ!!..

ваш код из ответа#17 очень, думаю, подходит, чтобы автоматизировать этот процесс, но почему-то ничего не срабатывает... думаю, что не знаю, что прописать здесь (чтобы работало то, что у меня получается руками в ftp.exe)... ?? не подскажете, в чём ошибка и почему не работает и как можно исправить ошибку ?

Function MyFTPaccount() As FTPcommander
' возвращает объект типа FTPcommander, с нужными настройками
Set MyFTPaccount = New FTPcommander
With MyFTPaccount
.Host = ""
.Login = ""
.Password = ""
.BaseFolder = "/ftp.cmegroup.com/settle/"
.BaseURL = "C:\"
End With
End Function

Sub test2342342()
Dim FTP As FTPcommander ' объявляем переменную
' создаём объект с нужными настройками
' необязательно, если настройки записаны в реестре
Set FTP = MyFTPaccount

не могу понять, как в моей ситуации подобраться к ftp.cmegroup.com??:
(чтобы сделать то, что делала в ftp.exe) - что означают данные параметры для функции?? куда, откуда? и слэш всегда нужен?

' скачивание файла
If FTP.DownloadFile("C:\test.jpg", "mail.jpg", "/") Then
Debug.Print "Файл скачан успешно, размер файла в байтах: " & FileLen("C:\test.jpg")
Else
Debug.Print "Ошибка: " & FTP.GetLastError
End If

' получение списка файлов из заданного каталога
If Not FTP.SetFTPDirectory("test") Then
Debug.Print "Не удалось подключиться к каталогу «test»"
Exit Sub
End If

p.s. т.е. по сути 2 вопроса мучают уже долго:
1)как авторизоваться как аноним чтобы скачать на локал комп?
2)как правильно прописать вашу функцию в моём случае? (с какими параметрами)

а что, в виндовом ftp.exe отменили команду pasv ?

Яна, а я не понял, зачем использовать навороченный макрос для работы с FTP, если надо что-то копировать на локальный компьютер...
Это как спросить, зачем самолету крылья, если я собираюсь ездить на нем только по дорогам.

наверно я слишком тупа никак не пойму назначение этой строчки.

SaveSetting Application.Name, "FTP", "BaseURL", "http://Адрес Вашего Сайта, куда будут закачиваться файлы/"

не поняла, зачем сайт. Мне нужно на локаль скопировать.
А если и сайт, а права раздать, что прям на любой сайт возьмет и закопируется, не понятно.

("Выслал вам на почту файл с новой версией инструментов для работы с FTP")
Буду очень признателен, если выложите эту версию файла на сайт или отправите и мне на почту.
А то уже отчаялся настроить получение списка файлов и размер папки на FTP на основе того кода, что здесь представлен. Excel ругается на первую же строчку "Dim FTP As New FTPserver, settings As New FTPsettings" из макроса "ПримерРаботыССерверомFTP".
Огромное спасибо!

Подключение по FTP выполняется от имени процесса excel.exe
Т.е. надо добавить приложение Excel в список исключений файрвола.
Ну и порт должен быть открыт.

Приветствую всех! Во-первых, хочу поблагодарить админов за этот сайт. Во-вторых за этот топик. Очень помог. Одна проблемка - на Win8 64 брандмауэр блокирует. Какой файл нужно добавить в исключения, чтобы макрос работал без проблем... Или брандмауэр блокирует сам порт? Знатоки, кто подскажет?

Здравствуйте, Андрей
Этот макрос работает не на всех компах, - надо использовать аналогичный макрос на базе WinAPI

Попробовал Макрос со своими настройками (вариант 2). В итоге на сервере появляется файл который я заливал, но 0 размера. Разрешения для папки заливки поставил 777, но все равно ничего не изменилось.

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
Подтвердите, пожалуйста, что вы - человек:
  ____    _   _   ____   __  __  _       ____  
| _ \ | | | | | _ \ \ \/ / | |__ | _ \
| |_) | | | | | | |_) | \ / | '_ \ | |_) |
| _ < | |_| | | _ < / \ | |_) | | _ <
|_| \_\ \___/ |_| \_\ /_/\_\ |_.__/ |_| \_\
Введите код, изображенный в стиле ASCII-арт.

Не получается применить макрос? Не удаётся изменить код под свои нужды?

Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.