Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Скачать (Сохранить) файл с Яндекс-диска макросом Excel - Страница 2 - Мир MS Excel

Старая форма входа
  • Страница 2 из 2
  • «
  • 1
  • 2
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Скачать (Сохранить) файл с Яндекс-диска макросом Excel (Макросы/Sub)
Скачать (Сохранить) файл с Яндекс-диска макросом Excel
Alex_ST Дата: Пятница, 09.12.2016, 12:12 | Сообщение № 21
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3206
Репутация: 609 ±
Замечаний: 0% ±

2003
Лена, не надо подавать плохой пример начинающим.
Если не знаешь точно размерности или необходимо раннее связывание, лучше уж не удалять определение переменной (терпеть не могу работать без Option Explicit >( ), а просто определить As Variant
[vba]
Код
Dim dd
[/vba]



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Пятница, 09.12.2016, 12:14
 
Ответить
СообщениеЛена, не надо подавать плохой пример начинающим.
Если не знаешь точно размерности или необходимо раннее связывание, лучше уж не удалять определение переменной (терпеть не могу работать без Option Explicit >( ), а просто определить As Variant
[vba]
Код
Dim dd
[/vba]

Автор - Alex_ST
Дата добавления - 09.12.2016 в 12:12
Pelena Дата: Пятница, 09.12.2016, 12:16 | Сообщение № 22
Группа: Админы
Ранг: Местный житель
Сообщений: 19182
Репутация: 4420 ±
Замечаний: ±

Excel 365 & Mac Excel
Леш, эта переменная нигде не используется


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеЛеш, эта переменная нигде не используется

Автор - Pelena
Дата добавления - 09.12.2016 в 12:16
Alex_ST Дата: Пятница, 09.12.2016, 13:21 | Сообщение № 23
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3206
Репутация: 609 ±
Замечаний: 0% ±

2003
Честно говоря, код не разбирал. Но если пользователь говорит, что
Вот на этой строчке споткнулся[vba]
Код
Dim dd As WinHttpRequest
[/vba]
То это однозначно говорит о том, что в референсах семейство не объявлено.
Ну а возможность объявления лишних переменных, да ещё таких, для которых необходимо раннее связывание, таким продвинутым программером (без всякой иронии), как krosav4ig, я просто не учёл... Прошу пардону...



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Пятница, 09.12.2016, 13:22
 
Ответить
СообщениеЧестно говоря, код не разбирал. Но если пользователь говорит, что
Вот на этой строчке споткнулся[vba]
Код
Dim dd As WinHttpRequest
[/vba]
То это однозначно говорит о том, что в референсах семейство не объявлено.
Ну а возможность объявления лишних переменных, да ещё таких, для которых необходимо раннее связывание, таким продвинутым программером (без всякой иронии), как krosav4ig, я просто не учёл... Прошу пардону...

Автор - Alex_ST
Дата добавления - 09.12.2016 в 13:21
krosav4ig Дата: Пятница, 09.12.2016, 16:49 | Сообщение № 24
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
Эт я просто забыл, каким методом логин/пароль задавать, вот и решил посмотреть (на всякий случай, вдруг в проксю упрется). В MSDN лезть лень, добавил референс, зачем-то %) обьявил переменную, полез в object explorer, поковырялся там, нашел SetCredentials, но не нашел никакой инфы про HTTPREQUEST_SETCREDENTIALS_FLAGS, все равно пришлось лезть в MSDN, референс отключил, а переменную затереть забыл :(


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
СообщениеЭт я просто забыл, каким методом логин/пароль задавать, вот и решил посмотреть (на всякий случай, вдруг в проксю упрется). В MSDN лезть лень, добавил референс, зачем-то %) обьявил переменную, полез в object explorer, поковырялся там, нашел SetCredentials, но не нашел никакой инфы про HTTPREQUEST_SETCREDENTIALS_FLAGS, все равно пришлось лезть в MSDN, референс отключил, а переменную затереть забыл :(

Автор - krosav4ig
Дата добавления - 09.12.2016 в 16:49
SergSK Дата: Вторник, 12.09.2017, 01:15 | Сообщение № 25
Группа: Пользователи
Ранг: Прохожий
Сообщений: 1
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Уважаемый Андрей,
долго гуглил необходимое решение и о! чудо, нашел ваш пост! )) Счастью было так рядом, но к сожалению код не работает из под х64. Спотыкается на строке "With CreateObject("scriptcontrol")" с ошибкой - Run-time error 429, ActiveX componentcan't create object.
Не подскажете что необходимо изменить в вашем коде?

(у меня win10 x64, Office 365)

Буду очень вам благодарен за ваш опыт и знания!
С уважением,
Сергей
 
Ответить
СообщениеУважаемый Андрей,
долго гуглил необходимое решение и о! чудо, нашел ваш пост! )) Счастью было так рядом, но к сожалению код не работает из под х64. Спотыкается на строке "With CreateObject("scriptcontrol")" с ошибкой - Run-time error 429, ActiveX componentcan't create object.
Не подскажете что необходимо изменить в вашем коде?

(у меня win10 x64, Office 365)

Буду очень вам благодарен за ваш опыт и знания!
С уважением,
Сергей

Автор - SergSK
Дата добавления - 12.09.2017 в 01:15
Udik Дата: Вторник, 12.09.2017, 15:53 | Сообщение № 26
Группа: Друзья
Ранг: Старожил
Сообщений: 1588
Репутация: 192 ±
Замечаний: 0% ±

Excel 2016 х 64
Не подскажете что необходимо изменить в вашем коде?

Скорее всего это связано с отсутствием необходимой dll в системе. Необходимой для scriptcontrol. Это уже обсуждалось на форуме, но сейчас ссылок не найду. В атаче сама dll-ка и тхт файл. Там можно посмотреть как регистрировать. Только ее надо в папку скопировать c:\Windows\System32\
К библиотеке экзешник идет, который регистрацию сам делает, но с ним размерчик большой выходит.
К сообщению приложен файл: script_control_.rar (40.1 Kb)


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com


Сообщение отредактировал Udik - Вторник, 12.09.2017, 15:57
 
Ответить
Сообщение
Не подскажете что необходимо изменить в вашем коде?

Скорее всего это связано с отсутствием необходимой dll в системе. Необходимой для scriptcontrol. Это уже обсуждалось на форуме, но сейчас ссылок не найду. В атаче сама dll-ка и тхт файл. Там можно посмотреть как регистрировать. Только ее надо в папку скопировать c:\Windows\System32\
К библиотеке экзешник идет, который регистрацию сам делает, но с ним размерчик большой выходит.

Автор - Udik
Дата добавления - 12.09.2017 в 15:53
Starbirst Дата: Пятница, 15.12.2017, 21:54 | Сообщение № 27
Группа: Пользователи
Ранг: Участник
Сообщений: 83
Репутация: 0 ±
Замечаний: 0% ±

Excel 2003
Подключите Яндексдиск с помощью программы NetDrive, все отлично работает, можно работать как с обычным диском, в отличие от сетевого. Учтите, что подключенный диск долго соображает при сохранении.


Сообщение отредактировал Starbirst - Пятница, 15.12.2017, 21:55
 
Ответить
СообщениеПодключите Яндексдиск с помощью программы NetDrive, все отлично работает, можно работать как с обычным диском, в отличие от сетевого. Учтите, что подключенный диск долго соображает при сохранении.

Автор - Starbirst
Дата добавления - 15.12.2017 в 21:54
vcomp71 Дата: Понедельник, 22.10.2018, 08:36 | Сообщение № 28
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 2 ±
Замечаний: 0% ±

Excel 2010
Подключите Яндексдиск с помощью программы NetDrive, все отлично работает, можно работать как с обычным диском, в отличие от сетевого. Учтите, что подключенный диск долго соображает при сохранении.

Зачем использовать платный инструмент???

[vba]
Код
Function WebDavDsk(lgn$, psw$, Optional fldr$) As String
Dim fso As Object, netDsk As Object, dskPath$, i&
Set netDsk = CreateObject("WScript.Network")
Set fso = CreateObject("Scripting.FileSystemObject")
  On Error Resume Next
  For i = 65 To 90
    dskPath = Chr(i) & ":"
    If Not fso.DriveExists(dskPath) Then
      netDsk.MapNetworkDrive dskPath, "https://webdav.yandex.ru:443/" & fldr, False, lgn, psw
      If Err.Number = 0 Then Exit For Else dskPath = "": Err.Clear
    End If
  Next
  On Error GoTo 0
WebDavDsk = dskPath
End Function

Sub NetDskOff(dskPath$)
Dim fso As Object, x, netDsk As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set netDsk = CreateObject("WScript.Network")
On Error Resume Next
For Each x In fso.Drives
  dskPath = x.Path: If fso.FolderExists(dskPath) Then netDsk.RemoveNetworkDrive dskPath, True, True: Exit For
Next
End Sub

Sub ПримерИспользования()
Dim БукваПодключаемогоДиска$
БукваПодключаемогоДиска = WebDavDsk("Логин", "Пароль", "Папка")
'vcomp71 написал: Загрузить файл, скачать, создать директорию, переименовать
'Здесь все это делаем что хотели

NetDskOff БукваПодключаемогоДиска 'Отключаем диск после работы

End Sub
[/vba]

Автор решения
https://www.planetaexcel.ru/forum....D=76600

https://www.planetaexcel.ru/forum....e912329


Если VBA написать русскими буквами, то получится МИФ.

Сообщение отредактировал vcomp71 - Понедельник, 22.10.2018, 08:43
 
Ответить
Сообщение
Подключите Яндексдиск с помощью программы NetDrive, все отлично работает, можно работать как с обычным диском, в отличие от сетевого. Учтите, что подключенный диск долго соображает при сохранении.

Зачем использовать платный инструмент???

[vba]
Код
Function WebDavDsk(lgn$, psw$, Optional fldr$) As String
Dim fso As Object, netDsk As Object, dskPath$, i&
Set netDsk = CreateObject("WScript.Network")
Set fso = CreateObject("Scripting.FileSystemObject")
  On Error Resume Next
  For i = 65 To 90
    dskPath = Chr(i) & ":"
    If Not fso.DriveExists(dskPath) Then
      netDsk.MapNetworkDrive dskPath, "https://webdav.yandex.ru:443/" & fldr, False, lgn, psw
      If Err.Number = 0 Then Exit For Else dskPath = "": Err.Clear
    End If
  Next
  On Error GoTo 0
WebDavDsk = dskPath
End Function

Sub NetDskOff(dskPath$)
Dim fso As Object, x, netDsk As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set netDsk = CreateObject("WScript.Network")
On Error Resume Next
For Each x In fso.Drives
  dskPath = x.Path: If fso.FolderExists(dskPath) Then netDsk.RemoveNetworkDrive dskPath, True, True: Exit For
Next
End Sub

Sub ПримерИспользования()
Dim БукваПодключаемогоДиска$
БукваПодключаемогоДиска = WebDavDsk("Логин", "Пароль", "Папка")
'vcomp71 написал: Загрузить файл, скачать, создать директорию, переименовать
'Здесь все это делаем что хотели

NetDskOff БукваПодключаемогоДиска 'Отключаем диск после работы

End Sub
[/vba]

Автор решения
https://www.planetaexcel.ru/forum....D=76600

https://www.planetaexcel.ru/forum....e912329

Автор - vcomp71
Дата добавления - 22.10.2018 в 08:36
vcomp71 Дата: Понедельник, 22.10.2018, 09:12 | Сообщение № 29
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 2 ±
Замечаний: 0% ±

Excel 2010
У меня совсем другой вопрос. Такой способ, с подключением сетевого диска, слишком много занимает времени.
Я попробовал запустить представленный код, сервер ответил
.StatusText = Conflict
Вот процедура попытки загрузить в коренную папку

[vba]
Код
Sub Пример()
UploadFile "c:\#work\777(minus).mp3", "777.mp3"

End Sub
[/vba]
1. Файл на локальном диске существует
2. Вручную загружается
3. На облачном диске такого файла нет.


Если VBA написать русскими буквами, то получится МИФ.
 
Ответить
СообщениеУ меня совсем другой вопрос. Такой способ, с подключением сетевого диска, слишком много занимает времени.
Я попробовал запустить представленный код, сервер ответил
.StatusText = Conflict
Вот процедура попытки загрузить в коренную папку

[vba]
Код
Sub Пример()
UploadFile "c:\#work\777(minus).mp3", "777.mp3"

End Sub
[/vba]
1. Файл на локальном диске существует
2. Вручную загружается
3. На облачном диске такого файла нет.

Автор - vcomp71
Дата добавления - 22.10.2018 в 09:12
Pelena Дата: Понедельник, 22.10.2018, 09:15 | Сообщение № 30
Группа: Админы
Ранг: Местный житель
Сообщений: 19182
Репутация: 4420 ±
Замечаний: ±

Excel 365 & Mac Excel
vcomp71, Вы смотрели решения из этой темы? Не подходят?


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
Сообщениеvcomp71, Вы смотрели решения из этой темы? Не подходят?

Автор - Pelena
Дата добавления - 22.10.2018 в 09:15
vcomp71 Дата: Понедельник, 22.10.2018, 10:00 | Сообщение № 31
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 2 ±
Замечаний: 0% ±

Excel 2010
vcomp71, Вы смотрели решения из этой темы? Не подходят?

Вот как раз решением из этой темы я и воспользовался. Что-то последнеен время я корявао формулирую. Конечно же код был взять из данной темы. Поэтому и пишу. Решение с подключением сетевого диска прекрасно работает, но это не совсем то.


Если VBA написать русскими буквами, то получится МИФ.
 
Ответить
Сообщение
vcomp71, Вы смотрели решения из этой темы? Не подходят?

Вот как раз решением из этой темы я и воспользовался. Что-то последнеен время я корявао формулирую. Конечно же код был взять из данной темы. Поэтому и пишу. Решение с подключением сетевого диска прекрасно работает, но это не совсем то.

Автор - vcomp71
Дата добавления - 22.10.2018 в 10:00
Pelena Дата: Понедельник, 22.10.2018, 10:52 | Сообщение № 32
Группа: Админы
Ранг: Местный житель
Сообщений: 19182
Репутация: 4420 ±
Замечаний: ±

Excel 365 & Mac Excel
Так что надо-то? Вопрос так и не прозвучал
Если
совсем другой вопрос
то надо создавать новую тему


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеТак что надо-то? Вопрос так и не прозвучал
Если
совсем другой вопрос
то надо создавать новую тему

Автор - Pelena
Дата добавления - 22.10.2018 в 10:52
vcomp71 Дата: Понедельник, 22.10.2018, 18:22 | Сообщение № 33
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 2 ±
Замечаний: 0% ±

Excel 2010
то надо создавать новую тему

В Сообщение № 27 Пользователь Starbirst предложил решение задачи сформилированное в названии как " Скачать (Сохранить) файл с Яндекс-диска макросом Excel (Макросы/Sub)"

Цитата
Подключите Яндексдиск с помощью программы NetDrive, все отлично работает, можно работать как с обычным диском, в отличие от сетевого. Учтите, что подключенный диск долго соображает при сохранении.


Данное решение задачи не отвечает нескольким условиям. В частности:
1) NetDrive - платная программа
2) Занимает системные ресурсы (одну из букв сетевых дисков)
3) Загрузка может происходить на несколько облачных дисвков в одной программе

В своем Сообщение № 28 я привел пример макроса, который подключает сетевой диск Yandex диска, а потом отключает, но данное решениеимеет один мнус -время коннекта к диску слишком большое.
Поэтому я воспользовался решением представленным в сообщении Сообщение № 18.

В качетве параметров

LocalFilePath$
RemotePath$

проиведнноой в Сообщение № 18 процедуры
UploadFile(LocalFilePath$, RemotePath$)

[vba]
Код
Public Sub UploadFile(LocalFilePath$, RemotePath$)
    Dim FileContents As Variant, FileName$
    FileName = StrReverse(Split(StrReverse(LocalFilePath), "\")(0))
    RemotePath = IIf(RemotePath <> "", RemotePath & "/", "")
    With CreateObject("ADODB.Stream")
        .Type = 1: .Open: .LoadFromFile LocalFilePath: FileContents = .Read: .Close
    End With
    With CreateObject("WinHttp.WinHttpRequest.5.1")
        .Open "PUT", urlencode(Host & RemotePath & FileName), False
        .SetRequestHeader "Host", "webdav.yandex.ru"
        .SetRequestHeader "Accept", "*/*"
        .SetRequestHeader "Etag", MD5(FileContents)
        .SetRequestHeader "Sha256", Sha256(FileContents)
        .SetRequestHeader "Expect", "100-continue"
        .SetRequestHeader "Content-Type", "application/binary"
        .SetRequestHeader "Authorization", "Basic " & Token
        .SetRequestHeader "Content-Length", UBound(FileContents) + 1
        .send FileContents
        .WaitForResponse
        Debug.Print "Файл "; IIf(.StatusText = "Created", "успешно загружен", "не загружен")
    End With
End Sub
[/vba]

Я взял следующие параметры
LocalFilePath$ = "c:\#work\777(minus).mp3"
RemotePath$ = "777.mp3"

Запустил пример, для закачивания фала в облако, преварительно изменив процедуру upload, чтобы выснить ответ, который дает сервер.
[vba]
Код

Public Sub UploadFile(LocalFilePath$, RemotePath$)
    Dim FileContents As Variant, FileName$
    FileName = StrReverse(Split(StrReverse(LocalFilePath), "\")(0))
    RemotePath = IIf(RemotePath <> "", RemotePath & "/", "")
    With CreateObject("ADODB.Stream")
        .Type = 1: .Open: .LoadFromFile LocalFilePath: FileContents = .Read: .Close
    End With
    With CreateObject("WinHttp.WinHttpRequest.5.1")
        .Open "PUT", urlencode(Host & RemotePath & FileName), False
        .setRequestHeader "Host", "webdav.yandex.ru"
        .setRequestHeader "Accept", "*/*"
        .setRequestHeader "Etag", MD5(FileContents)
        .setRequestHeader "Sha256", Sha256(FileContents)
        .setRequestHeader "Expect", "100-continue"
        .setRequestHeader "Content-Type", "application/binary"
        .setRequestHeader "Authorization", "Basic " & Token
        .setRequestHeader "Content-Length", UBound(FileContents) + 1
        .send FileContents
        .WaitForResponse
        Debug.Print .StatusText
    End With
End Sub
[/vba]

Debug.Print .StatusText - чтобы получить ответ сервера.
Ответ сервера .StatusText = "Conflict"

То есть используя код, приведенный в Сообщении 18, я получил отклик сервера о неком конфликте файлов (или конфликте имен файло), и загрузка файла в облако не произошла. Я задал вопрос:

Я попробовал запустить представленный код, сервер ответил
.StatusText = Conflict
Вот процедура попытки загрузить в коренную папку
[vba]
Код
Sub Пример()
UploadFile "c:\#work\777(minus).mp3", "777.mp3"

End Sub
[/vba]

Далее я написал исходные условия загрузки файла

1. Файл на локальном диске существует
2. Вручную загружается
3. На облачном диске такого файла нет.

Чтобы исключть, как мне кажется, возможные ошибки и ненужные рассуждения на темы:

1. "А у вас файл присуствовует на локальном диске по заданному пути?"
2. "А вы свой файл вручную загружать на яндекс диск пробовали и успешно?"
3. "А у вас такой файл уже есть в корневом каталоге обласного диска?"

Еще раз задаю вопрос: что может значить значение ответа сервера Яндекс Диска:

.StatusText = "Conflict"
и отрицательный результат работы процедуры по загрузке файла Upload из сообщения 18 (файл на облачный диск не закгружен).


Если VBA написать русскими буквами, то получится МИФ.

Сообщение отредактировал vcomp71 - Понедельник, 22.10.2018, 19:08
 
Ответить
Сообщение
то надо создавать новую тему

В Сообщение № 27 Пользователь Starbirst предложил решение задачи сформилированное в названии как " Скачать (Сохранить) файл с Яндекс-диска макросом Excel (Макросы/Sub)"

Цитата
Подключите Яндексдиск с помощью программы NetDrive, все отлично работает, можно работать как с обычным диском, в отличие от сетевого. Учтите, что подключенный диск долго соображает при сохранении.


Данное решение задачи не отвечает нескольким условиям. В частности:
1) NetDrive - платная программа
2) Занимает системные ресурсы (одну из букв сетевых дисков)
3) Загрузка может происходить на несколько облачных дисвков в одной программе

В своем Сообщение № 28 я привел пример макроса, который подключает сетевой диск Yandex диска, а потом отключает, но данное решениеимеет один мнус -время коннекта к диску слишком большое.
Поэтому я воспользовался решением представленным в сообщении Сообщение № 18.

В качетве параметров

LocalFilePath$
RemotePath$

проиведнноой в Сообщение № 18 процедуры
UploadFile(LocalFilePath$, RemotePath$)

[vba]
Код
Public Sub UploadFile(LocalFilePath$, RemotePath$)
    Dim FileContents As Variant, FileName$
    FileName = StrReverse(Split(StrReverse(LocalFilePath), "\")(0))
    RemotePath = IIf(RemotePath <> "", RemotePath & "/", "")
    With CreateObject("ADODB.Stream")
        .Type = 1: .Open: .LoadFromFile LocalFilePath: FileContents = .Read: .Close
    End With
    With CreateObject("WinHttp.WinHttpRequest.5.1")
        .Open "PUT", urlencode(Host & RemotePath & FileName), False
        .SetRequestHeader "Host", "webdav.yandex.ru"
        .SetRequestHeader "Accept", "*/*"
        .SetRequestHeader "Etag", MD5(FileContents)
        .SetRequestHeader "Sha256", Sha256(FileContents)
        .SetRequestHeader "Expect", "100-continue"
        .SetRequestHeader "Content-Type", "application/binary"
        .SetRequestHeader "Authorization", "Basic " & Token
        .SetRequestHeader "Content-Length", UBound(FileContents) + 1
        .send FileContents
        .WaitForResponse
        Debug.Print "Файл "; IIf(.StatusText = "Created", "успешно загружен", "не загружен")
    End With
End Sub
[/vba]

Я взял следующие параметры
LocalFilePath$ = "c:\#work\777(minus).mp3"
RemotePath$ = "777.mp3"

Запустил пример, для закачивания фала в облако, преварительно изменив процедуру upload, чтобы выснить ответ, который дает сервер.
[vba]
Код

Public Sub UploadFile(LocalFilePath$, RemotePath$)
    Dim FileContents As Variant, FileName$
    FileName = StrReverse(Split(StrReverse(LocalFilePath), "\")(0))
    RemotePath = IIf(RemotePath <> "", RemotePath & "/", "")
    With CreateObject("ADODB.Stream")
        .Type = 1: .Open: .LoadFromFile LocalFilePath: FileContents = .Read: .Close
    End With
    With CreateObject("WinHttp.WinHttpRequest.5.1")
        .Open "PUT", urlencode(Host & RemotePath & FileName), False
        .setRequestHeader "Host", "webdav.yandex.ru"
        .setRequestHeader "Accept", "*/*"
        .setRequestHeader "Etag", MD5(FileContents)
        .setRequestHeader "Sha256", Sha256(FileContents)
        .setRequestHeader "Expect", "100-continue"
        .setRequestHeader "Content-Type", "application/binary"
        .setRequestHeader "Authorization", "Basic " & Token
        .setRequestHeader "Content-Length", UBound(FileContents) + 1
        .send FileContents
        .WaitForResponse
        Debug.Print .StatusText
    End With
End Sub
[/vba]

Debug.Print .StatusText - чтобы получить ответ сервера.
Ответ сервера .StatusText = "Conflict"

То есть используя код, приведенный в Сообщении 18, я получил отклик сервера о неком конфликте файлов (или конфликте имен файло), и загрузка файла в облако не произошла. Я задал вопрос:

Я попробовал запустить представленный код, сервер ответил
.StatusText = Conflict
Вот процедура попытки загрузить в коренную папку
[vba]
Код
Sub Пример()
UploadFile "c:\#work\777(minus).mp3", "777.mp3"

End Sub
[/vba]

Далее я написал исходные условия загрузки файла

1. Файл на локальном диске существует
2. Вручную загружается
3. На облачном диске такого файла нет.

Чтобы исключть, как мне кажется, возможные ошибки и ненужные рассуждения на темы:

1. "А у вас файл присуствовует на локальном диске по заданному пути?"
2. "А вы свой файл вручную загружать на яндекс диск пробовали и успешно?"
3. "А у вас такой файл уже есть в корневом каталоге обласного диска?"

Еще раз задаю вопрос: что может значить значение ответа сервера Яндекс Диска:

.StatusText = "Conflict"
и отрицательный результат работы процедуры по загрузке файла Upload из сообщения 18 (файл на облачный диск не закгружен).

Автор - vcomp71
Дата добавления - 22.10.2018 в 18:22
krosav4ig Дата: Понедельник, 29.10.2018, 21:35 | Сообщение № 34
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
А вы уверены, что в параметр RemotePath нужно сувать имя файла?
изменение имени файла реализовано не было, RemotePath предназначен для указания пути к папке в ЯДиске

что может значить значение ответа сервера Яндекс Диска:

.StatusText = "Conflict"
Видимо, то, что нет там папки с именем 777.mp3

[vba]
Код
Private Const Login$ = "логин", Pwd$ = "пароль""
Private Const Host$ = "https://webdav.yandex.ru:443/"
Public Function DownloadFile(RemoteFilePath$, SaveTo)
    Dim FileContents() As Byte, LocalFilePath$
    SaveTo = IIf(Right(SaveTo, 1) = "\", SaveTo, SaveTo & "\")
    With CreateObject("WinHttp.WinHttpRequest.5.1")
        .Open "GET", urlencode(Host & RemoteFilePath$), True
        .SetRequestHeader "Host", "webdav.yandex.ru"
        .SetRequestHeader "Accept", "*/*"
        .SetRequestHeader "Authorization", "Basic " & Token
        .send
        .WaitForResponse
        FileContents = .responseBody
    End With
    LocalFilePath = SaveTo & StrReverse(Split(StrReverse(RemoteFilePath), "/")(0))
    If Dir(LocalFilePath) <> "" Then Kill LocalFilePath
    Open LocalFilePath For Binary Access Write As #1
    Put #1, 1, FileContents
    Close #1
    DownloadFile = LocalFilePath
End Function
Public Sub UploadFile(LocalFilePath$, Optional RemotePath$ = "/", Optional RemoteFilename$ = "")
    Dim FileContents As Variant, FileName$
    RemotePath = RemotePath & IIf(Right(RemotePath, 1) = "/", "", "/")
    RemoteFilename = IIf(Len(RemoteFilename), RemoteFilename, StrReverse(Split(StrReverse(LocalFilePath), "\")(0)))
    With CreateObject("ADODB.Stream")
        .Type = 1: .Open: .LoadFromFile LocalFilePath: FileContents = .Read: .Close
    End With
    With CreateObject("WinHttp.WinHttpRequest.5.1")
        .Open "PUT", urlencode(Host & RemotePath & RemoteFilename), False
        .SetRequestHeader "Host", "webdav.yandex.ru"
        .SetRequestHeader "Accept", "*/*"
        .SetRequestHeader "Etag", MD5(FileContents)
        .SetRequestHeader "Sha256", Sha256(FileContents)
        .SetRequestHeader "Expect", "100-continue"
        .SetRequestHeader "Content-Type", "application/binary"
        .SetRequestHeader "Authorization", "Basic " & Token
        .SetRequestHeader "Content-Length", UBound(FileContents) + 1
        .send FileContents
        .WaitForResponse
        Debug.Print .statustext
        Debug.Print "Файл "; IIf(.statustext = "Created", "успешно загружен", "не загружен")
    End With
End Sub
Private Function Str2Byte(str$) As Byte()
    Str2Byte = StrConv(str, vbFromUnicode)
End Function
Private Function urlencode$(url$)
    With CreateObject("scriptcontrol")
        .Language = "JavaScript"
        urlencode = .eval("encodeURI('" & url & "')")
    End With
End Function
Private Function MD5(ByVal bytes) As String
    Dim sTmp$, i%, byteArr() As Byte
    byteArr = bytes
    With CreateObject("System.Security.Cryptography.MD5CryptoServiceProvider")
        byteArr = .ComputeHash_2(byteArr)
    End With
    For i = 0 To UBound(byteArr)
        sTmp = sTmp & LCase(Right("0" & Hex(byteArr(i)), 2))
    Next
    MD5 = sTmp
End Function
Private Function Sha256(ByVal bytes) As String
    Dim sTmp$, i%, byteArr() As Byte
    byteArr = bytes
    With CreateObject("System.Security.Cryptography.SHA256Managed")
        byteArr = .ComputeHash_2(byteArr)
    End With
    For i = 0 To UBound(byteArr)
        sTmp = sTmp & LCase(Right("0" & Hex(byteArr(i)), 2))
    Next
    Sha256 = sTmp
End Function
Private Function Token()
    With CreateObject("MSXML2.DOMDocument").createElement("b64")
        .DataType = "bin.base64"
        .nodeTypedValue = Str2Byte(Login & ":" & Pwd): Token = .Text
    End With
End Function
[/vba]


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
СообщениеА вы уверены, что в параметр RemotePath нужно сувать имя файла?
изменение имени файла реализовано не было, RemotePath предназначен для указания пути к папке в ЯДиске

что может значить значение ответа сервера Яндекс Диска:

.StatusText = "Conflict"
Видимо, то, что нет там папки с именем 777.mp3

[vba]
Код
Private Const Login$ = "логин", Pwd$ = "пароль""
Private Const Host$ = "https://webdav.yandex.ru:443/"
Public Function DownloadFile(RemoteFilePath$, SaveTo)
    Dim FileContents() As Byte, LocalFilePath$
    SaveTo = IIf(Right(SaveTo, 1) = "\", SaveTo, SaveTo & "\")
    With CreateObject("WinHttp.WinHttpRequest.5.1")
        .Open "GET", urlencode(Host & RemoteFilePath$), True
        .SetRequestHeader "Host", "webdav.yandex.ru"
        .SetRequestHeader "Accept", "*/*"
        .SetRequestHeader "Authorization", "Basic " & Token
        .send
        .WaitForResponse
        FileContents = .responseBody
    End With
    LocalFilePath = SaveTo & StrReverse(Split(StrReverse(RemoteFilePath), "/")(0))
    If Dir(LocalFilePath) <> "" Then Kill LocalFilePath
    Open LocalFilePath For Binary Access Write As #1
    Put #1, 1, FileContents
    Close #1
    DownloadFile = LocalFilePath
End Function
Public Sub UploadFile(LocalFilePath$, Optional RemotePath$ = "/", Optional RemoteFilename$ = "")
    Dim FileContents As Variant, FileName$
    RemotePath = RemotePath & IIf(Right(RemotePath, 1) = "/", "", "/")
    RemoteFilename = IIf(Len(RemoteFilename), RemoteFilename, StrReverse(Split(StrReverse(LocalFilePath), "\")(0)))
    With CreateObject("ADODB.Stream")
        .Type = 1: .Open: .LoadFromFile LocalFilePath: FileContents = .Read: .Close
    End With
    With CreateObject("WinHttp.WinHttpRequest.5.1")
        .Open "PUT", urlencode(Host & RemotePath & RemoteFilename), False
        .SetRequestHeader "Host", "webdav.yandex.ru"
        .SetRequestHeader "Accept", "*/*"
        .SetRequestHeader "Etag", MD5(FileContents)
        .SetRequestHeader "Sha256", Sha256(FileContents)
        .SetRequestHeader "Expect", "100-continue"
        .SetRequestHeader "Content-Type", "application/binary"
        .SetRequestHeader "Authorization", "Basic " & Token
        .SetRequestHeader "Content-Length", UBound(FileContents) + 1
        .send FileContents
        .WaitForResponse
        Debug.Print .statustext
        Debug.Print "Файл "; IIf(.statustext = "Created", "успешно загружен", "не загружен")
    End With
End Sub
Private Function Str2Byte(str$) As Byte()
    Str2Byte = StrConv(str, vbFromUnicode)
End Function
Private Function urlencode$(url$)
    With CreateObject("scriptcontrol")
        .Language = "JavaScript"
        urlencode = .eval("encodeURI('" & url & "')")
    End With
End Function
Private Function MD5(ByVal bytes) As String
    Dim sTmp$, i%, byteArr() As Byte
    byteArr = bytes
    With CreateObject("System.Security.Cryptography.MD5CryptoServiceProvider")
        byteArr = .ComputeHash_2(byteArr)
    End With
    For i = 0 To UBound(byteArr)
        sTmp = sTmp & LCase(Right("0" & Hex(byteArr(i)), 2))
    Next
    MD5 = sTmp
End Function
Private Function Sha256(ByVal bytes) As String
    Dim sTmp$, i%, byteArr() As Byte
    byteArr = bytes
    With CreateObject("System.Security.Cryptography.SHA256Managed")
        byteArr = .ComputeHash_2(byteArr)
    End With
    For i = 0 To UBound(byteArr)
        sTmp = sTmp & LCase(Right("0" & Hex(byteArr(i)), 2))
    Next
    Sha256 = sTmp
End Function
Private Function Token()
    With CreateObject("MSXML2.DOMDocument").createElement("b64")
        .DataType = "bin.base64"
        .nodeTypedValue = Str2Byte(Login & ":" & Pwd): Token = .Text
    End With
End Function
[/vba]

Автор - krosav4ig
Дата добавления - 29.10.2018 в 21:35
serjufa Дата: Понедельник, 06.05.2019, 08:30 | Сообщение № 35
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
здравствуйте, помогите решить такую задачу:
есть несколько яндекс-дисков. нужно обратиться к каждому, определить суммарный размер (занято/свободно) и получить названия папок первого уровня.

Как это можно сделать через vba?
 
Ответить
Сообщениездравствуйте, помогите решить такую задачу:
есть несколько яндекс-дисков. нужно обратиться к каждому, определить суммарный размер (занято/свободно) и получить названия папок первого уровня.

Как это можно сделать через vba?

Автор - serjufa
Дата добавления - 06.05.2019 в 08:30
китин Дата: Понедельник, 06.05.2019, 09:14 | Сообщение № 36
Группа: Модераторы
Ранг: Экселист
Сообщений: 7015
Репутация: 1073 ±
Замечаний: 0% ±

Excel 2007;2010;2016
serjufa, Создайте свою тему, согласно п 4 Правил форума. Эта тема закрыта


Не судите очень строго:я пытаюсь научиться
ЯД 41001877306852
 
Ответить
Сообщениеserjufa, Создайте свою тему, согласно п 4 Правил форума. Эта тема закрыта

Автор - китин
Дата добавления - 06.05.2019 в 09:14
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Скачать (Сохранить) файл с Яндекс-диска макросом Excel (Макросы/Sub)
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!