xlwings range.api.validation.add抛出com_error -2146827284

时间:2016-11-21 14:32:51

标签: python pywin32 xlwings

我尝试使用xlwings将数据验证添加到Excel工作表范围:

def set_validation(rng):
    """Add data validation to the given range"""
    rng.value = "linear_benefit"
    rng.api.validation.delete()
    # xlValidateList = 3
    rng.api.validation.add(3, None, None, 
        "linear_benefit,linear_cost,sigmoid_benefit,sigmoid_cost", None)

当我运行它时,它会在最后一行停止并显示错误:

com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2146827284), None)

错误编号-2146827284,根据我所读过的内容,似乎是一个未找到的通用名称"错误。 VBA可以正常使用:

rng.Validation.Add Type:=3, _
    Formula1:="linear_benefit,linear_cost,sigmoid_benefit,sigmoid_cost")

我做错了什么?

2 个答案:

答案 0 :(得分:3)

我认为你的问题来自将None传递给add方法的第二和第三个参数。以下修改后的行为我工作。

rng.api.Validation.add(3,1,3,"linear_benefit,linear_cost,sigmoid_benefit,sigmoid_cost")

答案 1 :(得分:0)

xlwings使得python中的VBA常量可用。因此,为了使代码更具可读性,您可以执行以下操作:

def set_validation_list(rng, validation_list):
    if validation_list is None:
        validation_list = [' ']
    if not isinstance(validation_list, list):
        raise TypeError('trying to set a validation list, but input is not a list')
    dv_type = constants.DVType.xlValidateList
    dv_alertstyle = constants.DVAlertStyle.xlValidAlertStop
    dv_operator = constants.FormatConditionOperator.xlEqual
    rng.api.Validation.Add(dv_type, dv_alertstyle, dv_operator, ';'.join(validation_list))

我遇到的另一个问题是,在我的语言环境中,验证列表中的逗号应该用分号替换。我最后为此写了一个小函数:

{{1}}