Я пытаюсь получить выделенный текст активной ячейки в Excel. Например:
Значение ячейки F3:
Это строка.
Пользователь выбрал ячейку F3 и в строке формул или непосредственно в ячейке выбрал (выделить) "это".
Меня интересует выбор, "есть".
Excel Interop или VBA является приемлемым.
Обновить:
После включения некоторых предложений я пришел к следующему:
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()
или некоторые такие? (Это не фактический метод или свойство)
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 не позволит выполнять код, в то время как панель формул имеет фокус.
Вы можете нажать на пользовательскую кнопку, и вы не получите ошибку, но код не будет работать.