在 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() 方法,但我确实希望在每次更改时都将 OtherTextTextBox 值都保持大写。否则 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