У меня есть книга Excel с определенным именованным диапазоном (список элементов, скажем, яблоко, апельсин, банан и т. Д. - этот диапазон называется [Liste] в приведенном ниже коде) на листе 1.
На листе 2 у меня есть несколько ячеек (B7: B26), когда вы нажимаете на них, появляется пользовательская форма, и вы можете искать и выбирать элементы на листе 1. Все это прекрасно работает.Однако вы также можете набирать слова неправильно и вводить их без получения ошибки (и, следовательно, значение в ячейке не будет совпадать ни с одним из элементов в списке на листе 1).Поэтому я подумал, что было бы неплохо, если бы у меня появилось сообщение с сообщением об ошибке, а затем очистить содержимое ячейки, чтобы человек мог начать все сначала.Я искал повсюду и пробовал пару кодов, но не смог найти тот, где ячейка сопоставляется с именованным диапазоном (списком).
Вот краткий обзор того, что я хотел бы, чтобы код делал:
Если значение, введенное в пользовательскую форму для выбранной ячейки, НЕ соответствует ни одному из элементов в списке на листе 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
В настоящий момент я получаю ошибку '1004' (диапазон метода object_worksheet не удалось) для строки Set rSearchrng = range([Liste])
.
Я открыт для совершенно нового кода, если у вас есть лучший способ добраться до результатов, которые я хотел бы видеть (я также не уверен, должен ли я помещать этот код в пользовательскую форму или сам лист)где выход?)
Заранее спасибо за помощь!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» (не в списке), он не показывает сообщение об ошибке msgbox и просто позволяет мне ввести неверный ввод.
Кто-нибудь знает, почему он работает только частично?