Получение выделенного текста в активной ячейке из Excel Interop

1

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

Значение ячейки F3:

Это строка.

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

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

Excel Interop или VBA является приемлемым.

Изображение 174551

Обновить:

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

    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 определенным образом. У меня нет особых проблем с кодом или логикой. Я не уверен, что вы будете искать.
  • 0
    Ну, короткий ответ - нет, потому что VBA не будет работать, когда вы войдете в режим редактирования в ячейке. То же самое с Interop.
Показать ещё 4 комментария
Теги:
excel-vba
excel

1 ответ

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
    плюс еще один за повторение того, что я уже сказал!
  • 0
    @Sorceri Для ясности: код взаимодействия будет работать, даже если пользователь перешел в режим редактирования. Сложность заключается в том, что Excel не обрабатывает свой буфер нажатия клавиш, пока не вернет управление. Важное различие.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню