Excel 当鼠标悬停在评论框上时,如何更改其位置?

Excel 当鼠标悬停在评论框上时,如何更改其位置?,excel,vba,Excel,Vba,好的,我已经使用VBA更改了注释框的位置,但它仅在我单击“编辑/显示注释”时显示此新位置。当我将鼠标悬停在单元格上时,它为什么不显示此新位置?默认情况下,当您将鼠标悬停在单元格上时,无法在预定义位置显示注释。话虽如此,如果我们在代码中创建一个不断捕获鼠标坐标的循环,那么是的,我们就有可能实现我们想要的。但这并不是一个理想的解决方案,因为任何循环都会降低工作簿的速度 我发布这个解决方案只是为了证明它是可能的 此代码使用API。您可以在我提到的链接中了解API,该链接恰好也是我最喜欢的API站点:)

好的,我已经使用VBA更改了注释框的位置,但它仅在我单击“编辑/显示注释”时显示此新位置。当我将鼠标悬停在单元格上时,它为什么不显示此新位置?

默认情况下,当您将鼠标悬停在单元格上时,无法在预定义位置显示注释。话虽如此,如果我们在代码中创建一个不断捕获鼠标坐标的循环,那么是的,我们就有可能实现我们想要的。但这并不是一个理想的解决方案,因为任何循环都会降低工作簿的速度

我发布这个解决方案只是为了证明它是可能的

此代码使用API。您可以在我提到的链接中了解API,该链接恰好也是我最喜欢的API站点:)

比方说,C4单元有评论

现在将此代码粘贴到模块中

Option Explicit

Public Declare Function GetCursorPos Lib "user32" _
(lpPoint As POINTAPI) As Long

Public Type POINTAPI
    x As Long
    y As Long
End Type

Dim lngCurPos As POINTAPI
Public CancelHover As Boolean
Dim C4_Left As Double, C4_Right As Double, C4_Top As Double, C4_Bottom As Double

Public Sub ActivateHover()
    CancelHover = False

    With ActiveWindow
        C4_Left = .PointsToScreenPixelsX(Range("C4").Left)
        C4_Right = .PointsToScreenPixelsX(Range("C4").Offset(0, 1).Left)
        C4_Top = .PointsToScreenPixelsY(Range("C4").Top)
        C4_Bottom = .PointsToScreenPixelsY(Range("C4").Offset(1, 0).Top)
    End With

    Do
        GetCursorPos lngCurPos

        If lngCurPos.x > C4_Left And lngCurPos.x < C4_Right Then
            If lngCurPos.y > C4_Top And lngCurPos.y < C4_Bottom Then
                '~~> Show the comment forcefully
                Range("C4").Comment.Visible = True
                '~~> Re-position the comment. Can use other properties as .Left etc
                Range("C4").Comment.Shape.Top = 100
            Else
                Range("C4").Comment.Visible = False
            End If
        End If

        DoEvents
    Loop Until CancelHover = True
End Sub
现在,当您将鼠标悬停在单元格上时,注释将移动到预定义的位置


注意:我仍在努力完善代码,但代码仍然不太准确。
pointstoscreenspixelsx
显然没有给我准确的尺寸,因此即使我将鼠标悬停在say
B3
上,注释有时也会显示出来。正如我所说,我正在努力完善这一点。

AFAIK,我不认为当您将鼠标悬停在单元格上时,您不能更改注释的默认位置,但如果“显示注释”处于打开状态,您可以使用宏来重新定位注释。好的,可能有一种使用API的方法。。。让我测试一下……是的,我就是这么说的。我已经做到了。似乎你应该能够,但我找不到任何解决方案如何…好吧,我设法让它工作,但这不是最好的方式来处理它。。。这会使你的工作簿变慢甚至不稳定…不确定这是否值得。出于好奇,你能提供你的解决方案吗?这是一个很好的答案。在Contextures.com上有一篇文章,标题是,它也有一些很棒的代码。这可能有助于你的回答。或者至少是一本好书。@guitarthrower:是的,我知道那个链接:)
Private Sub CommandButton1_Click()
    CancelHover = True
End Sub