Excel 如何确保验证采用非空值?

Excel 如何确保验证采用非空值?,excel,vba,Excel,Vba,价值清单 下拉列表 我有一个从A2到最后一行的代码,它接收值并创建一个下拉列表。我想修改它,使下拉列表只包含非空值。请检查图像以便更好地理解 For i = 2 To LastRow1 + 1 With sht.Range("A" & i).Validation .delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _ Ope

价值清单

下拉列表

我有一个从A2到最后一行的代码,它接收值并创建一个下拉列表。我想修改它,使下拉列表只包含非空值。请检查图像以便更好地理解

For i = 2 To LastRow1 + 1
        With sht.Range("A" & i).Validation
            .delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
            Operator:=xlBetween, Formula1:="=DropDown!A2:A" & LastRowAT
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = ""
            .ErrorTitle = ""
            .InputMessage = ""
            .ErrorMessage = "Value not present in drop down."
            .ShowInput = True
            .ShowError = True
        End With
Next i

您将需要一个临时工作列,可以选择位于隐藏的图纸上

然后,您可以使用INDEX从INDEXDropDown列中检索值!A:A,ROWNUM,1-我们只需要确定从哪一行获取数据

这里一个非常有用的函数是聚合-这允许我们使用SUM、MIN、COUNTA或SMALL等功能,同时跳过隐藏行和/或错误值。在本例中,我们希望SMALL从列表中获取第k个最小数字,我们将使用ISBLANK生成一个DIV0!单元格为空时出错

为了加快计算速度,这将只处理列A中的前100行

AGGREGATE(15, 6, ROW(DropDown!$A$1:$A$100)/--NOT(ISBLANK(DropDown!$A$1:$A$100)), ROW())
第一位聚合15,6,意味着我们想要小的,并排除任何有错误的行。最后一位,ROW意味着在第一行我们需要最小的值,然后在第二行我们需要下一个最小的值,依此类推,直到我们用完了非错误值

中间的一点是下拉列表$$1:$100/-notisblank下拉列表$A$1:$A$100首先从下拉列表中获取每个单元格的行号,如果单元格不为空,则除以1;如果单元格为空,则除以0。任何被1除的都是它本身,产生行号,任何被0除的都会产生错误

然后,我们可以将其作为要检索的行输入到索引公式中,如下所示:

=INDEX(DropDown!$A:$A, AGGREGATE(15, 6, ROW(DropDown!$A$1:$A$100)/--NOT(ISBLANK(DropDown!$A$1:$A$100)), ROW()), 1)

然后,您可以将下拉列表指定给该列表,或者设置一个将自动调整大小的动态命名范围,例如=OtherDropDown$一美元:INDEXOtherDropDown$A:$A,倒计时$答:$A,1

您可以尝试只将填充的单元格放入公式中。或者确保下拉列表中的值之间没有空单元格。您的代码看起来正常。有什么错误?@mikku我希望下拉列表只包含非空值。检查图像下拉列表。它有空格dropdown@Mikku我尝试了代码,但仍然包含空格。IgnoreBlank用于在不填写值的情况下不给出错误。如果您是通过excel中的“常规”菜单而不是VBA来执行此操作,则“忽略空白单元格”仍会在下拉列表中包含空白。@Mikku就是这样。要测试它自己,创建一个全新的工作簿,在单元格A1和A3中放置一个值,然后在单元格B3中创建一个新的验证,其源为A1A:A3-您仍然可以从列表中的A2中看到空白。IgnoreBlank just意味着强制允许用户不输入值,而不必从列表中进行选择