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

时间:2019-06-17 08:22:57

标签: excel vba

值列表

LIST OF VALUES

下拉

DROPDOWN

我有一个代码,该代码接受从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

1 个答案:

答案 0 :(得分:1)

您将需要一个临时工作列,该列可以(可选)位于隐藏的工作表上。

然后,您可以使用INDEX从列(INDEX(DropDown!A:A,ROWNUM,1)中检索值-我们只需要弄清楚从哪一行获取数据即可。

这里一个非常有用的功能是AGGREGATE-跳过时,我们可以使用SUMMINCOUNTASMALL之类的功能隐藏的行和/或错误值。在这种情况下,我们需要SMALL(从列表中获得 k th 个最小的数字),我们将使用ISBLANK生成一个单元格为空时,#DIV0!错误。

对于计算速度,这只会处理A列中的前100行

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

第一位(AGGREGATE(15, 6,)表示我们想要SMALL并排除任何有错误的行。最后一位(, ROW()))表示在第1 st 行中我们想要最小值,然后在第2 nd 行中我们想要最小值,依此类推,直到我们用完非错误值为止。

中间位(ROW(DropDown!$A$1:$A$100)/--NOT(ISBLANK(DropDown!$A$1:$A$100)))首先从下拉列表中获取每个单元格的行号,然后将其除以1(如果单元格不为空)或0(如果单元格为空) 。除以1的任何东西本身就是行号,除以0的任何东西都会出错。

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

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

然后,您可以将下拉列表分配给该列表(或设置动态的命名范围,该范围将自动调整大小,例如=OtherDropDown!$A$1:INDEX(OtherDropDown!$A:$A,COUNTA(DropDown!$A:$A),1)