2016-08-22 3 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], щелкнув правой кнопкой мыши по мере ввода в ячейке.

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 
+0

Я просто подумал о чем-то ... могу ли я напрямую использовать SendKeys для ввода текста, который я хочу, даже не проверяя позицию курсора? Считается ли это надежным подходом? edit: не работает –

+0

Является ли мое восприятие или вы пытаетесь имитировать [автокорректное поведение] (http://www.techonthenet.com/excel/questions/auto_correct2010.php) каким-то образом? – Sgdva

+5

Я бы не счел «SendKeys» надежным подходом. Представьте, что кто-то печатает, пока вы выполняете макрос. Если вам требуется больше контроля, так как пользователь печатает, почему бы не использовать пользовательскую форму с текстовым полем? Существуют всевозможные события, в том числе «DoubleClick» и «MouseDown», чтобы добавить предопределенный текст к текущему значению текстового поля. – Ralph

ответ

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, поэтому я уверен, что вы можете найти все, что лучше для вашего сценария.

Смежные вопросы