It's not complicated:
If you are using a procedure or function that you have created, there is no reference to add.
If you are using a procedure or function that you did not create, you must add a reference.
Pressing F1 when the cursor is on an instruction opens the help on that function/procedure. Its assembly is indicated in the help.
More generally, if you must use Excel, you need the reference to Office (which provides the basic objects for Office applications) and a reference to Excel (to have access to the specific objects, procedures and functions of Excel)
If you are using Word, you need the reference to Office and Word.
To simplify your macro, except if you can pass a range as a parameter to the ExecuteExcel4Macro() function , it should return an array of Strings. All that's left to do is bind the array to the combobox's RowSource property. (To check that the value returned by the macro is indeed an array of Strings, if not, convert it)
It is also possible to do as in the link proposed by d.roger.
Using ADO for this is a bit like using a nuclear weapon to kill a mosquito but it's largely festable. (as long as we understand the principle of ODA)
To put it simply, ADO is a set of tools that allow you to access data, whether it is a SQL or Access database, an Excel file, etc.
It uses a database engine, SQL queries, and a pointer to fetch data. We open a connection by specifying the database engine to use and the file, we ask a question to the database engine (the SQL query) and we browse the result of the query with the pointer.