Sub Нарисовать() Dim o1 As Shape, o2 As Shape Set o1 = ActiveSheet.Shapes([E3]) Set o2 = ActiveSheet.Shapes([E6]) Dim x1!, y1!, r1!, x2!, y2!, r2!, xa!, ya!, xb!, yb! GetParam o1, x1, y1, r1 GetParam o2, x2, y2, r2 Dim i&, j&, p#, l!, lmin! Dim x1t!, y1t!, x2t!, y2t!, bc&, ec& p = Atn(1) lmin = [a65536].Top - [a1].Top For i = 0 To 7 x1t = x1 + Cos(p * i) * r1 y1t = y1 - Sin(p * i) * r1 For j = 0 To 7 x2t = x2 + Cos(p * j) * r2 y2t = y2 - Sin(p * j) * r2 l = Sqr((x1t - x2t) ^ 2 + (y1t - y2t) ^ 2) If l < lmin Then lmin = l xa = x1t ya = y1t xb = x2t yb = y2t bc = i ec = j End If Next Next With ActiveSheet.Shapes.AddConnector(msoConnectorStraight, xa, ya, xb, yb) .ConnectorFormat.BeginConnect o1, (bc + 6) Mod 8 + 1 .ConnectorFormat.EndConnect o2, (ec + 6) Mod 8 + 1 .Name = [E3] & "|" & [E6] End With End Sub
Sub Удалить() On Error Resume Next ActiveSheet.Shapes([E3] & "|" & [E6]).Delete If Err = 0 Then Exit Sub Dim o1 As Shape, o2 As Shape, o3 As Shape, o4 As Shape Set o1 = ActiveSheet.Shapes([E3]) Set o2 = ActiveSheet.Shapes([E6]) For Each sh In ActiveSheet.Shapes If sh.Connector Then With sh.ConnectorFormat Set o3 = .BeginConnectedShape Set o4 = .EndConnectedShape If o1 Is o3 And o2 Is o4 Or o1 Is o4 And o2 Is o3 Then sh.Delete Exit For End If End With End If Next End Sub
[/vba]
Здравствуйте. Как-то так [vba]
Код
Sub Нарисовать() Dim o1 As Shape, o2 As Shape Set o1 = ActiveSheet.Shapes([E3]) Set o2 = ActiveSheet.Shapes([E6]) Dim x1!, y1!, r1!, x2!, y2!, r2!, xa!, ya!, xb!, yb! GetParam o1, x1, y1, r1 GetParam o2, x2, y2, r2 Dim i&, j&, p#, l!, lmin! Dim x1t!, y1t!, x2t!, y2t!, bc&, ec& p = Atn(1) lmin = [a65536].Top - [a1].Top For i = 0 To 7 x1t = x1 + Cos(p * i) * r1 y1t = y1 - Sin(p * i) * r1 For j = 0 To 7 x2t = x2 + Cos(p * j) * r2 y2t = y2 - Sin(p * j) * r2 l = Sqr((x1t - x2t) ^ 2 + (y1t - y2t) ^ 2) If l < lmin Then lmin = l xa = x1t ya = y1t xb = x2t yb = y2t bc = i ec = j End If Next Next With ActiveSheet.Shapes.AddConnector(msoConnectorStraight, xa, ya, xb, yb) .ConnectorFormat.BeginConnect o1, (bc + 6) Mod 8 + 1 .ConnectorFormat.EndConnect o2, (ec + 6) Mod 8 + 1 .Name = [E3] & "|" & [E6] End With End Sub
Sub Удалить() On Error Resume Next ActiveSheet.Shapes([E3] & "|" & [E6]).Delete If Err = 0 Then Exit Sub Dim o1 As Shape, o2 As Shape, o3 As Shape, o4 As Shape Set o1 = ActiveSheet.Shapes([E3]) Set o2 = ActiveSheet.Shapes([E6]) For Each sh In ActiveSheet.Shapes If sh.Connector Then With sh.ConnectorFormat Set o3 = .BeginConnectedShape Set o4 = .EndConnectedShape If o1 Is o3 And o2 Is o4 Or o1 Is o4 And o2 Is o3 Then sh.Delete Exit For End If End With End If Next End Sub
VladimirSK777, дело в том, что по умолчанию при вставке ссылки второй аргумент функции ГИПЕРССЫЛКА() заключается в кавычки, и, хоть там и написано число, на выходе получается текст
VladimirSK777, дело в том, что по умолчанию при вставке ссылки второй аргумент функции ГИПЕРССЫЛКА() заключается в кавычки, и, хоть там и написано число, на выходе получается текстkrosav4ig
Scripting.Folder или просто Folder в Object browser можно проверить, при подключенном референсе Microsoft Scripting Runtime выбираем библиотеку Scripting, в поле поиска пишем getfolder и жмакаем Enter
в референсах случаем нету ничего с пометкой MISSING: ? у мну так без ошибок отрабатывает[vba]
Код
Function FilenamesCollection(ByVal FolderPath As String, Optional ByVal Mask As String = "", _ Optional ByVal SearchDeep As Long = 999) As Collection ' Получает в качестве параметра путь к папке FolderPath, ' маску имени искомых файлов Mask (будут отобраны только файлы с такой маской/расширением) ' и глубину поиска SearchDeep в подпапках (если SearchDeep=1, то подпапки не просматриваются). ' Возвращает коллекцию, содержащую полные пути найденных файлов ' (применяется рекурсивный вызов процедуры GetAllFileNamesUsingFSO)
Set FilenamesCollection = New Collection ' создаём пустую коллекцию Dim FSO As New FileSystemObject ' создаём экземпляр FileSystemObject GetAllFileNamesUsingFSO FolderPath, Mask, FSO, FilenamesCollection, SearchDeep ' поиск Set FSO = Nothing: Application.StatusBar = False ' очистка строки состояния Excel End Function
Function GetAllFileNamesUsingFSO(ByVal FolderPath As String, ByVal Mask As String, ByRef FSO As FileSystemObject, _ ByRef FileNamesColl As Collection, ByVal SearchDeep As Long) ' перебирает все файлы и подпапки в папке FolderPath, используя объект FSO ' перебор папок осуществляется в том случае, если SearchDeep > 1 ' добавляет пути найденных файлов в коллекцию FileNamesColl Dim curfold As Folder, sfol As Folder, fil As File Set curfold = FSO.GetFolder(FolderPath) If Not curfold Is Nothing Then ' если удалось получить доступ к папке
' раскомментируйте эту строку для вывода пути к просматриваемой ' в текущий момент папке в строку состояния Excel Application.StatusBar = "Поиск в папке: " & FolderPath
For Each fil In curfold.Files ' перебираем все файлы в папке FolderPath If fil.Name Like "*" & Mask Then FileNamesColl.Add fil.Path Next SearchDeep = SearchDeep - 1 ' уменьшаем глубину поиска в подпапках If SearchDeep Then ' если надо искать глубже For Each sfol In curfold.SubFolders ' ' перебираем все подпапки в папке FolderPath GetAllFileNamesUsingFSO sfol.Path, Mask, FSO, FileNamesColl, SearchDeep Next End If Set fil = Nothing: Set curfold = Nothing ' очищаем переменные End If
[/vba]
Scripting.Folder или просто Folder в Object browser можно проверить, при подключенном референсе Microsoft Scripting Runtime выбираем библиотеку Scripting, в поле поиска пишем getfolder и жмакаем Enter
в референсах случаем нету ничего с пометкой MISSING: ? у мну так без ошибок отрабатывает[vba]
Код
Function FilenamesCollection(ByVal FolderPath As String, Optional ByVal Mask As String = "", _ Optional ByVal SearchDeep As Long = 999) As Collection ' Получает в качестве параметра путь к папке FolderPath, ' маску имени искомых файлов Mask (будут отобраны только файлы с такой маской/расширением) ' и глубину поиска SearchDeep в подпапках (если SearchDeep=1, то подпапки не просматриваются). ' Возвращает коллекцию, содержащую полные пути найденных файлов ' (применяется рекурсивный вызов процедуры GetAllFileNamesUsingFSO)
Set FilenamesCollection = New Collection ' создаём пустую коллекцию Dim FSO As New FileSystemObject ' создаём экземпляр FileSystemObject GetAllFileNamesUsingFSO FolderPath, Mask, FSO, FilenamesCollection, SearchDeep ' поиск Set FSO = Nothing: Application.StatusBar = False ' очистка строки состояния Excel End Function
Function GetAllFileNamesUsingFSO(ByVal FolderPath As String, ByVal Mask As String, ByRef FSO As FileSystemObject, _ ByRef FileNamesColl As Collection, ByVal SearchDeep As Long) ' перебирает все файлы и подпапки в папке FolderPath, используя объект FSO ' перебор папок осуществляется в том случае, если SearchDeep > 1 ' добавляет пути найденных файлов в коллекцию FileNamesColl Dim curfold As Folder, sfol As Folder, fil As File Set curfold = FSO.GetFolder(FolderPath) If Not curfold Is Nothing Then ' если удалось получить доступ к папке
' раскомментируйте эту строку для вывода пути к просматриваемой ' в текущий момент папке в строку состояния Excel Application.StatusBar = "Поиск в папке: " & FolderPath
For Each fil In curfold.Files ' перебираем все файлы в папке FolderPath If fil.Name Like "*" & Mask Then FileNamesColl.Add fil.Path Next SearchDeep = SearchDeep - 1 ' уменьшаем глубину поиска в подпапках If SearchDeep Then ' если надо искать глубже For Each sfol In curfold.SubFolders ' ' перебираем все подпапки в папке FolderPath GetAllFileNamesUsingFSO sfol.Path, Mask, FSO, FileNamesColl, SearchDeep Next End If Set fil = Nothing: Set curfold = Nothing ' очищаем переменные End If
А вы уверены, что в параметр 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]
А вы уверены, что в параметр 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
Function ОбъединитьСРазделителем(Разделитель As String, ParamArray Значения()) As String Dim result As String, arg, arr As Variant, rc As Variant For Each arg In Значения Select Case TypeName(arg) Case "Range" 'это диапазон arr = IIf(arg.Count > 1, arg.Value, Array(arg.Value)) Case "Variant()" 'это массив arr = arg Case Else arr = Array(arg) End Select 'цикл по всем значениям массива For Each rc In arr If Not IsEmpty(rc) And rc <> "" Then result = result & IIf(result <> "", Разделитель, "") & rc End If Next rc, arg ОбъединитьСРазделителем = result End Function
[/vba]
Здравствуйте [vba]
Код
Function ОбъединитьСРазделителем(Разделитель As String, ParamArray Значения()) As String Dim result As String, arg, arr As Variant, rc As Variant For Each arg In Значения Select Case TypeName(arg) Case "Range" 'это диапазон arr = IIf(arg.Count > 1, arg.Value, Array(arg.Value)) Case "Variant()" 'это массив arr = arg Case Else arr = Array(arg) End Select 'цикл по всем значениям массива For Each rc In arr If Not IsEmpty(rc) And rc <> "" Then result = result & IIf(result <> "", Разделитель, "") & rc End If Next rc, arg ОбъединитьСРазделителем = result End Function