Excel 仅根据另一单元格中基于逗号的字符串选择值
A1=10,20,30,40,50,60,90100110 如果我想在B1单元格中写10,20,70,那么它应该拒绝我,因为70不是A1单元格。例如,如果我不考虑B1单元格10,50,40,20中的顺序写入,则允许我写入,但当我键入10,50,80,30时,应限制。 请帮帮我。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
使用工作表事件和字典
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")