【发布时间】:2019-12-30 22:43:58
【问题描述】:
我有以下代码:
Function createCascadingDropDown(sourceTable As ListObject, targetTable As ListObject, targetTableCorespondingColumn As Integer, targetWs As Worksheet, targetWsDropDownColumn As Integer)
Dim currentDropDownList As String, dropDownName As String, formula As String
Dim validationVariable As Validation
currentDropDownListName = targetWs.Name & "CurrentDropDownList"
dropDownName = targetWs.Name & "DropDown"
targetWs.Names.Add Name:=currentDropDownListName, RefersToLocal:="=INDEX(" & targetWs.Name & "!" & currentDropDownListName & ";1;1):INDEX(" & targetWs.Name & "!" & currentDropDownListName & ";COUNTA(" & targetWs.Name & "!" & currentDropDownListName & "))"
targetWs.Names.Add Name:=dropDownName, RefersToLocal:="=INDEX(" & sourceTable.Name & ";0;MATCH(INDEX(" & targetTable.Name & "[@];" & CStr(targetTableCorespondingColumn) & ");" & sourceTable.Name & "[#Headers];0))"
formula = "=" & dropDownName
With targetWs.columns(targetWsDropDownColumn).EntireColumn.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=formula
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.InputMessage = ""
.ErrorTitle = ""
.ErrorMessage = ""
.ShowInput = False
.ShowError = True
End With
targetWs.Cells(1, targetWsColumn).Validation.Delete
End Function
一般来说,我正在尝试以编程方式构建一个级联下拉菜单,例如 https://www.contextures.com/exceldatavaldependindextables.html。
问题出现在我添加验证的行中。这里出现错误“应用程序定义或对象定义错误”。
当我添加断点并手动执行此步骤时,它可以工作,尽管事实上,excel 告诉我“源当前评估为错误。你想继续吗?”。这可能是问题所在;至少我找到了this 和this,它们都没有帮助。将 IFERROR 包裹在公式周围使其无效。
所以我也尝试将 RefereToLocal 设置为一个空单元格(例如“=$A$20”),然后再进行更改。现在的问题是,它不再接受 完全相同 公式:
targetWs.Names.Item(dropDownName).RefersToLocal ="=INDEX(" & targetWs.Name & "!" & currentDropDownListName & ";1;1):INDEX(" & targetWs.Name & "!" & currentDropDownListName & ";COUNTA(" & targetWs.Name & "!" & currentDropDownListName & "))"
我真的没有想法了。如果您还有任何要解决的原始问题(使用 vba 实现无 vba 的级联下拉菜单),我很乐意为您解答!
【问题讨论】:
-
导致错误的行前
targetWS.Names(currentDropDownListName).RefersToLocal和targetWs.Names(dropDownName).RefersToLocal的值是多少?它是一个有效的公式吗?您是否尝试过使用完全相同的公式手动设置对单元格的验证? -
值如所愿,当我复制它们并使用这些值手动尝试时,它工作正常。这就是我想在以“当我添加断点时...”开头的段落中描述的内容。
标签: excel vba validation cascadingdropdown named-ranges