Excel 当鼠标悬停在评论框上时,如何更改其位置?
好的,我已经使用VBA更改了注释框的位置,但它仅在我单击“编辑/显示注释”时显示此新位置。当我将鼠标悬停在单元格上时,它为什么不显示此新位置?默认情况下,当您将鼠标悬停在单元格上时,无法在预定义位置显示注释。话虽如此,如果我们在代码中创建一个不断捕获鼠标坐标的循环,那么是的,我们就有可能实现我们想要的。但这并不是一个理想的解决方案,因为任何循环都会降低工作簿的速度 我发布这个解决方案只是为了证明它是可能的 此代码使用API。您可以在我提到的链接中了解API,该链接恰好也是我最喜欢的API站点:) 比方说,C4单元有评论 现在将此代码粘贴到模块中Excel 当鼠标悬停在评论框上时,如何更改其位置?,excel,vba,Excel,Vba,好的,我已经使用VBA更改了注释框的位置,但它仅在我单击“编辑/显示注释”时显示此新位置。当我将鼠标悬停在单元格上时,它为什么不显示此新位置?默认情况下,当您将鼠标悬停在单元格上时,无法在预定义位置显示注释。话虽如此,如果我们在代码中创建一个不断捕获鼠标坐标的循环,那么是的,我们就有可能实现我们想要的。但这并不是一个理想的解决方案,因为任何循环都会降低工作簿的速度 我发布这个解决方案只是为了证明它是可能的 此代码使用API。您可以在我提到的链接中了解API,该链接恰好也是我最喜欢的API站点:)
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
显然没有给我准确的尺寸,因此即使我将鼠标悬停在sayB3
上,注释有时也会显示出来。正如我所说,我正在努力完善这一点。AFAIK,我不认为当您将鼠标悬停在单元格上时,您不能更改注释的默认位置,但如果“显示注释”处于打开状态,您可以使用宏来重新定位注释。好的,可能有一种使用API的方法。。。让我测试一下……是的,我就是这么说的。我已经做到了。似乎你应该能够,但我找不到任何解决方案如何…好吧,我设法让它工作,但这不是最好的方式来处理它。。。这会使你的工作簿变慢甚至不稳定…不确定这是否值得。出于好奇,你能提供你的解决方案吗?这是一个很好的答案。在Contextures.com上有一篇文章,标题是,它也有一些很棒的代码。这可能有助于你的回答。或者至少是一本好书。@guitarthrower:是的,我知道那个链接:)
Private Sub CommandButton1_Click()
CancelHover = True
End Sub