我尝试使用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")
我做错了什么?
答案 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}}