在UserForm文本框上执行Change()时如何保持光标位置?

时间:2019-02-05 18:48:11

标签: excel vba controls userform uppercase

假设我的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仍为小写,这看起来...是不可取的。

2 个答案:

答案 0 :(得分:6)

尝试使用其他事件,例如:

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

答案 1 :(得分:3)

您可以使用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