Я пытаюсь создать пользовательское меню правой кнопки мыши в строке формул (тот, который появляется при щелчке правой кнопкой мыши, когда вы находитесь внутри ячейки, набрав, например,). Мне удалось получить кнопку, которую я хочу, щелкнув правой кнопкой мыши, но я не могу найти, как определить, где находится курсор внутри ячейки.Получить позицию курсора в ячейке
Например, если курсор находится после 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]
, щелкнув правой кнопкой мыши по мере ввода в ячейке.
EDIT:
Я попытался с помощью SendKeys отправить мою строку непосредственно, но я просто получить «пинг» звук из Excel с указанием, что это не возможно. Это было то, что я пробовал:
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
EDIT 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
Я просто подумал о чем-то ... могу ли я напрямую использовать SendKeys для ввода текста, который я хочу, даже не проверяя позицию курсора? Считается ли это надежным подходом? edit: не работает –
Является ли мое восприятие или вы пытаетесь имитировать [автокорректное поведение] (http://www.techonthenet.com/excel/questions/auto_correct2010.php) каким-то образом? – Sgdva
Я бы не счел «SendKeys» надежным подходом. Представьте, что кто-то печатает, пока вы выполняете макрос. Если вам требуется больше контроля, так как пользователь печатает, почему бы не использовать пользовательскую форму с текстовым полем? Существуют всевозможные события, в том числе «DoubleClick» и «MouseDown», чтобы добавить предопределенный текст к текущему значению текстового поля. – Ralph