我已经查看了一些有关问题的示例,但是找不到有效的答案。
背景: 我在Sheet1(A2:A77,已经是名称为“ Liste”的已定义范围)中列出了项目(比如苹果,橙子,香蕉)。 然后,我在另一个工作表(假设为Sheet2)上包含几个单元格,其中弹出一个用户窗体(使用vba代码创建),用户可以在其中选择一个项目并单击“确定”。
但是,由于用户表单(和列表)的性质,您可能会有拼写错误等,并且仍会被接受。因此,我想创建一个将输入与给定列表匹配的检查(以防止用户输入其他内容)。用户表单/代码旨在保持其可搜索性(而不仅仅是简单的数据验证列表)。
问题: 我尝试使用vba代码创建此代码,该代码检查输入,将其与Sheet1列表匹配,如果不匹配,则显示带有语句的msgbox。这部分起作用(对于某些字母,但对于另一些字母而言,很奇怪)。
这是我的代码:
Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Dim rSearchRng As Range
Dim vFindvar As Variant
If Not Intersect([B7:B26], Target) Is Nothing Then
Set rSearchRng = Sheet4.Range("Liste")
Set vFindvar = rSearchRng.Find(Target.Value)
If Not vFindvar Is Nothing Then
MsgBox "The Audit Project Name you have entered is not valid. Please try again!", vbExclamation, "Error!"
Selection.ClearContents
End If
End If
Application.EnableEvents = True
End Sub
所以我当时想通过简单的数据验证来创建此错误消息。
数据验证
更新
如果您没有用户表单,Tigeravatars数据验证建议会起作用(请参见下面的评论)。
要使其与UserForm一起使用,我将“ MatchEntry”更改为TRUE,还从ComboBox代码中删除了所有不需要的“更改事件”。我现在使用的最终代码如下:
Dim a()
Private Sub CommandButton2_Click()
End Sub
Private Sub UserForm_Initialize()
a = [Liste].Value
Me.ComboBox1.List = a
End Sub
Private Sub ComboBox1_Change()
Set d1 = CreateObject("Scripting.Dictionary")
tmp = UCase(Me.ComboBox1) & "*"
For Each c In a
If UCase(c) Like tmp Then d1(c) = ""
Next c
Me.ComboBox1.List = d1.keys
Me.ComboBox1.DropDown
End Sub
Private Sub CommandButton1_Click()
ActiveCell = Me.ComboBox1
Unload Me
End Sub
Private Sub cmdClose_Click()
Unload Me
End Sub
我认为我在这里展示它是为了防止有人偶然发现我的问题。
谢谢!
答案 0 :(得分:0)
=Liste
,如下所示:测试一下。现在,您应该有一个有效选择的下拉列表,并且如果尝试手动输入无效选择,则会收到您指定的错误消息。
请注意,如果您希望数据验证完全禁止/阻止列表中没有的任何条目,则需要将错误提示->样式设置为“停止”,而不是“警告”。
编辑:
每个注释都不能是下拉列表。我强烈建议为此使用下拉列表,因为这将是减少时间输入数据以及减少错别字错误的最有效方法。但是,如果它绝对不能成为下拉列表,则可以使用“自定义数据验证”并将公式设置为=ISNUMBER(MATCH(B7,Liste,0))
(此处使用B7
是因为它是范围内的第一个单元格包含此数据验证的单元格。
答案 1 :(得分:0)
尝试以下公式:
= NOT(ISERROR(FIND(“-”&A1&“-”,(TEXTJOIN(,“-”,TRUE,Sheet1!A1:A77))))))
合并所有文本,然后查看列表中单元格中是否出现内容。我将其放在破折号之间以防止它接受局部。