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

xlwings range.api.validation.add throws com_error -2146827284

我正在尝试使用 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 似乎是一般性 "name not found" 错误。 VBA 适用于此:

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

我做错了什么?

我认为您的问题来自将 None 传递给 add 方法的第二个和第三个参数。下面修改后的行对我有用。

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

xlwings 使 VBA 常量在 python 中可用。因此,为了使您的代码更具可读性,您可以这样做:

from xlwings import constants
validation_list = "linear_benefit,linear_cost,sigmoid_benefit,sigmoid_cost"
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, validation_list)

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

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))