djkarl, great catch. Process-switch overhead is not trivial. Not to mention that my comments about resizing the array dynamically are handled in that single call because the code is managed in the function.
Not to mention that in any VBA loop you are dealing with pseudo-compiled code (a.k.a. semi-compiled, or semi-interpreted). Doing it that way forces a totally different approach that is compiled "all the way" into machine code because it is part of the COM interface.
When you say "dynamic expansion" do you mean ...
Dynamic expansion works like this. You have a variant. It could be an array automatically. For example, look at the SPLIT function. You don't have to pre-dim it as an array. But when you start adding elements, it was pre-allocated based on sizing assumptions. Once you blow past those assumptions, Access can either barf or try to resize the space allocated to the variable. But if you didn't have an explicit size, it STILL can only guess how big to go, so it makes another assumption. Which works a while longer until you blow past THAT limit, too. This goes on every so often, with Access having to stop, allocate some more dynamic memory for you, and then resume your processing. If at some point, the variant array resizing forces Access to ask Windows for more memory because your initial allocation blew out, that is a different level of dynamic expansion that ALSO could occur. What you want to avoid is letting that kind of thing be dynamic.
When you are adding strings, a third type of dynamic expansion is required. A variant can be very small if you were dealing with something that resolves to a byte, integer, or long. Even a double or date isn't so terribly bad. But a variable-length string requires allocation of a string buffer because that string could get pretty big. Like most variable length strings in Access, I believe a variant doesn't "commit" its size until it knows the type of variable it is about to accept, so it might have to allocate that string buffer as a separate expansion. That will not change the array size but it DOES take memory from the Access heap storage. That, in turn, will affect the virtual memory that Windows has to allocate, so again a dynamic task-resizing might occur.
Just for S&G, you might compare your old and new methods by calling up Task Manager to the active task list and see the size of Access. Then kick off your import process and watch the fireworks. If I'm right, the old method will get huge slowly. Whereas pre-allocating and doing the things suggested by djKarl will expand quickly, almost in a single jump. If that is true, then your speed bump was the combination of semi-compiled code and incremental size expansion, which was making Windows work very hard to service your needs.