String 使用多行文本框时,在光标位置插入字符串会错误地放置该字符串

String 使用多行文本框时,在光标位置插入字符串会错误地放置该字符串,string,insert,textbox,multiline,cursor-position,String,Insert,Textbox,Multiline,Cursor Position,我正在使用VBA创建一个小型的基本“emailer”。用户可以选择在多行文本框(即电子邮件正文)的光标位置单击按钮,插入“名称”字段“名称”。用户单击“发送”后,代码将用与从列表框中选择的相应地址关联的名称替换#name#字段 为文本框启用了Tab和enter。 这里的问题是,当用户按下enter键时,Len()函数会将其作为3个字符拾取?例如: 用户输入: A B C:| Len()在这里将字符串长度取为9个字符。因此,假设用户希望在“:”之后插入名称字段,在上面指示的光标位置,它的位置如下所

我正在使用VBA创建一个小型的基本“emailer”。用户可以选择在多行文本框(即电子邮件正文)的光标位置单击按钮,插入“名称”字段“名称”。用户单击“发送”后,代码将用与从列表框中选择的相应地址关联的名称替换#name#字段

为文本框启用了Tab和enter。 这里的问题是,当用户按下enter键时,Len()函数会将其作为3个字符拾取?例如:

用户输入:

A

B

C:|

Len()在这里将字符串长度取为9个字符。因此,假设用户希望在“:”之后插入名称字段,在上面指示的光标位置,它的位置如下所示:

A

B

“#姓名#C:|

(不带“')时,光标位置会正确移动,并保持在“:”之后

以下是我正在使用的代码(大部分来自其他来源):

“在光标处插入字符串
子InsertAtCursor(ControlName作为字符串,InsertString作为字符串)
将Ctrl键调整为对象的“对象引用变量”
Dim STRPIOR As String'此变量记录光标前的字符串
Dim strAfter As String'此变量记录光标后的字符串
Dim lngLen As Integer'保存文本框中当前的长度(字符数)
Dim iSelStart As Integer'将当前光标位置保存在文本框中
'将Ctrl设置为MessageBody文本框的引用
设置Ctrl=AdOp.Controls(ControlName)
按Ctrl键
如果已启用但未锁定,则
lngLen=Len(.Text)
'SelStart不能处理超过32k个字符。
如果lngLen也有同样的问题。
这是由控件内容->2个字符中出现的CR+LF行尾引起的。但是,SelStart每行只计算一个。
因此,应审查该例程的全部逻辑,以解决此问题

以下是一个似乎有效的方法(应该改进和清除): 其思想是使用vbLf行分隔符(一个字符)处理复制缓冲区

'目的:在活动控件的光标处插入字符。 '返回:如果插入了字符,则为True。 'Arguments:strChars=要在光标处插入的字符。 'strErrMsg=要将任何错误消息附加到的字符串。 '注意:控件必须具有焦点。 '已调试:CR+LF(2个字符)上指针问题的工作区作为行分隔符 作为布尔值的公共函数formInsertActUrsor(Frm作为UserForm,strChars作为String,可选strErrMsg作为String) 关于错误转到错误处理程序 将strPrior变暗为光标前的字符串文本。 光标后的Dim strAfter作为字符串文本。 按“字符数”的长度调暗 将iSelStart设置为整数,其中光标位于

If strChars <> vbNullString Then
    With Frm.ActiveControl
        If .Enabled And Not .Locked Then

            Dim myText As String: myText = Replace(Frm.ActiveControl.Text, vbCr, "")
            lngLen = Len(myText)

            'SelStart can't cope with more than 32k characters.
            If lngLen <= 32767& - Len(strChars) Then

                iSelStart = .SelStart

                myText = Left(myText, iSelStart) & strChars & Mid(myText, iSelStart + 1)

                Frm.ActiveControl = myText

                .SelStart = iSelStart + Len(strChars)

                FormInsertAtCursor = True
                Frm.ActiveControl.SetFocus
            End If
        End If
    End With
End If
如果strChars为vbNullString,则
使用Frm.ActiveControl
如果已启用但未锁定,则
将myText设置为字符串:myText=Replace(Frm.ActiveControl.Text,vbCr,“”)
lngLen=Len(myText)
'SelStart不能处理超过32k个字符。
如果在格伦
If strChars <> vbNullString Then
    With Frm.ActiveControl
        If .Enabled And Not .Locked Then

            Dim myText As String: myText = Replace(Frm.ActiveControl.Text, vbCr, "")
            lngLen = Len(myText)

            'SelStart can't cope with more than 32k characters.
            If lngLen <= 32767& - Len(strChars) Then

                iSelStart = .SelStart

                myText = Left(myText, iSelStart) & strChars & Mid(myText, iSelStart + 1)

                Frm.ActiveControl = myText

                .SelStart = iSelStart + Len(strChars)

                FormInsertAtCursor = True
                Frm.ActiveControl.SetFocus
            End If
        End If
    End With
End If