|
[1]
[2]
[2/1]
[2 t] [3]
[4]
- Как для нескольких TextBox'ов создать контекстное
меню, позволяющее копировать, вырезать и вставлять данные ? 15.06.2010
- Как отобразить содержимое текстового файла в TextBox,
ListBox (без построчного чтения) ? 27.05.2005
- Как заполнить ячейки данными TextBox, т.е. вывести
содержимое текстового поля построчно ? 21.03.2007
- Как программно выделить весь текст в TextBox,
например, после нажатия кнопки ? 30.12.2006
- Как программно выделить необходимый текст в
TextBox, ComboBox ? 04.09.2010
- Как позволить вводить в TextBox только цифры ?
Как запретить ввод данных не являющихся цифрами ? 11.02.2007
- Как позволить вводить в TextBox символы только
один раз ?
Как запретить ввод повторов ? 02.09.2016
- Как не позволить вводить в TextBox определенные
символы ? 02.09.2016
- Как не позволить копировать данные в TextBox ?
Как запретить вставку скопированных данных в TextBox ? 11.02.2007
- Как запретить удаление, вырезание, копирование и
вставку скопированных данных в TextBox ? 11.02.2007
- Как узнать какие из клавиш SHIFT, CTRL, ALT были
нажаты при работе с TextBox ? 04.09.2016
- Как заставить пользователя вводить данные в
нужные TextBox ? 18.07.2010
- Как при получении фокуса менять цвет шрифта и/или
заливки, а при потере возвращать всё обратно (TextBox) ? 27.03.2011
- Как при получении фокуса менять цвет границ
текстового поля, т.е. "подсвечивать" активный TextBox ? 01.05.2012
- Как программно менять шрифт у элементов управления,
в т.ч. TextBox, ComboBox и ListBox ? 27.03.2011
- Как с помощью TextBox выбрать нужную рабочую книгу
и получить полный путь, причём, не открывая файл ? 30.03.2011
- Как организовать проверку орфографии в TextBox ?
25.04.2014
- Как организовать автозавершение текста в TextBox,
где источником данных будут ячейки(список) ?
NEW 04.04.2020
[1]
[2]
[2/1]
[2 t] [3]
[4]
Ответ :
Для того, чтобы для нескольких TextBox'ов создать контекстное меню,
которое будет вызываться кликом правой кнопки мышки, и будет содержать
команды, позволяющие копировать, вырезать и вставлять данные, проделайте
следующее
Скопируйте этот код в модуль нужной UserForm
Private Sub UserForm_Initialize()
With Application.CommandBars.Add(Name:=Me.Name, Position:=msoBarPopup)
.Controls.Add(Id:=21).OnAction = "TextCut"
.Controls.Add(Id:=19).OnAction = "TextCopy"
.Controls.Add(Id:=22).OnAction = "TextPaste"
End With
End Sub
Private Sub UserForm_Terminate()
Application.CommandBars(Me.Name).Delete
End Sub
Private Sub TextBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
TextBox_KeyButton Button
End Sub
Private Sub TextBox2_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
TextBox_KeyButton Button
End Sub
Private Sub TextBox3_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
TextBox_KeyButton Button
End Sub
Private Sub TextBox_KeyButton(Button As Integer)
If Button = vbKeyRButton Then _
Application.CommandBars(Me.Name).ShowPopup
End Sub |
А этот код разместите в стандартном модуле
| Private Sub UserForm_Show()
UserForm1.Show
End Sub
Private Sub TextCut()
UserForm1.ActiveControl.Cut
End Sub
Private Sub TextCopy()
UserForm1.ActiveControl.Copy
End Sub
Private Sub TextPaste()
UserForm1.ActiveControl.Paste
End Sub |
В этом примере используется Диалоговое окно - UserForm1, а также
элементы управления Текстовое поле - TextBox1, TextBox2, TextBox3
для которых и создаётся контекстное меню.
Обратите внимание на то, что имя контекстного меню, которое совпадает с
именем формы (необязательное условие) должно быть уникальным, т.к. если
панель инструментов с аналогичным именем уже существует, то при попытке
создания новой панели, Вы получите ошибку. Этой ошибки можно избежать,
если перед созданием панели проверить, нет ли панели с этим именем
или же отказаться от использования необязательного аргумента
Name метода .Add
(см. аналогичный пример2)
Вариант II. Если предварительно скачать контрол
iemenu.ocx (IE Popup Menu) и добавить его в список доступных ссылок,
то создать контекстное меню можно с помощью этого элемента управления
(см. пример3)
Ответ :
Вариант I.
Private Sub UserForm_Initialize()
TextBox1.MultiLine = True
TextBox1.ScrollBars = fmScrollBarsVertical
iFullName$ = "C:\TextFile\Test.txt"
Open iFullName$ For Input As #1
iText$ = Input(LOF(1), #1)
Close #1
TextBox1.Text = iText$
TextBox1.SelStart = 0
ListBox1.List = Split(iText$, vbCrLf)
End Sub |
Вариант II.
| Private Sub UserForm_Initialize()
TextBox1.MultiLine = True
TextBox1.ScrollBars = fmScrollBarsVertical
iFullName$ = "C:\TextFile\Test.txt"
Open iFullName$ For Binary As #1
iText$ = Space(LOF(1))
Get #1, , iText$
Close #1
TextBox1.Text = iText$
TextBox1.SelStart = 0
ListBox1.List = Split(iText$, vbCrLf)
End Sub |
Внимание :
Значения свойств MultiLine и ScrollBars
можно установить вручную
Функция Split() появилась только в MS Excel 2000
Ответ :
Для того, чтобы заполнить ячейки данными текстового поля, у которого значение
свойства MultiLine установлено как True , можно использовать
построчное чтение. Если ячейки уже заполнены, то удалите содержимое и форматы
этих ячеек(столбца), предварительно проверив не защищены ли они
[FAQ173]
Вариант I. (построчное чтение)
If TextBox1.Value <> "" Then
iText$ = TextBox1.Value & vbCrLf
iStart& = 1
iPosition& = InStr(iStart&, iText$, vbCrLf)
Do While iPosition& <> 0
iStrLine$ = Mid(iText$, iStart&, iPosition& - iStart&)
iStart& = iPosition& + 2: iRow& = iRow& + 1
iPosition& = InStr(iStart&, iText$, vbCrLf)
Select Case True
Case IsNumeric(iStrLine$)
Cells(iRow&, 1) = CDbl(iStrLine$)
Case IsDate(iStrLine$)
Cells(iRow&, 1) = CDate(iStrLine$)
Case InStr(iStrLine$, "=") = 1 'Left(iStrLine$, 1) = "="
Cells(iRow&, 1) = "'" & iStrLine$
Case Else
Cells(iRow&, 1) = iStrLine$
End Select
Loop
Cells(iRow&, 1).EntireColumn.AutoFit 'Columns(1).AutoFit
End If |
Примечание :
Для ввода чисел с лидирующим нулём необходимо добавить
соответствующую проверку.
При большом количестве строк в текстовом поле, имеет смысл отключить
обновление экрана [FAQ43]
Вариант II. (без построчного чтения)
If TextBox1.Value <> "" Then
iMassiv = Split(TextBox1.Value, vbNewLine)
iResult = Application.Match("=*", iMassiv, 0)
If Not IsError(iResult) Then 'Or IsNumeric(iResult)
If MsgBox("Вы хотите установить текстовый формат ячеек ?", vbYesNo + vbQuestion, _
"В текстовом поле есть данные содержащие лидирующий знак равно") = vbYes Then
With Range("A1").Resize(UBound(iMassiv) + 1)
.NumberFormat = "@"
.Value = Application.Transpose(iMassiv)
.EntireColumn.AutoFit
End With
Else
MsgBox "В таком случае, воспользуйтесь построчным чтением", vbInformation, ""
End If
End If
End If |
Примечание :
Функция Split() появилась только в MS Excel 2000
После установки текстового формата MS Excel будет воспринимать
числа и даты (если таковые конечно имеются) как текст
(со всеми вытекающими последствиями)
Ответ :
Вариант I.
Private Sub CommandButton1_Click()
TextBox1.SetFocus: TextBox1.SelStart = 0
SendKeys "+{END}": SendKeys "+{PGDN}"
End Sub |
Вариант II.
| Private Sub CommandButton2_Click()
TextBox1.SetFocus
TextBox1.SelStart = 0
TextBox1.SelLength = TextBox1.TextLength
End Sub |
| Private Sub CommandButton2_Click()
With TextBox1
.SetFocus
.SelStart = 0
.SelLength = .TextLength
End With
End Sub |
Ответ :
Для того, чтобы программно выделить, например, третий символ в
текстовом поле (или в поле со списком) можно использовать :
TextBox1.SetFocus
TextBox1.SelStart = 2
TextBox1.SelLength = 1 |
Для выделения нескольких символов, например, со второго по четвёртый
достаточно изменить всего лишь значение свойства SelLength, т.е.
| With Me.TextBox1 'ComboBox1
.SelStart = 1
.SelLength = 2
.SetFocus
End With |
Если позиция текста, который нужно выделить, неизвестна, то в таком случае
можно воспользоваться следующими вариантами
(предположим, что поле заполнено, а регистр значения не имеет)
| Option Compare Text
Private Sub CommandButton1_Click()
iText$ = "искомый_текст" '"ИСКОМЫЙ_ТЕКСТ"
With Me.TextBox1 'ComboBox1
If .Value Like "*" & iText$ & "*" Then
.SetFocus
.SelStart = InStr(1, .Value, iText$, vbTextCompare) - 1
.SelLength = Len(iText$)
End If
End With
End Sub |
| Private Sub CommandButton1_Click()
iText$ = "ИСКОМЫЙ_ТЕКСТ" '"искомый_текст"
With Me.TextBox1 'ComboBox1
iPosition% = InStr(1, .Value, iText$, vbTextCompare)
If iPosition% > 0 Then
.SetFocus
.SelStart = iPosition% - 1
.SelLength = Len(iText$)
End If
End With
End Sub |
Если же регистр важен, т.е. строчные и прописные буквы должны различаться,
то в обоих случаях используйте InStr(.Value, iText$) , а в
первом варианте ещё и уберите инструкцию Option Compare Text
Примечание : Если у Вас возникли трудности с реализацией
данного совета, применительно к многострочному текстовому полю, то
решение можно скачать здесь.
Ответ :
Вариант I.
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii < 48 Or KeyAscii > 57 Then
KeyAscii = 0
End If
End Sub
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0
End Sub |
Вариант II.
|
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If Chr(KeyAscii) Like "[!0-9]" Then
KeyAscii = 0
End If
End Sub
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If Chr(KeyAscii) Like "[!0-9]" Then KeyAscii = 0
End Sub |
Вариант III.
|
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If Not Chr(KeyAscii) Like "#" Then
KeyAscii = 0
End If
End Sub
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If Not Chr(KeyAscii) Like "#" Then KeyAscii = 0
End Sub |
Вариант IV.
|
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If InStr("0123456789", Chr(KeyAscii)) = 0 Then
KeyAscii = 0
End If
End Sub
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If InStr("0123456789", Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub |
Внимание : Для того, чтобы в текстовое поле можно было вводить только
цифры, необходимо также запретить и вставку скопированных данных
[см. ниже]
Комментарий : Обладатели WinNT/2000/XP/ обязательно
должны заменить функцию Chr() на ChrW()
Вариант V. Этот вариант не запрещает ввод данных, не
являющихся цифрами, он просто возвращает предыдущий вариант, при
неправильном вводе. Однако, мощность современных компьютеров возрасла
настолько, что среднестатистический человек просто не заметит отката.
| Private oldText$
Private Sub TextBox1_Change()
If TextBox1 Like "*[!0-9]*" Then
TextBox1 = oldText
Else
oldText = TextBox1
End If
End Sub |
или
| Static Sub TextBox1_Change()
If TextBox1 Like "*[!0-9]*" Then
TextBox1 = oldText$
Else
oldText$ = TextBox1
End If
End Sub |
Ответ :
Если существует необходимость ввода в текстовое поле только
уникальных(неповторяющихся ранее) символов. Иначе говоря, Вам нужно
запретить ввод символов, которые уже наличествуют в тексте, то используйте
нижеопубликованный вариант, где событие TextBox1_KeyPress применяется для
запрета ввода дублей(повторов), а событие TextBox1_KeyDown для запрета
вставки скопированных данных, которые могут содержать дубли(повторы)
Вариант I.
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If InStr(1, TextBox1.Value, ChrW(KeyAscii), vbTextCompare) > 0 Then KeyAscii = 0
End Sub
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = vbKeyV And Shift = 2 Then KeyCode = 0
End Sub |
Комментарий : Если регистр символов должен учитываться, т.е.
"F" и "f" не должны считаться повторами, то при вызове VB(A)
функции InStr не используйте четвёртый аргумент (см. далее),
или воспользуйтесь вторым вариантом.
| If InStr(TextBox1.Value, ChrW(KeyAscii)) > 0 Then KeyAscii = 0
|
Вариант II.
|
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If TextBox1.Value Like "*" & ChrW(KeyAscii) & "*" Then KeyAscii = 0
End Sub
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = vbKeyV And Shift = 2 Then KeyCode = 0
End Sub |
Ответ :
Для того, чтобы запретить ввод ненужных символов, например,
символов, которые не могут использоваться в имени файла, можно использовать
следующий вариант. Где событие TextBox1_KeyPress применяется для запрета
ввода ненужных символов, а событие TextBox1_KeyDown для запрета вставки
скопированных данных, которые, могут содержать запрещённые символы.
Const charsTabu = "/\?:*""<>|"
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If InStr(charsTabu, Chr(KeyAscii)) > 0 Then KeyAscii = 0
End Sub
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = vbKeyV And Shift = 2 Then KeyCode = 0
End Sub |
Аналогичным способом можно запретить и ввод букв, цифр и пр. :
| Const charsTabu = "abc1$абв": Option Compare Text
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If InStr(charsTabu, ChrW(KeyAscii)) > 0 Then KeyAscii = 0
End Sub
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = vbKeyV And Shift = 2 Then KeyCode = 0
End Sub |
Комментарий : Если регистр символов должен учитываться, т.е.
"B" и "b" не должны считаться одной буквой, то просто уберите
инструкцию : Option Compare Text
Ответ :
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = vbKeyV And Shift = 2 Then
KeyCode = 0
End If
End Sub
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = vbKeyV And Shift = 2 Then KeyCode = 0
End Sub |
Ответ :
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Select Case KeyCode
Case vbKeyC And Shift = 2
'Копировать CTRL+C
KeyCode = 0
Case vbKeyV And Shift = 2
'Вставить CTRL+V
KeyCode = 0
Case vbKeyX And Shift = 2
'Вырезать CTRL+X
KeyCode = 0
Case vbKeyDelete
'Удалить DELETE
KeyCode = 0
End Select
End Sub |
Примечание : В примере
также присутствует блокировка нажатия клавиш BackSpace и CTRL+Z (Отмена)
Если же вставка скопированных/вырезанных данных может осуществляться
в т.ч. и программно, например, с помощью
контекстного меню, то в этом
случае достаточно использовать :
|
Private Sub TextBox1_BeforeDropOrPaste(ByVal Cancel As MSForms.ReturnBoolean, ByVal Action As Long, ByVal Data As MSForms.DataObject, ByVal X As Single, ByVal Y As Single, ByVal Effect As MSForms.ReturnEffect, ByVal Shift As Integer)
Cancel = True
End Sub |
Ответ :
Для того, чтобы определить какие из клавиш SHIFT, CTRL, ALT были
нажаты при работе с текстовым именем с именем TextBox1, можно использовать
следующий вариант. Вывод информации в заголовке пользовательской формы, на
которой размещается текстовое поле, используется только для наглядности и,
разумеется, не носит обязательного характера.
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Select Case Shift
Case 0
Me.Caption = "Вы не использовали клавиши Shift, Ctrl, Alt"
Case 1
Me.Caption = "Вы нажали клавишу Shift"
Case 2
Me.Caption = "Вы нажали клавишу Ctrl"
Case 3
Me.Caption = "Вы нажали клавиши Shift+Ctrl"
Case 4
Me.Caption = "Вы нажали клавишу Alt"
Case 5
Me.Caption = "Вы нажали клавиши Shift+Alt"
Case 6
Me.Caption = "Вы нажали клавиши Ctrl+Alt"
Case 7
Me.Caption = "Вы нажали клавиши Shift+Ctrl+Alt"
End Select
End Sub |
Ответ :
Если Ваша пользовательская форма предусматривает наличие текстовых полей,
которые обязательно должны быть заполнены, но есть вероятность, что кто-то
может забыть это сделать, то заставить ввести данные (или скопировать, если это допускается)
можно несколькими способами, к примеру, просто предварительно проверить содержит ли
текст нужный TextBox, т.е.
Вариант I.
Private Sub CommandButton1_Click()
If TextBox1.Value <> "" Then
'Здесь идёт основной код
Else
TextBox1.SetFocus
MsgBox "Заполните, пожалуйста, текстовое поле", , ""
End If
End Sub |
| Private Sub CommandButton1_Click()
If TextBox1.TextLength = 0 Then
TextBox1.SetFocus
MsgBox "Заполните, пожалуйста, текстовое поле", , ""
Exit Sub
End If
'Здесь идёт основной код
End Sub |
Или использовать событие TextBox1_Exit , которое позволит оставить
фокус ввода в нужном текстовом поле, если то окажется пустым. Далее приведены
несколько способов реализации вышесказанного, при желании, Вы можете добавить
сообщение о необходимости заполнения TextBox (см. первый вариант)
Вариант II.
| Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If TextBox1.Value = "" Then
Cancel = True
Else
Cancel = False
End If
End Sub |
| Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If TextBox1.TextLength = 0 Then
Cancel = True
Else
Cancel = False
End If
End Sub |
| Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Cancel = IIf(TextBox1.Value = "", True, False)
End Sub |
| Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Cancel = IIf(TextBox1.TextLength, False, True)
End Sub |
| Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Cancel = TextBox1.Value = ""
End Sub |
| Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Cancel = TextBox1.TextLength = 0
End Sub |
| Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Cancel = Not CBool(TextBox1.TextLength)
End Sub |
Ответ :
Если Вам необходимо, чтобы при получении фокуса - цвет шрифта
у текстового поля менялся на нужный, а при потере фокуса, возвращался
первоначальный цвет, то используйте два следующих события, только не
забудьте указать свой колор.
Private Sub TextBox1_Enter()
TextBox1.ForeColor = vbRed 'RGB(255, 0, 0)
End Sub
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
TextBox1.ForeColor = vbBlack 'RGB(0, 0, 0)
End Sub |
Если кроме цвета шрифта необходимо поменять ещё и цвет заливки, то :
| Private Sub TextBox1_Enter()
TextBox1.BackColor = vbRed 'RGB(255, 0, 0)
TextBox1.ForeColor = vbWhite 'RGB(255, 255, 255)
End Sub
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
TextBox1.BackColor = vbWhite 'RGB(255, 255, 255)
TextBox1.ForeColor = vbBlack 'RGB(0, 0, 0)
End Sub |
Ответ :
Если при получении фокуса необходимо менять цвет границ
текстового поля, проще говоря, "подсвечивать" активный TextBox, то
можно использовать события, которые уже упоминались в предыдущем ответе.
Однако, так как у текстового поля нет свойства, позволяющего менять цвет
границ, придётся создать имитацию, т.е. воспользоваться дополнительным
элементом управления (несколько примеров можно скачать
здесь)
Ответ :
Вариант I.
TextBox1.FontName = "Courier" |
Вариант II.
| TextBox1.Font.Name = "Arial" |
Примечание : Подобным способом изменить шрифт можно и у других
элементов управления, в т.ч. RefEdit, Label, ComboBox, ListBox ...
Ответ :
Если Вам, в процессе работы, необходимо иметь возможность выбора
нужных рабочих книг, например, с помощью стандартного диалогового окна, а
также получить путь (или просто имя файла) выбранной книги, причём, без её
открытия, то просто создайте текстовое поле с именем TextBox1, и по мере
необходимости используйте кнопку, расположенную справа (кнопка появится
без Вашего участия)
Private Sub UserForm_Initialize()
With TextBox1
.DropButtonStyle = fmDropButtonStyleEllipsis
.ShowDropButtonWhen = fmShowDropButtonWhenAlways
End With
End Sub
Private Sub TextBox1_DropButtonClick()
iFileName = Application.GetOpenFileName( _
FileFilter:="Excel Files (*.xls),*.xls", Title:="Выберите рабочую книгу")
If iFileName <> False Then
TextBox1.Value = iFileName 'Dir(iFileName)
Else
MsgBox "Пожалуйста, не кликайте кнопки забавы ради"
End If
End Sub |
Комментарий : Для того, чтобы в диалоговом окне отображались все файлы,
а не только файлы с расширением *.xls, уберите фильтрацию (смотрите аргумент
FileFilter) Если же выбор должен осуществляться среди нескольких типов файлов,
то в зависимости от ситуации, можно использовать следующие варианты :
|
FileFilter:="Text Files (*.txt;*.csv;*.ini),*.txt;*.csv;*.ini"
| |
FileFilter:="Excel Files (*.xls),*.xls,Word Documents (*.doc),*.doc"
|
Ответ :
Для того, чтобы в текстовом поле (TextBox) "найти" слова,
написанные с ошибками, можно воспользоваться встроенной в MS Excel
проверкой орфографии, т.е. использовать метод
CheckSpelling об'екта Application .
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not Application.CheckSpelling(LCase(TextBox1)) Then 'CheckSpelling(TextBox1, , False)
'Cancel = True
TextBox1.FontBold = True
TextBox1.BackColor = vbRed
TextBox1.ForeColor = vbWhite
Else
TextBox1.FontBold = False
TextBox1.BackColor = vbWhite
TextBox1.ForeColor = vbBlack
End If
End Sub |
Комментарий : Обратите внимание на наличие в коде VB(A) функции LCase,
применение которой позволяет проверять также слова, написанные прописными буквами,
даже если в настройках Проверки орфографии стоит "флажок" напротив
игнорировать ВЕРХНИЙ РЕГИСТР (см.скриншот)
И, разумеется, её использование
не приводит к снятию уже упомянутого "флажка", в отличии от применения
необязательного аргумента IgnoreUppercase
| Application.CheckSpelling(Word:=TextBox1, IgnoreUppercase:=False) |
Ответ :
Для того, чтобы в текстовом поле (TextBox) осуществить
автозавершение текста, можно воспользоваться встроенной в MS Excel
возможностью, т.е. использовать метод .AutoComplete
об'екта Range
Private iCell As Range, iEnabled As Boolean
Private Sub UserForm_Initialize()
With Worksheets(1) 'Worksheets("Лист1")
Set iCell = .Cells(.Rows.Count, "A").End(xlUp)(2)
End With
End Sub
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift%)
Select Case KeyCode
Case vbKeyBack, vbKeyDelete: iEnabled = True
Case Else: iEnabled = False
End Select
End Sub
Private Sub TextBox1_Change()
If TextBox1.Value = "" Then Exit Sub
If iEnabled = True Then Exit Sub
txt$ = iCell.AutoComplete(TextBox1.Value)
If txt$ <> "" Then TextBox1.Value = txt$
End Sub |
Обратите внимание на несколько важных моментов
1) Список, служащий источником данных, не должен содержать пустых ячеек
2) Данные не относящиеся к тексту, как то, числа, даты и логические значения, игнорируются
3) И самое важное, автозавершение происходит только в том случае,
когда Excel однозначно может определить необходимый текст. Т.е. если
список содержит "Алёна" и "Алина", то при вводе "Ал" автозавершения
не будет, т.к. с "Ал" начинается два имени. Но если ввести третий символ,
из текста, то Вы увидите полное имя.
Совет : Если перечень(список) содержит заголовок(шапку),
то достаточно применить автозаполнение к ячейке заголовка.
В этом случае, данные этой ячейки не будут участвовать в поиске,
что нам и нужно. Иначе говоря, если список начинается, с ячейки A2,
а ячейка A1 это заголовок(шапка), то переменная iCell
и событие UserForm_Initialize не нужны, т.к. достаточно
использовать Range("A1").AutoComplete(TextBox1.Value)
| | | | | | | | | | | | | | | | | | |
|