Как сохранить положение курсора при применении Change () в TextBox UserForm? - PullRequest
0 голосов
/ 05 февраля 2019

Предположим, у меня есть следующий код в пользовательской форме EXCEL VBA:

Private Sub TextBox_Change()

TextBox.Value = UCase(TextBox.Value)

OtherText.Value = "FOO " & TextBox.value & " BAR"

End Sub

Он заставляет текстовое поле всегда вводиться в верхнем регистре и хорошо работает , когда пользователи вводят с конца .

Однако, скажем, мне дали текст "HELLO WORLD", и я хотел вставить "CRUEL " между (набранный вручную пользователями), как только я наберу C,курсор переместился бы после D, и конечный результат стал бы "HELLO CWORLDRUEL " (если бы я печатал вслепую).

Положение курсора не изменилось бы, если бы у меня была блокировка заглавными буквами, но это противоречит целикод ... и с символом нижнего регистра он всегда пинает курсор до конца.

Есть ли способ сохранить позицию курсора для этого типа принудительного изменения регистра?

Я рассматривал возможность использования метода _Exit(), но я хочу сохранить оба значения OtherText и TextBox в верхнем регистре.В противном случае OtherText будет все в верхнем регистре, в то время как TextBox все еще в нижнем регистре до выполнения _Exit(), и это выглядит ... нежелательно.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Вы можете зафиксировать положение курсора с помощью SelStart, а затем сбросить курсор, когда закончите манипулировать текстом.

Option Explicit

Private Sub TextBox1_Change()
    Dim cursorPos As Long
    cursorPos = Me.TextBox1.SelStart
    Me.TextBox1.Text = UCase(Me.TextBox1.Text)
    Me.TextBox1.SelStart = cursorPos
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Cancel = True
    Me.Hide
End Sub
0 голосов
/ 05 февраля 2019

Попробуйте использовать другое событие, например следующее:

Private Sub TextBox_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
   If KeyAscii >= 97 And KeyAscii <= 122 Then 'a-z
      KeyAscii = Asc(UCase(Chr(KeyAscii)))
   End If
End Sub
...