Excel 仅根据另一单元格中基于逗号的字符串选择值

Excel 仅根据另一单元格中基于逗号的字符串选择值,excel,excel-formula,excel-2007,Excel,Excel Formula,Excel 2007,A1=10,20,30,40,50,60,90100110 如果我想在B1单元格中写10,20,70,那么它应该拒绝我,因为70不是A1单元格。例如,如果我不考虑B1单元格10,50,40,20中的顺序写入,则允许我写入,但当我键入10,50,80,30时,应限制。 请帮帮我。 使用工作表事件和字典 Private Sub Worksheet_Change(ByVal Target As Range) Dim vS1, vS2, v1, v2 Dim rng As Range

A1=10,20,30,40,50,60,90100110

如果我想在B1单元格中写10,20,70,那么它应该拒绝我,因为70不是A1单元格。例如,如果我不考虑B1单元格10,50,40,20中的顺序写入,则允许我写入,但当我键入10,50,80,30时,应限制。 请帮帮我。
使用工作表事件和字典

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim vS1, vS2, v1, v2
    Dim rng As Range
    Dim dic As Object
    Dim c As Object

    Set dic = CreateObject("Scripting.Dictionary")
    Set c = CreateObject("Scripting.Dictionary")

    If Target.Count > 1 Then Exit Sub

    If Not Intersect(Target, Range("B:B")) Is Nothing Then
        Set rng = Target.Offset(0, -1)
        vS1 = Split(rng, ",")

        For Each v1 In vS1
            If Not dic.exists(v1) Then
                dic.Add v1, v1
            End If
        Next v1
        vS2 = Split(Target, ",")
        For Each v2 In vS2
            If Not c.exists(v2) Then
                c.Add v2, vS
            Else
                MsgBox "Please input correct Data!! "
                Exit Sub
            End If
            If Not dic.exists(v2) Then
                MsgBox "Please input correct Data!! "
                Exit Sub
            End If
        Next v2
    End If
End Sub

仅使用公式,只要顺序保持相同的初始1位唯一解决方案,然后是下面的2位:

将此公式作为自定义公式输入数据验证,如下所示:

数据>数据验证:

B2的公式为:

=IFERRORMATCH*&替代物替代物2,,,,*,*&*,A2,0,0

其工作原理是,它在A单元格的B单元格中搜索匹配项,但我们也在开始和结束处添加*以便使用通配符进行查找,即在字符串中的任何位置都可以找到它。此外,我们用通配符*替换任何逗号和空格,因此顺序并不重要

在这种情况下,当我们在单元格B2中输入2,3,8时,我们基本上是这样做的:

匹配*2*3*8*,1,2,3,7,8,0

当然,这给出了一个正匹配,因此验证是有效的

更新

正如@Peh所指出的,此解决方案仅适用于1位数字

如果我们想把它扩展到两位数,那么我们需要更多的创造力

我想我已经想出了一个解决方案,但它需要对a列中的验证字符串进行一个小的更改

您需要输入您的列表,如1,3,7,9,12,14,22

也就是说,在最后一个1位数字和第一个2位数字之间,您需要添加一个标签

如果单元格B4:

=IFERRORMATCH*&替换替换铁素替换B4,搜索、?、B4&、、1、、、B4&、、、*、*、*、*、*、*、*、*、A4,0,0

它的工作原理是搜索、?,即条目中的第一个2位数字,并将其替换为、。注意,如果您只有一个2位数字,我需要在条目末尾添加一个逗号

然后,我们用所有其他逗号和空格替换Astrix通配符*,来搜索这个

所以如果你输入1,3,12,我们基本上把它改为*1*3**12*

这意味着,如果输入1,3,1,它将不再有效。之前,对于我上面给出的第一个答案,这将与12个答案中的1一样有效,当考虑到我们使用的通配符时,它将验证我们输入的最终1


我相信这个解决方案适用于99以内的所有2位数字,但100之后就不起作用了,除非我们添加一个额外的创造性步骤,比如在3位数字之前添加另一个字符,并以类似方式进行处理。

这些是我已经采取的步骤注意到粗体段落,然后尝试一下

单击公式选项卡->名称管理器->添加新公式名称: 单击数据选项卡->数据验证->允许自定义->添加公式->添加标题错误警报 要解释它是如何工作的,请查看您的请求

数字必须在您提供的数字中,arr函数将解决此问题 数字不能重复,使用频率arr、arr进行测试 作用 最后,将这些条件与[和]函数结合起来
要查找的关键字是数据验证:请参阅,尝试一下。如果你陷入困境或出现错误,提出具体问题,并展示你到底尝试了什么•你也可能从阅读中受益,但主席先生,这是一个逗号分隔的值。如何对基于逗号的值应用数据验证。这只限制了一次条目更改所有内容,您需要为此编写VBA代码。使用验证您的输入,如果输入无效,则可以使用。你自己试试看。请注意,堆栈溢出不是代码编写服务,因此您需要显示您尝试过的代码。您尝试过什么吗?你已经用VBA标记了这个问题,但是没有发布任何内容,请发布你尝试过的内容,你遇到了什么错误,不要忘记阅读和修改。还可以查看,更多的好信息请删除vba标签,这可以通过函数解决!您应该使用Target.CountLarge。如果指定范围的单元格数超过2147483647个,则Count属性将生成溢出错误。因此,实际代码会抛出一个未处理的异常,例如,如果您复制粘贴一个完整的工作表。@Pᴇʜ,你说得对。我犯了一个错误。很好的非VBA解决方案!但它只适用于一位数。测试1,2,3,4,5,6,8,9,10,11,12和1,3,2将被视为有效,因为最后2次验证的是12中的2。这是一个好的观点,我无法立即想到解决方法。也许解决方案仅限于一位数。我会快速思考是否还有其他通配符可以使用,等等。我现在也有办法处理2位数字,只要OP可以稍微修改验证字符串,以1,3,7,9,12,14,22之类的数字分隔1位和2位验证,那么新公式应该可以工作。
=IFERROR(FIND("," &TRIM(MID(SUBSTITUTE(Sheet2!$D1,",",REPT(" ",99)),99*(ROW(INDIRECT("A1:A"&(LEN(Sheet2!$D1)-LEN(SUBSTITUTE(Sheet2!$D1,",",""))+1)))-1)+1,99))&",", ","& Sheet2!$A1 &","),0)
=AND(arr,FREQUENCY(arr,arr)<=1)
=AND(AND(arr),AND(FREQUENCY(arr,arr)<=1))
G1=AND(AND(arr),AND(FREQUENCY(arr,arr)<=1))
=INDIRECT("G1")