Excel 在显示列表框之前更新其ControlTiptText

Excel 在显示列表框之前更新其ControlTiptText,excel,vba,Excel,Vba,我有一张带列表框的表格。我正试图用鼠标在上面更新ControlTiptText。我在带有列表框(字体Calibri,字体大小12)的用户表单后面使用以下代码 选项显式 私有子列表框1u MouseMove(ByVal按钮为整数,ByVal移位为整数,ByVal X为单个,ByVal Y为单个) 暗位置与长位置相同 位置=整数(Y/15) 和我一起 .ControlTiptText=vbNullString 如果位置=0,则 .ControlTipText=.List(位置) 调试.打印.列表(位

我有一张带列表框的表格。我正试图用鼠标在上面更新
ControlTiptText
。我在带有列表框(字体Calibri,字体大小12)的用户表单后面使用以下代码

选项显式
私有子列表框1u MouseMove(ByVal按钮为整数,ByVal移位为整数,ByVal X为单个,ByVal Y为单个)
暗位置与长位置相同
位置=整数(Y/15)
和我一起
.ControlTiptText=vbNullString
如果位置<.ListCount和位置>=0,则
.ControlTipText=.List(位置)
调试.打印.列表(位置),.ControlTipText
如果结束
以
端接头
私有子用户表单_初始化()
和我一起
.AddItem“香蕉”
.AddItem“马铃薯”
.AddItem“番茄”
以
端接头
问题是,
ControlTipText
在显示后会被更新,因此它总是落后一个位置(如果我将鼠标移到“土豆”上,然后移到屏幕外,然后移到“香蕉”上,
ControlTipText
将显示“土豆”)。即时窗口显示正确的位置,并更新了
ControlTipText
,因此它似乎工作正常,但只有在显示
ControlTipText
之后

我已经研究了
列表框的其他事件,例如
MouseDown
MouseUp
,但它们只在出现时使用单击。在线示例(如)似乎表明,唯一的方法是在单击时进行更新

有没有办法在显示之前强制
ControlTipText
更新,或者在使用
MouseMove
事件时立即显示更新的
ControlTipText

编辑
关于要求的澄清:用户表单上的空间很小,要显示的文本可能很长(最多60个字)。

我怀疑是否有任何这样的事情来强制实时
ControlTiptText
。建议在Userform的某个地方设置的标签中显示该值。这至少是一条简单的出路

但是,您可以通过在您的用户表单中浮动的动态
框架
自己制作类似的
ControlTiptText
(因为空间有限)。以下是一个例子:

Private Sub ListBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Dim Position As Long

Position = Int(Y / 10)
If Position < UserForm1.ListBox1.ListCount And Position >= 0 Then
    With Controls("TIPTEXT")
        .Caption = Me.ListBox1.List(Position)
        .Left = X + 75
        .Width = 50
        .Top = Y + 35
        .Height = 10
    End With
    Controls("TIPTEXT").Visible = True
Else
    Controls("TIPTEXT").Visible = False
End If

End Sub

Private Sub UserForm_Initialize()

Dim FRM As MSForms.Frame

With Me.ListBox1
    .AddItem "Banana"
    .AddItem "Potato"
    .AddItem "Tomato"
    .AddItem "Apples"
    .AddItem "Pears"
End With

Set FRM = Me.Controls.Add("Forms.Frame.1")
With FRM
        .Name = "TIPTEXT"
        .BackColor = vbYellow
        .Visible = False
        .ZOrder (0)
End With

End Sub
Private子列表框1\u MouseMove(ByVal按钮为整数,ByVal移位为整数,ByVal X为单个,ByVal Y为单个)
暗位置与长位置相同
位置=整数(Y/10)
如果位置=0,则
带控件(“TIPTEXT”)
.Caption=Me.ListBox1.List(位置)
.左=X+75
.宽度=50
.Top=Y+35
.高度=10
以
控件(“TIPTEXT”)。可见=真
其他的
控件(“TIPTEXT”)。可见=假
如果结束
端接头
私有子用户表单_初始化()
将FRM的尺寸调整为MSForms.Frame
和我一起
.AddItem“香蕉”
.AddItem“马铃薯”
.AddItem“番茄”
.AddItem“苹果”
.增补“梨”
以
Set FRM=Me.Controls.Add(“Forms.Frame.1”)
使用FRM
.Name=“TIPTEXT”
.BackColor=vbYellow
.Visible=False
佐尔德先生(0)
以
端接头
结果:

看到有人提出其他解决方案会很有趣:)


祝你好运

谢谢你的建议!我已经在考虑给边线贴标签了,但是我的空间有点小。我将在周一尝试使用浮动标签-这可能是一个合理的解决方法。@VictorK,如果空间有限,您最好使用框架控件,因为文本框或标签都将显示在列表框下,尽管zOrder的位置在后面或前面。因此,我将编辑答案,使其与框架一起工作。结果非常好。谢谢!我的文本对于框架来说有点太长了,所以我将框架和文本框结合起来。我将文本框设置为多行并自动调整大小(如果关闭和关闭,则必须关闭-出于某些原因,否则它会不断缩小文本)给定宽度,然后设置帧高度以匹配文本框高度。我还删除了边框,并将control设置为flat look,使它们看起来像
ControlTiptText
@viktork,您也可以根据文本的长度更改帧的宽度。你可能想把这个长度乘以(试错法),我认为帧不可能有多行标题。我需要2-3行文本(50-60个单词),否则框架将无法适应形式。因此,使用texbox来适应框架主体内的所有文本。
Private Sub ListBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Dim Position As Long

Position = Int(Y / 10)
If Position < UserForm1.ListBox1.ListCount And Position >= 0 Then
    With Controls("TIPTEXT")
        .Caption = Me.ListBox1.List(Position)
        .Left = X + 75
        .Width = 50
        .Top = Y + 35
        .Height = 10
    End With
    Controls("TIPTEXT").Visible = True
Else
    Controls("TIPTEXT").Visible = False
End If

End Sub

Private Sub UserForm_Initialize()

Dim FRM As MSForms.Frame

With Me.ListBox1
    .AddItem "Banana"
    .AddItem "Potato"
    .AddItem "Tomato"
    .AddItem "Apples"
    .AddItem "Pears"
End With

Set FRM = Me.Controls.Add("Forms.Frame.1")
With FRM
        .Name = "TIPTEXT"
        .BackColor = vbYellow
        .Visible = False
        .ZOrder (0)
End With

End Sub