Программно установите путь поиска DLL в макросе VBA

И если вам нужен новый базовый URL для всех ссылок на странице, вы можете полностью избежать JS и использовать элемент .

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base

8
задан shruti1810 27 May 2015 в 09:38
поделиться

2 ответа

Можно использовать LoadLibrary api.

Например, в моих проектах код похож на это:

If LibraryLoaded() Then
   Call MyFunc ...
End If


Public Function LibraryLoaded() As Boolean

 Static IsLoaded As Boolean
 Static TriedToLoadAlready As Boolean

 If TriedToLoadAlready Then
    LibraryLoaded = IsLoaded
    Exit Function
  End If
  Dim path As String
 path = VBAProject.ThisWorkbook.path
 path = Left(path, InStrRev(path, "\") - 1)
 IsLoaded = LoadLibrary(path & "\bin\" & cLibraryName)
 TriedToLoadAlready = True

 LibraryLoaded = IsLoaded

End Function
5
ответ дан 5 December 2019 в 11:28
поделиться

Есть еще одно действительно ужасное решение, но этот блоггер понял его, и я не могу придумать другого пути:

http: //blogs.msdn. com / pranavwagh / archive / 2006/08/30 / How-To-Load-Win32-dlls-Dynamically-In-VBA.aspx

По сути, вы пишете процедуру, которая создает модуль кода в VBA во время выполнения. Этот модуль должен создать ссылку на dll, и он должен создать фиктивную функцию (или процедуру) как часть этого модуля, который вызывает dll. Затем из вашего кода вы используете Application.Run (dummyfunction (), arg1, arg2 ...). Это необходимо, потому что в противном случае проект не будет компилироваться, потому что фиктивная функция еще не является функцией.

В его коде вы заметите, что он использует InputBox () для получения местоположения .dll, но, очевидно, вы можете получить местоположение из диапазона в электронной таблице. Следующий фрагмент кода может оказаться полезным.

Dim cm As CodeModule
Dim vbc As VBComponent

Set cm = Application.VBE.ActiveVBProject.VBComponents.Add(vbext_ct_StdModule).CodeModule
cm.AddFromString (decString & funcString)
cm.Name = "MyNewModule"
Set vbc = cm.Parent
Application.VBE.ActiveVBProject.VBComponents.Remove vbc

'decString' и 'funcString' были просто строками, которые я построил, как его 'ss'. Во фрагменте показано, как можно переименовать модуль кода, чтобы при необходимости удалить его позже. Очевидно, это просто удаляет его сразу после создания, и вы, вероятно, не захотите этого делать, но, по крайней мере, он показывает вам, как это будет сделано.

Сказав все это, мы в основном просто пишем .exe сейчас и выполняем оболочку.Если вам нужно, чтобы VBA дождался завершения работы оболочки, для этой проблемы также есть решения.

2
ответ дан 5 December 2019 в 11:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: