в книге на листе есть ComboBox_Art и TextBox_pcs
В ComboBox_Art пользователь выбирает/вводит артикул
В TextBox_pcs вводи значение товара
Переход с поля на поле осуществляется по Enter
после того как пользователь выбрал товар и количество
по интеру обробатываеться процедура
Private Sub TextBox_pcs_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then
If Range(«A19»).Value > 0 And TextBox_pcs.Text > 0 Then
Cells(Range(«A18»).Value, 7).Value = Cells(Range(«A18»).Value, 7).Value + TextBox_pcs.Text ‘записываем в базу.
CheckBox_hide_Click
End If
ComboBox_Art.Activate
End If
End Sub
Записывается значение в базу и опять активируется ComboBox_Art
Нужно что бы текст в ComboBox_Art выделился что бы если пользователь начнет вводить новый артикул то не нужно было удалять старый. (выделеный текст при вводе нового стираться)
это все нужно что бы оператор смог быстро очень быстро набивать позиции.
Свойства SelStart, SelLength, SelText элемента управления TextBox. Указание точки вставки, выделение части строки, вставка текста вместо выделенного.
SelStart – это свойство элемента управления TextBox, которое задает или возвращает начальную точку выделения подстроки или точку вставки, если текст в поле не выделен.
Свойство TextBox.SelStart может принимать значения от 0 до длины строки, тип данных – Integer. Пример расположения точек вставки в строке «На дереве»: 0Н1а2 3д4е5р6е7в8е9
.
Присвоение свойству SelStart нового значения отменяет ранее сделанное выделение, задает свойству SelLength значение 0 и помещает точку вставки в указанное место.
При присвоении свойству TextBox.SelStart значения, превышающего длину строки, VBA Excel автоматически уменьшает его до длины строки. Присвоение свойству SelStart значения меньше нуля вызывает ошибку.
Свойство TextBox.SelLength
SelLength – это свойство элемента управления TextBox, которое задает или возвращает количество выделяемых (выделенных) символов в строке, содержащейся в текстовом поле, начиная с начальной позиции, определяемой свойством TextBox.SelStart.
Свойство TextBox.SelLength может принимать значения от 0 до длины строки, тип данных – Integer.
При присвоении свойству SelLength значения, превышающего длину строки от точки вставки до ее конца, VBA Excel автоматически уменьшает это значение до длины строки от точки вставки до ее окончания.
Если значение свойства TextBox.SelLength равно нулю, значит выделенного текста нет. Присвоение этому свойству значения меньше нуля вызывает ошибку.
Свойство TextBox.SelText
SelText – это свойство элемента управления TextBox, которое возвращает выделенную часть строки, содержащуюся в текстовом поле, а также способное принимать новое значение, заменяющее предыдущее выделение.
Если в текстовом поле нет выделенных символов, свойство SelText возвращает пустую строку.
При присвоении свойству SelText, содержащему выделение, новой строки с помощью оператора присваивания (TextBox.SelText = «Новая строка»):
- ранее выделенный текст заменяется новым;
- свойству SelText присваивается пустая строка;
- выделение снимается (свойству SelLength присваивается значение 0);
- курсор устанавливается в конце вставленной подстроки.
Примеры кода VBA Excel
Свойства SelStart, SelLength, SelText доступны в VBA Excel независимо от того, установлен ли на элемент управления TextBox фокус. Но передача фокуса текстовому полю нужна для того, чтобы видеть выделенный участок текста или курсор в точке вставки.
Для реализации первых двух примеров достаточно разместить на пользовательской форме только текстовое поле TextBox1. Фокус в коде VBA Excel передавать не нужно, так как это единственный элемент управления на форме и фокус всегда на нем.
Пример 1
Установка курсора между четвертым и пятым символом строки в текстовом поле:
Private Sub UserForm_Initialize() With TextBox1 .Text = «Каракатица» .SelStart = 4 End With End Sub |
Пример 2
Выделение подстроки из 5 символов, начиная с 4 знака:
Private Sub UserForm_Initialize() With TextBox1 .Text = «Шумел камыш» .SelStart = 3 .SelLength = 5 End With End Sub |
Пример 3
Выделение подстроки, ее замена с помощью присвоения свойству TextBox.SelText нового значения, чтение этого свойства до присвоения и после.
Для реализации третьего примера добавим на пользовательскую форму кнопку CommandButton1. Для просмотра положения курсора после замены подстроки передадим фокус текстовому полю, так как после клика он будет на кнопке.
Private Sub CommandButton1_Click() With TextBox1 .Text = «Веселая корова» .SelStart = 8 .SelLength = 5 MsgBox «SelText до = « & .SelText .SelText = «буренк» MsgBox «SelText после = « & .SelText MsgBox «SelLength после = « & .SelLength MsgBox «SelStart после = « & .SelStart .SetFocus End With End Sub |
0 / 0 / 0 Регистрация: 21.05.2015 Сообщений: 3 |
|
1 |
|
21.05.2015, 10:01. Показов 6291. Ответов 4
Добрый день, коллеги! Случилась проблема, никак не могу выйти из ситуации. Есть textbox на userform в excel, куда вносится некоторая последовательность букв и цифр, после нажатия ЕНТЕР, выполняется макрос. Никак не могу сообразить как вернутся в textbox и выделить введенное значение. Идея такая, после выполнения макроса, чтобы мышкой или клавишами не выделять, можно было сразу вводить следующую последовательность.
0 |
korvindeson 1261 / 147 / 32 Регистрация: 11.02.2011 Сообщений: 418 |
||||
21.05.2015, 14:05 |
2 |
|||
После выполнения нужных действий
0 |
moovmoov 0 / 0 / 0 Регистрация: 21.05.2015 Сообщений: 3 |
||||||||||
21.05.2015, 15:34 [ТС] |
3 |
|||||||||
Спасибо! Все гениальное просто.
Вложения
0 |
KoGG 5590 / 1580 / 406 Регистрация: 23.12.2010 Сообщений: 2,366 Записей в блоге: 1 |
||||
21.05.2015, 16:29 |
4 |
|||
Надо изменить модальность запуска формы
Иначе появляется проблема, после MsgBox Форма не является активной, активным окном становится Excel и SetFocus и события формы не работают.
0 |
0 / 0 / 0 Регистрация: 21.05.2015 Сообщений: 3 |
|
21.05.2015, 16:35 [ТС] |
5 |
MSGBOX ставил для проверки. Уберу перепроверю. Спасибо!
0 |
Выделение текста в текстбоксе |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Как выделить содержимое текстового поля после его активации?
у меня есть эта простая пользовательская форма, где у меня есть только TextBox1
и TextBox2
. Я ввожу текст в них обоих. Предположим, что фокус находится на (курсор находится в)TextBox2
. Когда я нажимаю на TextBox1
, Я хочу, чтобы весь текст в этом элементе должен быть выделен (выбран). Таким образом я использую этот код:
Private Sub TextBox1_Enter()
With TextBox1
.SetFocus
.SelStart = 0
.SelLength = Len(.Text)
End With
MsgBox "enter event was fired"
End Sub
есть MsgBox
в конце, который загружен, это означает, что событие работает. Однако текст не выделен. Как это исправить?
я использую Enter
событие и не хочу использовать MouseDown
событие, потому что мне нужен код, чтобы работать, когда TextBox1
активируется программно, поэтому я чувствую Enter
событие, чтобы быть лучшим выбором, так как он уволен в обоих случаях! Еще один недостаток MouseDown
событие: когда я нажимаю второй раз на TextBox1
, Я бы не ожидал, что весь текст будет выделен больше, потому что фокус был установлен на первом щелчке, и он не был изменен после того, как я нажал на тот же элемент управления во второй раз; так что в этом случае Я хотел бы, чтобы курсор действовал нормально (не держать текст помеченным).
обновление
Когда я нажимаю один раз на TextBox1
, Я ожидаю получить этот результат:
при повторном нажатии подсветка будет удалена, и курсор будет помещен в то место, где он был нажат.
8 ответов
не может быть проще, чем это, я думаю…
Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
With TextBox1
.SelStart = 0
.SelLength = Len(.Text)
End With
End Sub
если вы нажмете на текстовое поле или вкладку в него, он будет делать то, что вы хотите. Чтобы отменить выбор текста, используйте клавиши со стрелками.
объяснение
если вы отлаживаете код, вы увидите, что хотя вы сказали .SetFocus
фокус не на поле. .SetFocus
не работает TextBox1_Enter()
и вам нужно сосредоточиться на остальной части кода для работы. И, следовательно, моего альтернатива…
альтернатива
вам также может понравиться эта версия это преодолевает ограничение использования мыши в текстовом поле
Dim boolEnter As Boolean
Private Sub TextBox1_Enter()
boolEnter = True
End Sub
Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
If boolEnter = True Then
With TextBox1
.SelStart = 0
.SelLength = Len(.Text)
End With
boolEnter = False
End If
End Sub
Pff, заняло у меня некоторое время. На самом деле ваш код работает, но он выделяет текст до того, как произойдет событие click. Таким образом, щелчок в поле мгновенно переопределяет выбор, созданный кодом.
Я использовал отложенный выбор, и он работает, хотя это немного мерзко…
код для текстовых полей:
Private Sub TextBox1_Enter()
Application.OnTime Now + TimeValue("00:00:01"), "module1.SelectText1"
End Sub
Private Sub TextBox2_Enter()
Application.OnTime Now, "module1.SelectText2"
End Sub
обратите внимание, что он работает даже с {+TimeValue(«00:00:01»)} частично, но теоретически это может помешать ему работать время от времени. Хмм, на секунду подумал, просто оставь это. Сомневаюсь, что это когда-нибудь вызовет проблемы.
теперь код в module1:
Sub SelectText1()
UserForm1.TextBox1.SelStart = 0
UserForm1.TextBox1.SelLength = Len(UserForm1.TextBox1.Text)
End Sub
Sub SelectText2()
UserForm1.TextBox2.SelStart = 0
UserForm1.TextBox2.SelLength = Len(UserForm1.TextBox2.Text)
End Sub
надеюсь, это сработает и для вас. Проблема инерции. Ура!
мне не удалось выбрать / выделить текст в событии Enter, поскольку события mousedown и mouseup, наступающие после, несколько сбрасывают выделение.
Я думаю, что самый правильный способ достижения того, что вы хотите это :
' if you want to allow highlight more then once, reset the variable LastEntered prior to call SelectTboxText:
' LastEntered = ""
' SelectTboxText TextBox2
Dim LastEntered As String
' Button to select Textbox1
Private Sub CommandButton1_Click()
SelectTboxText TextBox1
End Sub
' Button to select Textbox2
Private Sub CommandButton2_Click()
SelectTboxText TextBox2
End Sub
Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
SelectTboxText TextBox1
End Sub
Private Sub TextBox2_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
SelectTboxText TextBox2
End Sub
Public Sub SelectTboxText(ByRef tBox As MSForms.TextBox)
If LastEntered <> tBox.Name Then
LastEntered = tBox.Name
With tBox
.SetFocus
.SelStart = 0
.SelLength = Len(.Text)
End With
End If
End Sub
поэтому каждый раз, когда вы хотите активировать один из текстовых полей программно, вы должны вызвать sub SelectTboxText, что на самом деле не раздражает IMO. Я сделал 2 кнопки для этого в качестве примера.
это несколько улучшение того, что @vacip опубликовал. Преимущество заключается в том, что вам не нужно добавлять отдельный метод в модуль для каждого нового текстового поля.
следующий код в форму:
'===== User Form Code ========
Option Explicit
Private Sub TextBox1_Enter()
OnTextBoxEnter
End Sub
Private Sub TextBox2_Enter()
OnTextBoxEnter
End Sub
Private Sub TextBox3_Enter()
OnTextBoxEnter
End Sub
следующий код в модуле:
'===== Module Code ========
Sub SelectAllText()
SendKeys "{HOME}+{END}", True
End Sub
Sub OnTextBoxEnter()
Application.OnTime Now + 0.00001, "SelectAllText", Now + 0.00002
End Sub
Я знаю, что это устарело, но я оставляю это здесь, вдруг это поможет кому-то в моем положении.
чего я хочу, так это:
- если я нажму на поле в первый раз: выберите весь текст
- если я нажму на него в следующий раз: поместите курсор туда, где находится мышь, и позвольте мне использовать мышь, чтобы выбрать подстроку
во-первых, важно знать, что «выделить весь текст» — это поведение по умолчанию при закладке в текстовое поле и что «поместить курсор здесь» является поведением по умолчанию при нажатии на текстовое поле, поэтому нам нужно только беспокоиться о том, что делает мышь.
для этого мы можем отслеживать активный элемент управления, но только во время перемещения мыши над нашим текстовым полем (т. е. перед щелчком)
код:
Private m_ActiveControlName As String
Private Sub Text1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
m_ActiveControlName = Me.ActiveControl.Name
End Sub
Private Sub Text1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If m_ActiveControlName <> Me.Text1.Name Then
Call Text1_Enter 'we don't have to use Text1_Enter for this, any method will do
Exit Sub 'quit here so that VBA doesn't finish doing its default Click behaviour
End If
End Sub
Private Sub Text1_Enter()
With Text1
.SelStart = 0
.SelLength = Len(.Text)
End With
End Sub
использовать
Private Sub TextBox1_Enter()
With TextBox2
.ForeColor = vbBlack
.Font.Bold = False
End With
With TextBox1
.ForeColor = vbRed
.Font.Bold = True
End With
End Sub
Private Sub TextBox2_Enter()
With TextBox1
.ForeColor = vbBlack
.Font.Bold = False
End With
With TextBox2
.ForeColor = vbRed
.Font.Bold = True
End With
End Sub
поведение, которое вы пытаетесь реализовать, уже встроено в TextBox
. При перемещении мыши по левой стороне текстового поля указатель мыши будет указывать вправо. Если щелкнуть, то будет выделен весь текст в поле. Щелчок в другом месте отменит выбор текста.
Я попробую несколько других стратегий, чтобы увидеть, могу ли я заставить это работать в одном суб.
попробуйте тот же код с TextBox1_MouseDown
. Это должно сработать.
Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
With TextBox1
.SetFocus
.SelStart = 0
.SelLength = Len(.Text)
End With
MsgBox "Text in TextBox1 is selected"
End Sub
-2
автор: Ajit S Fernando