Reputation: 163
everyone!
I have been using the win32com.client module in Python to access cells of an Excel file containing VBA Macros.
A statement in the code xl = win32com.client.gencache.EnsureDispatch("Excel.Application")
has been throwing an error:
AttributeError: module 'win32com.gen_py.00020813-0000-0000-C000-000000000046x0x1x6' has no attribute 'MinorVersion'
Has anyone faced a similar situation and, if yes, what can a possible remedy for this? (I've had a look at the source code for win32com on GitHub, but haven't been able to make much sense from it.)
Upvotes: 15
Views: 24519
Reputation: 56
Just delete this folder C:\Users\<your username>\AppData\Local\Temp\gen_py
and restart your kernel and rerun your script. Worked for me.
Upvotes: 0
Reputation: 51
A solution is to locate the gen_py folder (C:\Users\\AppData\Local\Temp\gen_py) and delete its content. It works for me when using the COM with another program.
Upvotes: 5
Reputation: 23
Deletion of the folder as mentioned previously did not work for me. I solved this problem by installing a new version of pywin32 using conda. conda install -c anaconda pywin32
Upvotes: 0
Reputation: 2451
While I trust the previous answers better understand EnsureDispatch, if you came here because you have this problem but cannot amend your code, or do not want to, I was able to fix this problem by renaming a folder. Running these lines raised the same error:
from win32com.client.gencache import EnsureDispatch
import sys
xl = EnsureDispatch("Excel.Application") # Error here
print(sys.modules[xl.__module__].__file__)
Now, unfortunately, if you get the error it's hard to know where that file is. For me it was this folder: C:\Users\<username>\AppData\Local\Temp\gen_py\
. Appending an underscore to that folder name (or deleting it) should cause the folder to be re-created when the code is re-run.
hat tips to
The pyxll link has another block of code to call for potentially another folder location. I didn't use it so i'm not posting the code here. The fix above worked for me, but just in case you can go further down the rabbit hole.
Upvotes: 3
Reputation: 186
Renaming the GenPy
folder should work.
It's present at: C:\Users\ _insert_username_ \AppData\Local\Temp\gen_py
Renaming it will create a new Gen_py
folder and will let you dispatch Excel properly.
Upvotes: 8
Reputation: 426
The main reason for this attribute error is because your COM-server has shifted from late-binding (dynamic) to early binding (static).
There are two ways to fix this issue:
Use the dynamic module to force your code to work in a late-bound oriented way. Example use:
"win32com.client.dynamic.Dispatch()" instead of "win32com.client.Dispatch()"
Use camelcase sensitive keywords for the early bound oriented way. Example use:
"excel.Visible()" instead of "excel.VISIBLE()" or "excel.visible()"
Try out
"win32com.client.dynamic.Dispatch()" instead of "win32com.client.gencache.EnsureDispatch"
As win32com.client.gencache.EnsureDispatch forces the MakePy process.
Upvotes: 11
Reputation: 643
If I want to make sure that python starts a new excel instance (for instance to access macros in my xlsm files), I use
xlApp = win32com.client.DispatchEx("Excel.Application")
That way I can close the application without hurting the instance that was already open.
Otherwise, I could simply use
xlApp = win32com.client.Dispatch("Excel.Application")
Does that work for you?
Upvotes: 3