如何使用数据validation来限制select列表中的所有唯一条目和一个额外的?

我想要做到以下几点:我有一个表= Listobject有一个名为MasterID的列。 有些列有相同的MasterID,有些甚至没有。 我需要手动添加缺less的MasterID。

我想在MasterID为空的情况下取一行,然后我想单击MasterID列并为此列select一个ID。 它可以是现有的ID。 哪一个是在孔列表中使用的MasterID的唯一位,或者它可以是一个新的MasterID。 如果select了新的ID,它应该是最大的MasterID的下一个整数。 所以如果到目前为止最高的masterID是1000,那么新的应该是1001。

所以我想知道是否有一种方法来使用数据validation,以build议我下一个更大的MasterID或所有现有的。 由于已经填充的MasterID是随机分布的,我需要把它做成一个公式。

让我们稍微forms化一下:

如果单元格不是空的,它可以是任何想要的,否则单元格需要是列表列或列表列的最大值+1中使用的值之一。

如果可能的话,我想使用下拉列表。

我已经试过这与数据validation列表选项,但我无法弄清楚如何。 我知道这需要一个像这样的结构:

If Isempty then BeWhatever Else Be DynamicAdjustedListofEntries OR MaximumEntry+1 

我曾经想过用macros做这个,但是我不想每次改变它都更新。 谁能帮忙?

在这里输入图像说明

我不认为使用纯Excel可以dynamic地填充列表types的validation。 这是我使用VBA的解决scheme。 将此macros放在适当的工作表中:

 Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False If Target.Column = Range("Table26[MasterIDs]").Column Then Dynamic_Data_Validation "Table26[MasterIDs]" End If Application.EnableEvents = True End Sub 

注意:根据您的数据更改Table26[MasterIDs]

然后将其粘贴到普通模块中。 当然,您可以将这些行直接粘贴到Worksheet_Change过程中。

 Sub Dynamic_Data_Validation(table_range As String) Dim ids() As Variant 'Didn't declare as Long because JOIN function doesn't accept it Dim row_count As Long Dim src As Range, tmp_rng As Range Dim validation_list As String Application.ScreenUpdating = False Set src = Range(table_range) ids = src.Value 'Change X to some other column name if you don't prefer this Set tmp_rng = Range("X1").Resize(UBound(ids)) tmp_rng = ids 'If sorted in descending order, it becomes difficult to add the '(MAX + 1) ID in the beginning of the array tmp_rng.Sort Key1:=tmp_rng, Order1:=xlAscending tmp_rng.RemoveDuplicates Columns:=1 row_count = tmp_rng.End(xlDown).Row 'Add the (MAX + 1) ID to the end of the range and resize it tmp_rng.Cells(row_count + 1).Value = tmp_rng.Cells(row_count).Value + 1 Set tmp_rng = tmp_rng.Resize(row_count + 1) tmp_rng.Sort Key1:=tmp_rng, Order1:=xlDescending ids = Application.Transpose(tmp_rng) tmp_rng.Delete Shift:=xlToLeft 'Perhaps consider adding a code to save the workbook after this line, 'as pressing CTRL + END will move the cursor to column X or whatever you choose validation_list = Join(ids, ",") 'The existing validation needs to be deleted, otherwise it raises error src.Validation.Delete src.Validation.Add Type:=xlValidateList, Formula1:=validation_list End Sub 

我已经使用工作表来临时放置数组项目,以便重新sorting和删除重复项目,因为这样看起来更容易。 另一种方法是操作数组中的数组元素,然后将其作为parameter passing给VBA.Join

这是输出:

动态数据验证