获取光标在单元格中的位置

时间:2016-08-22 14:20:16

标签: excel vba excel-vba

我正在尝试在公式栏中创建自定义右键单击菜单(当您在单元格内部时右键单击时出现的那个菜单,例如键入)。我已经设法在我的右键单击中获取了我想要的按钮,但我找不到如何确定光标在单元格内的位置。

例如,如果光标位于单元格中的第5个字符之后,如何在BeforeRightClick事件发生之前或期间确定?我发现的唯一问题是相反的问题;使用SendKeys:

将光标放在单元格的特定部分
'===================================================================================
'- MOVE CURSOR IN THE FORMULA BAR AS REQUIRED
'- Brian Baulsom September 2007
'===================================================================================
Sub test()
    Dim c As Integer
    c = 3
    '------------------------------------------------------------------------------
    Range("A1").Select      ' select cell
    SendKeys "{F2}", True   ' activate formula bar. cursor is to right of contents.
    DoEvents
    '------------------------------------------------------------------------------
    '- move cursor 3 characters to the left in the formula bar
    '- or in the cell if Tools/Options/Edit .. "Edit directly in cell" is checked
    SendKeys "{LEFT " & CStr(c) & "}", True         ' ="{LEFT 3}"
    DoEvents
End Sub
'-----------------------------------------------------------------------------------
source: http://www.mrexcel.com/forum/excel-questions/282172-setting-cursor-position-cell-text-using-visual-basic-applications.html

最终目标是在键入单元格时插入一些标准子字符串。例如,我想在单元格中键入时右键单击[hi this is standard string X-XXX-XXXX]

编辑:

我尝试使用sendkeys直接发送我的字符串,但我只是从Excel中获得“ping”声音,表明它不可能。这就是我的尝试:

With fbar.Controls.add(Temporary:=True, Type:=msoControlButton, Before:=1)
    .BeginGroup = False
    .FaceId = 267
    .Caption = wsLabels.GetLabel("rcRefMoM")
    .OnAction = "'" & ThisWorkbook.Name & "'!'rcAddRef2 '"
End With

Function rcAddRef2()
    SendKeys (" [Ref:X \NAME]")
End Function

编辑2:实际上它根本没有输入我的rcAddRef2功能,它只是直接ping,因为我处于编辑模式。如果我把它放在那里,它不会激活断点。所以Sendkeys可能不是问题,就像让函数运行一样。

如果我尝试它,它在Cell命令栏中工作正常,所以我有点不知所措:

'This runs
 With cbar.Controls.add(Temporary:=True, Type:=msoControlButton, Before:=1)
    .BeginGroup = False
    .FaceId = 267
    .Caption = wsLabels.GetLabel("rcRefMoM")
    .OnAction = "'" & ThisWorkbook.Name & "'!'rcAddRef2 '"
End With

1 个答案:

答案 0 :(得分:1)

一旦您处于单元格编辑模式,您就不会在VBA中触发事件。虽然可能有一些更深入的Windows DLL代码可以插入,但更好的选择是将UserForm与TextBox对象一起使用:

https://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.controls.textbox.aspx

具体来说,您想拦截TextChanged事件:

https://msdn.microsoft.com/en-us/library/system.windows.forms.control.textchanged.aspx

在该对象上触发了几十个事件,包括KeyDown,KeyPress和KeyUp,因此我确信您可以找到最适合您的场景的任何事件。