在工作表1中,我有一个excel工作簿,其中定义了一个命名范围(项目列表,例如苹果,橙子,香蕉等-该范围在下面的代码中称为[Liste])。
在工作表2中,我有几个单元格(B7:B26),当您单击它们时,会出现一个用户窗体,您可以从工作表1中搜索和选择项目。所有这些都很好用。但是,您也可以输入错误的单词并输入它而不会收到错误(因此,单元格中的值将与工作表1中列表中的任何项目都不匹配)。因此,我以为如果出现一个带有错误消息的msgbox,然后清除单元格的内容以便该人可以重新开始,那将是很好的。我到处都看过,尝试了一些代码,但是找不到一个将单元格与命名范围(列表)匹配的代码。
快速回顾一下我希望代码执行的操作:
如果在用户表单中为所选单元格输入的值与工作表1中列表中的任何项目都不匹配,则会出现一个消息框,显示“输入了错误的名称,请重试”,并单击确定按钮。
单击确定后,还应清除所选单元格的内容
我已经尝试了各种代码变体,包括首先为每个项目建立Dim,for循环等,但是似乎没有任何作用。
这是我在工作表中打开UseForm的代码(有关背景信息-效果很好):
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect([B7:B26], Target) Is Nothing And Target.Count = 1 Then
With UserForm4
.StartUpPosition = 0
.Left = Application.Left + (0.5 * Application.Width) - (0.5 * .Width)
.Top = Application.Top + (0.5 * Application.Height) - (0.5 * .Height)
.Show
End With
End If
End Sub
用户表单的代码(也可以正常使用):
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
Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then ActiveCell = Me.ComboBox1: Unload Me
End Sub
我添加到工作表2中的代码(我希望在其中显示msgbox;在我认为足够相似的另一篇文章中找到了它)
Sub Worksheet_Change(ByVal Target As Range)
Dim rSearchRng As Range
Dim vFindvar As Variant
Set rSearchRng = Range([Liste])
Set vFindvar = rSearchRng.Find(Range("B7:B26").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 Sub
此刻,我在Set rSearchrng = range([Liste])
行收到错误“ 1004”(object_worksheet的方法范围失败)。
如果您有更好的方法获得想要的结果,我愿意接受全新的代码(我也不知道是否应该将此代码放在用户窗体或实际工作表本身中,以便将其输出是?)
在此先感谢您的帮助! V
更新
自从我发布此内容以来,我已将代码编辑为如下形式:
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`
但是,这只能部分解决我的问题。它可以与某些字母完美结合,而对其他字母则不能。例如,如果我键入“ ad”(不在列表中),则可以正常运行,但是如果我输入“ ate”或“ be”(不在列表中),则不会显示错误消息框,而仅允许我输入无效的输入
有人知道为什么它只能部分起作用吗?