Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.01.2010, 11:39   #1
smith45
Пользователь
 
Регистрация: 03.08.2009
Сообщений: 10
По умолчанию Скачивание файла из интернета по ссылке

Доброго времени суток.
Помогите, пожалуйста, разобраться с непонятным вопросом.
Цель: скачать файлы из интернета (пример ссылки для скачивания
https://www.atsenergo.ru/reporting/p...units/20091204 )
хочу скачать файлы *.zip.
Воспользовался приводимыми на форуме примерами и написал следующий код:
Цитата:
Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _
(ByVal pCaller As Long, ByVal szURL As String, _
ByVal szFileName As String, ByVal dwReserved As Long, _
ByVal lpfnCB As Long) As Long

Function DownLoadFile(FromPathName As String, ToPathName As String) As Boolean
DownLoadFile = URLDownloadToFile(0, FromPathName, ToPathName, 0, 0) = 0
End Function

Sub Main()
Dim link1, link2 As String
Dim linka As String
Dim Filename, fn2 As String
Dim data1, data2, d As Long
Dim i, j, k As Integer

data1 = 20100121
data2 = 20100126
k = data2 - data1

link1 = "https://www.atsenergo.ru/reporting/public/eur/carana_sell_units/"
link2 = "/?zip=true"
Filename = "D:\Downloads\atsenergo\"
On Error Resume Next
Kill Filename

For j = 0 To k
d = data1 + j
MkDir "D:\Downloads\atsenergo\" & d
Filename = "D:\Downloads\atsenergo\" & d & "\"
For i = 0 To 88
linka = link1 & d & "/" & i & link2
fn2 = Filename & i & ".zip"
'If i = 0 Or i = 1 Then Application.Wait (Now + TimeValue("0:00:05"))
If DownLoadFile(linka, fn2) Then
Else
MsgBox "Не удалось загрузить файл ", vbCritical
End If
Next i
Next j
End Sub
проблема: при скачивании первые файлы (с индексом 0, 1, иногда только 0) скачиваются поврежденными. Остальные файлы качаются нормально. пробовал притормозить макрос (заблокированная строка с кодом Wait) не помогает
Ещё вопрос: как сделать так чтобы названия файлов не изменялись? просто подставлять ссылку и скачивать файл с именем как на сайте не изменяя его имени?
smith45 вне форума Ответить с цитированием
Старый 26.01.2010, 14:50   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Проверил код и файлы.
Вывод: проблема не в коде, и никакие паузы тут не помогут.

Просто сервер некорретно формирует некоторые файлы
(заметьте, во всех папках архивы с именами 0.zip имеют размер больше остальных (28кБ, и не открываются.)
EducatedFool вне форума Ответить с цитированием
Старый 26.01.2010, 16:43   #3
smith45
Пользователь
 
Регистрация: 03.08.2009
Сообщений: 10
По умолчанию

Уважаемый, EducatedFool.
а возможно ли средствами VBA Excel скачивать файлы со страничек сайта просто используя ссылку?
т.е. есть прямая ссылка на файл. как используя VBA скачать файл?
smith45 вне форума Ответить с цитированием
Старый 26.01.2010, 16:50   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
а возможно ли средствами VBA Excel скачивать файлы со страничек сайта просто используя ссылку?
конечно возможно
http://excelvba.ru/code/DownloadFile


Цитата:
как используя VBA скачать файл?
а приведённый Вами код разве делает что-то другое?

Попробуйте такой вариант кода:

Код:
Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _
                                   (ByVal pCaller As Long, ByVal szURL As String, _
                                    ByVal szFileName As String, ByVal dwReserved As Long, _
                                    ByVal lpfnCB As Long) As Long

Function DownLoadFile(FromPathName, ToPathName) As Boolean
    DownLoadFile = URLDownloadToFile(0, FromPathName, ToPathName, 0, 0) = 0
End Function

Sub Main()
    Папка = "C:\Documents and Settings\Игорь\Рабочий стол\"
    data1 = 20100121: data2 = 20100126: k = data2 - data1

    link1 = "https://www.atsenergo.ru/reporting/public/eur/carana_sell_units/"
    Filename = "D:\Downloads\atsenergo\"
    On Error Resume Next
    Kill Filename

    For j = 0 To k
        d = data1 + j: MkDir Папка & d
        Filename = Папка & d & "\"
        For i = 0 To 88
            linka = link1 & d & "/" & i
            fn2 = Filename & i & ".xls"
            DoEvents
            If DownLoadFile(linka, fn2) Then
                Debug.Print "Скачан файл: " & linka
            Else
                MsgBox "Не удалось загрузить файл ", vbCritical
            End If
        Next i
    Next j
End Sub
Будут скачиваться файлы excel
На самом деле ранее скачивались именно файлы excel, а открыть Вы их не могли потому, что присваивали создаваемым файлам расширение ZIP

PS: На будущее - когда Вы пишете Dim i, j, k As Integer
то только переменная k получает тип Integer, а остальные - тип Variant

Правильно будет так: Dim i As Integer, j As Integer, k As Integer

Последний раз редактировалось EducatedFool; 16.02.2012 в 18:47.
EducatedFool вне форума Ответить с цитированием
Старый 26.01.2010, 17:14   #5
smith45
Пользователь
 
Регистрация: 03.08.2009
Сообщений: 10
По умолчанию

приведенный код задаёт имя сохраняемого файла. а как просто скачать файл? с оригинальным именем файла?
т.е. просто "сымитировать" кликание мышкой на ссылке файла на странице сайта. возможно ли такое?

про определение типа переменной уже столкнулся с "byref argument type mismatch"

и всё равно используя ваш измененный код файлы с названием "0" и "1" скачиваются некорректными. видать правда сервер что-то не то формирует в ответ на запрос
smith45 вне форума Ответить с цитированием
Старый 26.01.2010, 17:24   #6
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Прямой ссылкой скачать не получится.Сервер не разрешает,у Вас нет прав на это.
я пробовал программно скачать несколькими вариантами созданых загрузчиков.Практически везде сервер отвечал отказом.
Программно,через браузер качается,но надо жать кнопку сохранить.
Попробую что то решить
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 26.01.2010, 17:25   #7
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
и всё равно используя ваш измененный код файлы с названием "0" и "1" скачиваются некорректными.
Ну незнаю... вот то, что скачалось под именем 0.xls:
(самый первый файл, скачанный макросом)



Не вижу в этом файле ничего некорректного...

Цитата:
про определение типа переменной уже столкнулся с "byref argument type mismatch"
Надо было взять код из моего поста ПОЛНОСТЬЮ - тогда бы VBA не ругался.

Обратите внимание - я убрал пару слов в одной строке кода:
Код:
Function DownLoadFile(FromPathName, ToPathName) As Boolean
Цитата:
а как просто скачать файл? с оригинальным именем файла?
Как - не знаю. Скорее всего, надо как-то выдирать имя файла из функции URLDownloadToFile (или использовать другой метод скачивания / другую API-функцию)
Можно попробовать, но не вижу смысла - какая разница, под каким именем сохранён файл?

Последний раз редактировалось EducatedFool; 26.01.2010 в 17:30.
EducatedFool вне форума Ответить с цитированием
Старый 26.01.2010, 17:31   #8
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Первый и я скачал,а надо же купу файлов,что бы качал в цикле
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 26.01.2010, 17:41   #9
smith45
Пользователь
 
Регистрация: 03.08.2009
Сообщений: 10
По умолчанию

EducatedFool
я полностью скопировал Ваш код. попробовал ещё раз. всё равно. таже проблема Может зависит ещё от чего
странно... попробую позже с другого провайдера...
хотя у Вас также были некорректные файлы при использовании моего кода, не понимаю.

ошибка неточности типа переменной попалась мне не на Вашем коде, сегодня же, но ранее почитал про неё в интернете и переписал определение всех переменных.

doober
ну а вот используя такой браузер как Chrome от Google не нужно нажимать "сохранить". он сразу качает "щёлкнутый" файл в ранее определенную директорию

Жаль что такая проблема в VBA... или не проблема, а отсутствие такой возможности.

Спасибо за помощь!
smith45 вне форума Ответить с цитированием
Старый 27.01.2010, 10:08   #10
Maxx
Форумчанин
 
Аватар для Maxx
 
Регистрация: 29.10.2008
Сообщений: 294
По умолчанию

Всем доброго дня! Очень интересная тема и для меня абсолютно новая!
Изучив все посты выше, понял, что ничего не понял

Хотелось бы скачивать от сюда: http://www.finam.ru/analysis/MetaStock/default.asp

файл ММВБ Итоги дня.
Прямой линк на файл такой: http://www.finam.ru/_private/Files/micex-y.zip

Написал следующее:
Код:
Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _
                                   (ByVal pCaller As Long, ByVal szURL As String, _
                                    ByVal szFileName As String, ByVal dwReserved As Long, _
                                    ByVal lpfnCB As Long) As Long

Function DownLoadFile(FromPathName, ToPathName) As Boolean
    DownLoadFile = URLDownloadToFile(0, FromPathName, ToPathName, 0, 0) = 0
End Function
Sub Main()
    Папка = "C:\Documents and Settings\marenkovm\Рабочий стол\1\"
    link = "http://www.finam.ru/_private/Files/micex-y.zip"
    FileToLoad = Папка & Day(Now)-1 & Month(Now) & Year(Now) & ".zip"
            If DownLoadFile(link, FileToLoad) Then
                Debug.Print "Скачан файл: " & link
            Else
                MsgBox "Не удалось загрузить файл ", vbCritical
            End If
End Sub
Ну и конечно же в итоге MsgBox "Не удалось загрузить файл ", vbCritical

Помогите, пожалуйста!

Последний раз редактировалось Maxx; 27.01.2010 в 10:12.
Maxx вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Частичное скачивание файла Usov Работа с сетью в Delphi 1 19.10.2009 21:45
Скачивание файла Lemo Помощь студентам 16 28.07.2009 22:54
Скачивание случайного файла с фтп snooppy Работа с сетью в Delphi 8 16.10.2008 11:36
Скачивание файла из сети, по средствам TcpClient. papa_serg Работа с сетью в Delphi 6 01.04.2008 23:22
Скачивание файла с прогрессом CoDeR Работа с сетью в Delphi 2 22.10.2007 09:10