Excel VBA插入方法失败

时间:2017-07-31 16:12:51

标签: python excel vba excel-vba

我使用xlwings和扩展名PyWin32 API来操作Excel文档。我想创建一个函数,在周一早上,获取一个打开的excel文档并在" volatile_column"的左边插入一个新列,然后用0填充新列。

到目前为止的代码:

import numpy as np
import xlwings as xw
import datetime as dtt
from pybev import datecheck


def monday_new_column(metrics):

    stripped_date = datecheck.date_to_datetime(dtt.datetime.today().date())

    if stripped_date.weekday() == 0:
        if stripped_date not in metrics.df.columns: # ensures no existing column
            col_num = int(np.where(metrics.df.columns == metrics.volatile_column)[0][0] + 2)
            max_row = int(len(metrics.df.index) + 2)

            # Using an xlwings constant & defining a column of zeroes
            xlShiftToRight = xw.constants.InsertShiftDirection.xlShiftToRight
            zero_array = np.zeros((max_row,), dtype=np.int)[np.newaxis].T

            print('Adding new week column...',end=''),

            # !! VBA code !!
            range_obj = metrics.sheet.range((1,col_num),(max_row,col_num))
            range_obj.api.Insert(Shift=xlShiftToRight) # here's the problem line
            range_obj.api.value = zero_array

            print('Done')

    return

转储错误:

--> 191             range_obj.api.Insert(Shift=xlShiftToRight)
    192             range_obj.api.value = zero_array
    193 
C:\Users\username\AppData\Local\Enthought\Canopy\edm\envs\User\lib\site-packages\xlwings\_xlwindows.py in __call__(self, *args, **kwargs)
     61         while True:
     62             try:
---> 63                 v = self.__method(*args, **kwargs)
     64                 t = type(v)
     65                 if t is CDispatch:
C:\Users\username\AppData\Local\Enthought\Canopy\edm\envs\User\lib\site-packages\win32com\client\dynamic.py in Insert(self, Shift, CopyOrigin)
C:\Users\username\AppData\Local\Enthought\Canopy\edm\envs\User\lib\site-packages\win32com\client\dynamic.py in _ApplyTypes_(self, dispid, wFlags, retType, argTypes, user, resultCLSID, *args)
    280 
    281         def _ApplyTypes_(self, dispid, wFlags, retType, argTypes, user, resultCLSID, *args):
--> 282                 result = self._oleobj_.InvokeTypes(*(dispid, LCID, wFlags, retType, argTypes) + args)
    283                 return self._get_good_object_(result, user, resultCLSID)
    284 
com_error: (-2147352567, 'Exception occurred.', (0, 'Microsoft Excel', 'Insert method of Range class failed', 'xlmain11.chm', 0, -2146827284), None) 

这是一个VBA错误,所以我不认为周围的python代码是个问题。 documentation没有提供关于发生了什么的线索,并且Google搜索错误只会导致很多用户遇到Select()方法的问题,我在这里没有使用。

我还尝试删除Shift=xlShiftToRight参数并每次显式调用metrics.sheet.range((1,col_num),(max_row,col_num))而不是使用range_obj指针。两种策略都返回与初始策略相同的错误消息。

我的语法是否遗漏了一些简单的内容,或者这是一个更深层次的API问题?

1 个答案:

答案 0 :(得分:0)

事实证明,解决方案只是将.EntireColumn添加到范围对象。

range_obj.api.EntireColumn.Insert()

我不明白为什么它可以弄清楚我希望整个列移动到示例工作表而不是我正在使用的实际工作表上,但这似乎是问题。