Существует еще одно по-настоящему уродливое решение, но этот блоггер понял это, и я не могу найти другого способа:
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 ...). Это необходимо, потому что в противном случае проект не будет компилироваться, потому что функция dummyfunction еще не является функцией.
Вы заметите, что в его коде он использует 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 дождался завершения оболочки, для этой проблемы также есть решения.