2016-08-22 71 views
5

我正在尝试在公式栏中创建一个自定义右键单击菜单(右键单击时出现的单元格,例如键入内容)。我设法通过右键单击我想要的按钮,但是我找不到如何确定光标位于单元格内的位置。获取游标在单元格中的位置

例如,如果光标位于单元格中的第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功能,它只是坪直线距离,因为我在编辑模式。如果我在那里放一个,它不会激活一个断点。所以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 
+0

我只是想到了一些东西......我可以直接使用SendKeys键入我想要的文本而不会检查光标位置吗?这被认为是一个强有力的方法?编辑:没有工作 –

+0

是我的看法还是你试图模仿[autocorrect行为](http://www.techonthenet.com/excel/questions/auto_correct2010.php)莫名其妙? – Sgdva

+5

我不会认为'SendKeys'是一种可靠的方法。试想一下,当你在运行宏时,有人正在打字。如果在用户输入时需要更多控制,为什么不使用带有文本框的自定义窗体?有各种各样的事件,包括'DoubleClick'和'MouseDown'以将预定义文本添加到文本框的当前值。 – Ralph

回答

1

一旦你在单元格编辑模式是你没有事件被解雇进入VBA。虽然可能有一些更深的Windows DLL的代码可以插入,更好的选择是使用用户窗体有一个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,所以我相信你可以找到适合你的场景的最好的东西。

相关问题