2014-10-24 5 views
1

Я пытаюсь получить выделенный текст активной ячейки в Excel. Например:Получение выделенного текста в активной ячейке из Excel Interop

Cell F3 Значение:

Это строка.

Пользователь выбрал ячейку F3 и в строке формул или непосредственно в ячейке выбрал (выделить) 'is.'

Меня интересует выбор, «есть».

Excel Interop или VBA приемлемо.

enter image description here

Update:

После включения некоторых предложений, я пришел к следующему:

public void SelectionToLowerCase(Excel.Worksheet activeWorksheet) 
    { 
     activeWorksheet.Application.SendKeys("^c", true); 

     var text = Clipboard.GetText(); 
     var replacement = text.ToLower(); 
     Clipboard.SetText(replacement); 

     activeWorksheet.Application.SendKeys(replacement); 

     // potentitally, also: 
     // activeWorksheet.Application.SendKeys("^v"); 
    } 

Это, однако, не работает совсем правильно либо. Значение, возвращаемое с Clipboard.GetText(), является тем, что было в буфере обмена до того, как был запущен метод. После выполнения буфер обмена содержит ожидаемое значение.

Моя оценка такова, что буфер ключей Excel, в котором метод Application.SendKeys() отправляет свои аргументы, не обрабатывается до тех пор, пока элемент управления не вернется в Excel.

Кому-нибудь известно о способе обработки буфера нажатия клавиш Excel при выполнении кода? Application.KeyBuffer.Clear() или некоторые такие? (Это не фактический метод или свойство)

+0

Что я пробовал? Я не уверен, что это применимо здесь. Я спрашиваю, как обращаться с API в определенном порядке. Это не похоже на то, что у меня есть конкретный код или логическая проблема. Я не уверен, что вы искали. – Michael

+0

Ну, короткий ответ - нет, потому что VBA не будет запускаться после входа в режим редактирования в ячейке. То же самое с Interop. – Sorceri

+0

Это явно ложно. Просто проверено. Выберите ячейку, нажмите F2 и нажмите на одну из моих собственных ленточных кнопок. Выполненный код, каретка все еще находится в ячейке. – Michael

ответ

2

Код:

Sub GetCopiedText() 
    Dim dObj As New MSForms.DataObject 
    Dim str As String 

    Application.ActiveWindow.Activate 
    Application.SendKeys "^c" 

    dObj.GetFromClipboard 

    str = dObj.GetText 
End Sub 

Этот код будет делать то, что вы хотите в VBA, но трюк будет работать его. Excel не позволит выполнять код, в то время как панель формул имеет фокус.
Вы можете нажать на пользовательскую кнопку, и вы не получите ошибку, но код не будет запущен.

+0

плюс один для повторения того, что я уже сказал! – Sorceri

+0

@Sorceri Для ясности: код Interop будет работать, даже если пользователь вступил в режим редактирования. Трудность заключается в том, что Excel не обрабатывает свой буфер нажатия клавиш, пока не получит контроль. Важное различие. – Michael

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