将鼠标悬停在单元格上方时,有没有办法显示带有长注释的单元格作为工具提示?

时间:2019-01-04 14:34:09

标签: excel vba

我有一个excel表格,其中有一列单元格,每个单元格包含很长的注释-我不想加宽单元格的宽度,因为它太宽了,内容只能偶尔查看。每个单元格的内容都是动态的,是从外部数据源提取的,因此可以随时更改。

我想做的是能够将鼠标悬停在该单元格上,然后将其全部内容显示为工具提示或注释,但是当不将其悬停在该单元格上时会消失。

(我知道我可以将它们设置为数据验证,但是由于内容是动态的,因此无法正常工作)。

我想知道是否有可能这样做?而且,我的VBA技能非常原始,所以如果有人碰巧能够提供帮助,您能否告诉我确切的位置插入VBA代码以及如何使其正常工作!

如果有人能帮助,请先感谢。 布莱恩

2 个答案:

答案 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编辑器并插入用户表格。接下来放置一个标签控件,并调整其大小以填充用户窗体,如下图所示

enter image description here

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。。我用手机单击了图像,以便您可以在该单元格的顶部看到光标。

enter image description here

重要提示:

  1. 在代码运行之前,您将无法执行任何操作,例如复制,粘贴,删除等。停止代码,执行所需操作,然后再次运行代码。
  2. 可以根据自己的喜好自定义代码。
  3. 可以从HERE下载示例文件