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