Vba excel выделить текст в textbox

в книге на листе есть 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

После выполнения нужных действий

Visual Basic
1
2
TextBox.SetFocus 'каретку в текстбокс
TextBox.Value = "" 'опустошить



0



moovmoov

0 / 0 / 0

Регистрация: 21.05.2015

Сообщений: 3

21.05.2015, 15:34

 [ТС]

3

Спасибо! Все гениальное просто.
Но работает только по нажатию на CommandButton1_Click. а при отлавливании нажатия на Энтер не работает.

Visual Basic
1
2
3
4
5
6
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
 
    If KeyCode = 13 Then    
        ttt    
    End If
End Sub
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub ttt()    
    Dim peremennaya
    peremennaya = UserForm1.TextBox1
 
MsgBox peremennaya
 
UserForm1.TextBox1.SetFocus '
'UserForm1.TextBox1.Value = "" '
 
UserForm1.TextBox1.SelStart = 0 ' С какого символа начинать
UserForm1.TextBox1.SelLength = Len(UserForm1.TextBox1.Text) '
 
End Sub

Вложения

Тип файла: rar rezult1.rar (27.7 Кб, 15 просмотров)



0



KoGG

5590 / 1580 / 406

Регистрация: 23.12.2010

Сообщений: 2,366

Записей в блоге: 1

21.05.2015, 16:29

4

Надо изменить модальность запуска формы

Visual Basic
1
2
3
Sub сверка()
    UserForm1.Show 1
End Sub

Иначе появляется проблема, после MsgBox Форма не является активной, активным окном становится Excel и SetFocus и события формы не работают.
Проблема может исчезнуть, если в процедуре ttt не будет MsgBox.



0



0 / 0 / 0

Регистрация: 21.05.2015

Сообщений: 3

21.05.2015, 16:35

 [ТС]

5

MSGBOX ставил для проверки. Уберу перепроверю. Спасибо!



0



Выделение текста в текстбоксе

Сергей13

Дата: Суббота, 19.10.2019, 16:04 |
Сообщение № 1

Группа: Проверенные

Ранг: Обитатель

Сообщений: 344


Репутация:

0

±

Замечаний:
0% ±


Excel 2016

Здравствуйте, ребята!
Скажите, есть ли какой способ выделить весь текст в текстбоксе пару кликами или правым кликом, дабы в дальнейшем скопировать его корректно в ручную.
Нашел данный код но он как-то работает по некой последовательности, первый клик пустой, второй выделение одного слова и третий клик выделение всего текста, то есть начинаешь марзянить по полю объекта улавливая нужный момент выделения.
[vba]

Код

Private Sub Txb0_Enter() ‘V  Выделение текста двойным кликом для ручного копирования
    Txb0.SelStart = 0
    Txb0.SelLength = Len(Txb0.Text)
End Sub

[/vba]

К сообщению приложен файл:

3806308.xlsm
(12.5 Kb)

Сообщение отредактировал Сергей13Суббота, 19.10.2019, 16:04

 

Ответить

Апострофф

Дата: Суббота, 19.10.2019, 17:14 |
Сообщение № 2

Группа: Проверенные

Ранг: Обитатель

Сообщений: 416


Репутация:

117

±

Замечаний:
0% ±


Excel 1997


[vba]

Код

Sub Txb0_MouseUp(ByVal B%, ByVal S%, ByVal X!, ByVal Y!)
If B = 2 Then Txb0.SelStart = 0: Txb0.SelLength = Len(Txb0.Text)
End Sub

[/vba]

 

Ответить

Сергей13

Дата: Понедельник, 21.10.2019, 01:34 |
Сообщение № 3

Группа: Проверенные

Ранг: Обитатель

Сообщений: 344


Репутация:

0

±

Замечаний:
0% ±


Excel 2016

Апострофф, Благодарю!

 

Ответить

Как выделить содержимое текстового поля после его активации?

у меня есть эта простая пользовательская форма, где у меня есть только 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, Я ожидаю получить этот результат:
enter image description here
при повторном нажатии подсветка будет удалена, и курсор будет помещен в то место, где он был нажат.

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


Понравилась статья? Поделить с друзьями:
  • Vba excel выделить строку в диапазоне
  • Vba excel выделить строку в listbox
  • Vba excel выделить строку rows
  • Vba excel выделить столбец ячеек
  • Vba excel выделить столбец по ячейке