在 UserForm TextBox 上强制执行 Change() 时如何保持光标位置?
How to maintain cursor position when enforcing Change() on a UserForm TextBox?
假设我的 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()
之前仍然是小写并且看起来......不可取。
尝试使用不同的事件,例如:
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
您可以使用 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
假设我的 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()
之前仍然是小写并且看起来......不可取。
尝试使用不同的事件,例如:
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
您可以使用 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