我有一个excel表格,其中有一列单元格,每个单元格包含很长的注释-我不想加宽单元格的宽度,因为它太宽了,内容只能偶尔查看。每个单元格的内容都是动态的,是从外部数据源提取的,因此可以随时更改。
我想做的是能够将鼠标悬停在该单元格上,然后将其全部内容显示为工具提示或注释,但是当不将其悬停在该单元格上时会消失。
(我知道我可以将它们设置为数据验证,但是由于内容是动态的,因此无法正常工作)。
我想知道是否有可能这样做?而且,我的VBA技能非常原始,所以如果有人碰巧能够提供帮助,您能否告诉我确切的位置插入VBA代码以及如何使其正常工作!
如果有人能帮助,请先感谢。 布莱恩
答案 0 :(得分:0)
类似的事情应该起作用,我仍然需要解决的唯一问题是自动调整评论窗口的大小。默认的自动调整尺寸效果不佳,因此我将尺寸调整为静态。这仅在您单击单元格时有效,因此我应该指出这一点。
将此代码添加到ThisWorkbook
对象后面的代码中,这将适用于工作簿中的所有工作表。如果只需要一张纸,请将其添加到感兴趣的工作表后面的Worksheet_SelectionChange
部分。
Private LastTarget As Range
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
On Error Resume Next
If Not LastTarget Is Nothing Then
If Not LastTarget.Comment Is Nothing Then LastTarget.Comment.Delete
End If
If Not Trim$(Target.Value) = vbNullString Then
If Target.Comment Is Nothing Then
Target.AddComment Target.Text
Target.Comment.Visible = True
Target.Comment.Shape.Width = 300 'Change as needed
Target.Comment.Shape.Height = 300 'Change as needed
Target.Comment.Shape.Fill.Transparency = 0.6 'Make the comment a little see through
End If
End If
Set LastTarget = Target
End Sub
答案 1 :(得分:0)
我的VBA技能很原始,所以如果有人碰巧能够提供帮助,您能否告诉我确切的位置插入VBA代码以及如何使其正常工作!
我通常不回答缺乏努力的问题,但是这个问题远远超出了正常问题,因此我将尝试回答它。
当hovering
在一个单元格上方时,可以显示内容。当我说hovering
时,是指hovering
而不是Selecting
一个单元格。
示例文件的链接发布在这篇文章的结尾。
1。。在文件中,转到VBA编辑器并插入用户表格。接下来放置一个标签控件,并调整其大小以填充用户窗体,如下图所示
2。。将此代码粘贴到用户表单中
代码
Option Explicit
Const GWL_STYLE = -16
Const WS_CAPTION = &HC00000
Private Declare Function GetWindowLong _
Lib "user32" Alias "GetWindowLongA" ( _
ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong _
Lib "user32" Alias "SetWindowLongA" ( _
ByVal hWnd As Long, ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Private Declare Function DrawMenuBar _
Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function FindWindowA _
Lib "user32" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Sub HideTitleBar(frm As Object)
Dim lngWindow As Long
Dim lFrmHdl As Long
lFrmHdl = FindWindowA(vbNullString, frm.Caption)
lngWindow = GetWindowLong(lFrmHdl, GWL_STYLE)
lngWindow = lngWindow And (Not WS_CAPTION)
Call SetWindowLong(lFrmHdl, GWL_STYLE, lngWindow)
Call DrawMenuBar(lFrmHdl)
End Sub
'~~> Hide Title bar and border using API
Private Sub UserForm_Initialize()
HideTitleBar UserForm1
End Sub
'~~> Stop the execution of the code
Private Sub Label1_Click()
StopLoop = True
Unload Me
End Sub
这是因为它删除了标题栏和窗体的边框。
3。。接下来插入一个模块,并将此代码粘贴到此处
Public Declare Function GetCursorPos Lib "user32" _
(lpPoint As POINTAPI) As Long
Public Type POINTAPI
x As Long
y As Long
End Type
Public StopLoop As Boolean
Sub StartShowingCellContents()
Dim lngCurPos As POINTAPI
Dim rng As Range
StopLoop = False
Do
'~~> Get the cursor position
GetCursorPos lngCurPos
'~~> This will give the cell address "under" the cursor
Set rng = ActiveWindow.RangeFromPoint(lngCurPos.x, lngCurPos.y)
If Not rng Is Nothing Then
If Not rng.Cells.CountLarge > 1 Then
With UserForm1
'~~> Display cell value in the label
.Label1.Caption = rng.Value
'~~> Show the form modeless
.Show vbModeless
DoEvents
End With
End If
End If
DoEvents
'~~> Stop the loop (invoked by clicking on the userform's label
If StopLoop = True Then Exit Sub
Loop
End Sub
4。。您已完成。首先,运行过程Sub StartShowingCellContents()
。要停止,只需点击用户表单
5。。我用手机单击了图像,以便您可以在该单元格的顶部看到光标。
重要提示: