слепил из того, что было остается придумать откуда и по какому триггеру запускать AddReference [vba]
Код
Option Explicit Private Declare Function GetClassName& Lib "user32" Alias "GetClassNameA" (ByVal hwnd&, ByVal lpClassName$, ByVal nMaxCount&) Private Declare Function AccessibleObjectFromWindow& Lib "oleacc" (ByVal hwnd&, ByVal dwId&, riid As GUID, xlWB As Object) Private Declare Function GetDesktopWindow& Lib "user32" () Private Declare Function GetWindow& Lib "user32" (ByVal hwnd&, ByVal wCmd&) Private Const GW_HWNDNEXT = 2 Private Const GW_CHILD = 5 Private Const OBJID_NATIVEOM = &HFFFFFFF0 Private Type GUID lData1 As Long iData2 As Integer iData3 As Integer aBData4(0 To 7) As Byte End Type Private IDispatch As GUID, oWnd As Window Public Sub AddReference() Dim i& With IDispatch .lData1 = &H20400: .iData2 = &H0: .iData3 = &H0 .aBData4(0) = &HC0: .aBData4(1) = &H0: .aBData4(2) = &H0 .aBData4(3) = &H0: .aBData4(4) = &H0: .aBData4(5) = &H0 .aBData4(6) = &H0: .aBData4(7) = &H46 End With Referece2AllWorkbooks 0, "EXCEL7", 0, 0, 0, Application.UserLibraryPath & "MyFunction.xla" Set oWnd = Nothing End Sub Private Function Referece2AllWorkbooks&(hWndStart&, ClassName$, level&, lHolder&, lCnt&, sFile$) Dim hwnd&, sWindowTitle$, sClassName$, wb as Workbook If level = 0 Then If hWndStart = 0 Then hWndStart = GetDesktopWindow() End If End If
'Get first child window '---------------------- hwnd = GetWindow(hWndStart, GW_CHILD)
Do While hwnd > 0 'Search children by recursion '---------------------------- lHolder = Referece2AllWorkbooks(hwnd, ClassName, level, lHolder, lCnt, sFile)
'get the class name '------------------ sClassName = Space$(255) r = GetClassName(hwnd, sClassName, 255) sClassName = Left$(sClassName, r)
If sClassName Like ClassName & "*" Or sClassName = ClassName Then Referece2AllWorkbooks = hwnd lHolder = hwnd AccessibleObjectFromWindow hwnd, OBJID_NATIVEOM, IDispatch, oWnd If Not oWnd Is Nothing Then If oWnd.Visible Then lCnt = lCnt + 1 On Error Resume Next For Each wb In oWnd.Application.Workbooks wb.VBProject.References.AddFromFile sFile Next End If End If End If
слепил из того, что было остается придумать откуда и по какому триггеру запускать AddReference [vba]
Код
Option Explicit Private Declare Function GetClassName& Lib "user32" Alias "GetClassNameA" (ByVal hwnd&, ByVal lpClassName$, ByVal nMaxCount&) Private Declare Function AccessibleObjectFromWindow& Lib "oleacc" (ByVal hwnd&, ByVal dwId&, riid As GUID, xlWB As Object) Private Declare Function GetDesktopWindow& Lib "user32" () Private Declare Function GetWindow& Lib "user32" (ByVal hwnd&, ByVal wCmd&) Private Const GW_HWNDNEXT = 2 Private Const GW_CHILD = 5 Private Const OBJID_NATIVEOM = &HFFFFFFF0 Private Type GUID lData1 As Long iData2 As Integer iData3 As Integer aBData4(0 To 7) As Byte End Type Private IDispatch As GUID, oWnd As Window Public Sub AddReference() Dim i& With IDispatch .lData1 = &H20400: .iData2 = &H0: .iData3 = &H0 .aBData4(0) = &HC0: .aBData4(1) = &H0: .aBData4(2) = &H0 .aBData4(3) = &H0: .aBData4(4) = &H0: .aBData4(5) = &H0 .aBData4(6) = &H0: .aBData4(7) = &H46 End With Referece2AllWorkbooks 0, "EXCEL7", 0, 0, 0, Application.UserLibraryPath & "MyFunction.xla" Set oWnd = Nothing End Sub Private Function Referece2AllWorkbooks&(hWndStart&, ClassName$, level&, lHolder&, lCnt&, sFile$) Dim hwnd&, sWindowTitle$, sClassName$, wb as Workbook If level = 0 Then If hWndStart = 0 Then hWndStart = GetDesktopWindow() End If End If
'Get first child window '---------------------- hwnd = GetWindow(hWndStart, GW_CHILD)
Do While hwnd > 0 'Search children by recursion '---------------------------- lHolder = Referece2AllWorkbooks(hwnd, ClassName, level, lHolder, lCnt, sFile)
'get the class name '------------------ sClassName = Space$(255) r = GetClassName(hwnd, sClassName, 255) sClassName = Left$(sClassName, r)
If sClassName Like ClassName & "*" Or sClassName = ClassName Then Referece2AllWorkbooks = hwnd lHolder = hwnd AccessibleObjectFromWindow hwnd, OBJID_NATIVEOM, IDispatch, oWnd If Not oWnd Is Nothing Then If oWnd.Visible Then lCnt = lCnt + 1 On Error Resume Next For Each wb In oWnd.Application.Workbooks wb.VBProject.References.AddFromFile sFile Next End If End If End If
Sub d() Dim start&, count& start = 3: count = 5 Dim rng As Range With ActiveDocument.Shapes(1).TextFrame.TextRange Set rng = .Characters(start) rng.End = .Characters(start + count).End rng.Select End With End Sub
[/vba]
Здравствуйте. Как-то так можно [vba]
Код
Sub d() Dim start&, count& start = 3: count = 5 Dim rng As Range With ActiveDocument.Shapes(1).TextFrame.TextRange Set rng = .Characters(start) rng.End = .Characters(start + count).End rng.Select End With End Sub
а если через Object Browser? в VBE жмем F2, в поле поиска пишем TextRange, жмем Enter, выбираем строку из результатов поиска, соответствующую классу предка (столбец Class, в нашем случае TextFrame) Видим внизу
Цитата
Property TextRange AsRange read-only Member ofWord.TextFrame
=> объект TextRange это экземпляр класса Range тыкаем внизу по зелененькому Range, выбираем справа (Members of 'Range') Characters Видим внизу
Цитата
Property Characters AsCharacters read-only Member ofWord.Range
тыкаем внизу по зелененькому Characters, выбираем справа (Members of 'Characters') Item Видим внизу
Цитата
Function Item(Index As Long) AsRange Default member ofWord.Characters
Обращаем внимание на
Цитата
Default
=> Characters(i) = Characters.Item(i) и на класс возвращаемого объекта
Цитата
AsRange
=> Characters(i) это экземпляр класса Range
а если через Object Browser? в VBE жмем F2, в поле поиска пишем TextRange, жмем Enter, выбираем строку из результатов поиска, соответствующую классу предка (столбец Class, в нашем случае TextFrame) Видим внизу
Цитата
Property TextRange AsRange read-only Member ofWord.TextFrame
=> объект TextRange это экземпляр класса Range тыкаем внизу по зелененькому Range, выбираем справа (Members of 'Range') Characters Видим внизу
Цитата
Property Characters AsCharacters read-only Member ofWord.Range
тыкаем внизу по зелененькому Characters, выбираем справа (Members of 'Characters') Item Видим внизу
Цитата
Function Item(Index As Long) AsRange Default member ofWord.Characters
Обращаем внимание на
Цитата
Default
=> Characters(i) = Characters.Item(i) и на класс возвращаемого объекта
Цитата
AsRange
=> Characters(i) это экземпляр класса Rangekrosav4ig
Нарисовал функции для скачивания/выгрузки на ЯДиск скачивание проходит нормально, а вот с выгрузкой чего-то не так. В корень вообще не загружает, в папки грузит мягко говоря, через раз, может чего лишнего понаписал или не те объекты использовал [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("MSXML2.XMLHTTP") .Open "get", urlencode(Host & RemoteFilePath), False, Login, Pwd .setrequestheader "Host", "webdav.yandex.ru" .setrequestheader "Accept", "*/*" .setrequestheader "Authorization", "Basic " & Token .send 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$, 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("MSXML2.XMLHTTP") .Open "put", urlencode(Host & RemotePath & FileName), False, Login, Pwd .setrequestheader "Host", "webdav.yandex.ru" .setrequestheader "Accept", "*/*" .setrequestheader "Transfer-Encoding", "chunked" .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 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): Token = .Text & ":" .nodeTypedValue = Str2Byte(Pwd): Token = Token & .Text End With End Function
Sub test() 'открываем файл из папки 111 в ЯДиске Workbooks.Open DownloadFile("123/1.xlsm", "D:\") 'открываем файл из корня ЯДиска Workbooks.Open DownloadFile("123.xlsx", Environ("tmp")) 'выгружаем файл в папку 123 в ЯДиске UploadFile "D:\0.xlsm", "123" 'выгружаем файл в корень в ЯДиска не грузит UploadFile "D:\0.xlsm", "" End Sub
[/vba]
Нарисовал функции для скачивания/выгрузки на ЯДиск скачивание проходит нормально, а вот с выгрузкой чего-то не так. В корень вообще не загружает, в папки грузит мягко говоря, через раз, может чего лишнего понаписал или не те объекты использовал [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("MSXML2.XMLHTTP") .Open "get", urlencode(Host & RemoteFilePath), False, Login, Pwd .setrequestheader "Host", "webdav.yandex.ru" .setrequestheader "Accept", "*/*" .setrequestheader "Authorization", "Basic " & Token .send 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$, 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("MSXML2.XMLHTTP") .Open "put", urlencode(Host & RemotePath & FileName), False, Login, Pwd .setrequestheader "Host", "webdav.yandex.ru" .setrequestheader "Accept", "*/*" .setrequestheader "Transfer-Encoding", "chunked" .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 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): Token = .Text & ":" .nodeTypedValue = Str2Byte(Pwd): Token = Token & .Text End With End Function
Sub test() 'открываем файл из папки 111 в ЯДиске Workbooks.Open DownloadFile("123/1.xlsm", "D:\") 'открываем файл из корня ЯДиска Workbooks.Open DownloadFile("123.xlsx", Environ("tmp")) 'выгружаем файл в папку 123 в ЯДиске UploadFile "D:\0.xlsm", "123" 'выгружаем файл в корень в ЯДиска не грузит UploadFile "D:\0.xlsm", "" End Sub