首页 > 解决方案 > 在 UserForm.Show 上显示文本框滚动到顶部而没有突出显示的文本

问题描述

我知道如何在UserForm.Show事件中显示滚动到顶部的文本框,但这涉及方法SetFocus,如果我设置焦点,它会自动突出显示我不想要的文本。我正在使用用户窗体来显示消息,因为我的消息对于 MsgBox 来说太长了。有没有办法阻止它自动选择文本,同时仍然让框滚动到顶部.Show?这会滚动到顶部,但尽管值为 0,但仍会选择文本:

Messages.MessageBox.SetFocus
Messages.MessageBox.SelStart = 0
Messages.MessageBox.SelLength = 0

Messages.MessageBox.TabStop = False非常接近工作,但是您可以滚动的事实并不明显(滚动条仅在您单击文本框时出现),并且当您单击文本框时,它会再次自动滚动到底部。

如果没有办法解决这个问题,对于我正在尝试做的事情(显示长消息)是否有更好的解决方案?我也不能使用标签而不是文本框,消息超出了.Caption属性的字符限制。

标签: excelvbauserform

解决方案


我修复了它,但我不会接受这是真正正确的答案,因为我认为它不会解决每个人的问题。我需要允许我的用户在用户表单打开时仍然编辑电子表格,所以当我设置Messages.Show vbModeless它时修复了所有内容。没有选择任何文本,滚动条可见,并且滚动到顶部。我有一种感觉,因为从技术上讲,焦点不再专门针对用户表单,所以它没有突出显示文本。如果您需要确保在用户表单打开时没有人弄乱电子表格,这不会为您解决问题。

完整代码例如:

Sub ValidateData()
    'Do all your stuff
    Call Messages_Initialize(msgDict)
    Messages.Show vbModeless
End Sub

Sub Messages_Initialize(msgs As Dictionary)
    Dim msgString As String
    If Not msgs.Exists("success") Then
        msgString = "The cells highlighted in red contain invalid values. Please fix before attempting to validate them again."
        msgItems = msgs.Items
        For i = 0 To msgs.Count - 1
            msgString = msgString + vbNewLine + vbNewLine + msgItems(i)
        Next i
    Else
        msgString = msgs("success")
    End If
    Messages.MessageBox.Text = msgString
    Messages.MessageBox.MultiLine = True
    Messages.MessageBox.Locked = True
    Messages.MessageBox.WordWrap = True
    Messages.MessageBox.SetFocus
    Messages.MessageBox.CurLine = 0
End Sub


推荐阅读