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

Dav*_*d G 5 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
Run Code Online (Sandbox Code Playgroud)

最终目标是在键入单元格时插入一些标准子串.例如,我想[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
Run Code Online (Sandbox Code Playgroud)

编辑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
Run Code Online (Sandbox Code Playgroud)

Gra*_*ham 1

一旦进入单元格编辑模式,就不会向 VBA 发送事​​件。尽管您可能可以插入一些更深层次的 Windows dll 代码,但更好的选择是使用带有 TextBox 对象的 UserForm:

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,因此我确信您可以找到最适合您的场景的事件。