Что я пытаюсь сделать:
Я пытаюсь скопировать текст в буфер обмена, а затем вставить в Excel, сохраняя при этом все форматирование.
Единственный способ остановить распространение текста по многим ячейкам в Excel и сохранить форматирование, например, маркеры и т. Д., - это скопировать его в буфер обмена и вставить непосредственно в панель формул.
Как я пытаюсь это сделать:
Я использую Win API для получения дескриптора строки формул.
Затем отправьте сообщение WM_PASTE в окно, чтобы вставить то, что находится в буфере обмена.
Затем отправка сообщения WM_SETFOCUS в окно, готовое для получения ключа возврата.
Затем отправка сообщения WM_KEYDOWN для ключа возврата.
Private Declare Function FindWindow _
Lib "user32" _
Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx _
Lib "user32" _
Alias "FindWindowExA" _
(ByVal hwndParent As Long, _
ByVal hwndChildAfter As Long, _
ByVal lpszClass As String, _
ByVal lpszWindow As String) As Long
Private Declare Function SendMessage _
Lib "user32.dll" _
Alias "SendMessageA" _
(ByVal hWnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
ByRef lParam As Any) _
As Long
Declare Function PostMessage _
Lib "user32" _
Alias "PostMessageA" ( _
ByVal hWnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
Declare Function SetForegroundWindow _
Lib "user32" _
(ByVal hWnd As Long) As Long
Private Const WM_CUT As Long = &H300
Private Const WM_COPY As Long = &H301
Private Const WM_PASTE As Long = &H302
Private Const WM_CLEAR As Long = &H303
Private Const WM_UNDO As Long = &H304
Private Const WM_KEYDOWN As Long = &H100
Private Const WM_KEYUP As Long = &H101
Private Const VK_F5 As Long = &H74
Private Const VK_RETURN As Long = &HD
Private Const WM_CHAR As Long = &H102
Private Const WM_SETFOCUS As Long = &H7
Private Const WM_KILLFOCUS As Long = &H8
Private Const WM_IME_SETCONTEXT As Long = &H281
Public Sub pasteClipboard()
hwndMain = Application.hWnd: Debug.Print hwndMain
hwndFormulaBar = FindWindowEx(Application.hWnd, ByVal 0&, "EXCEL<", vbNullString): Debug.Print hwndFormulaBar
hwndDesk = FindWindowEx(Application.hWnd, ByVal 0&, "XLDESK", vbNullString): Debug.Print hwndDesk
hwndSheet = FindWindowEx(hwndDesk, ByVal 0&, "EXCEL7", vbNullString): Debug.Print hwndSheet
RetVal = SendMessage(hwndFormulaBar, WM_PASTE, 0, ByVal 0)
Debug.Print SendMessage(hwndFormulaBar, WM_SETFOCUS, 0, 0)
Debug.Print SendMessage(hwndFormulaBar, WM_IME_SETCONTEXT, &H0, &H0)
Debug.Print SendMessage(hwndFormulaBar, WM_KEYDOWN, VK_RETURN, &H0)
End Sub
Проблема:
Это все работает до тех пор, пока я не отправлю ключ возврата, чтобы закончить редактирование ячейки, что я и хотел бы сделать. Вместо этого он вставляет возврат каретки в текстовое поле, что имеет большой смысл, но не тот результат, который я хотел.
Я посмотрел на окно формул с помощью Spy ++ и наблюдал, что происходит, когда я что-то печатаю в окне и нажимаю клавишу возврата - при нажатии клавиши возврата он завершает редактирование ячейки.
Единственные две команды, которые я не использую, которые отображаются в Spy ++, это WM_IME_SETCONTEXT и WM_IME_NOTIFY, но, честно говоря, я не уверен, что эти две команды делают.
Я попытался использовать WM_IME_SETCONTEXT выше, думая, что мне, возможно, придется изменить его перед отправкой ключа возврата, но результаты не изменились.
Какие-нибудь решения?
Если кто-то может указать мне правильное направление, как отправить сообщение, которое завершит редактирование ячейки (это не должен быть ключ возврата, это была только моя первая мысль), это было бы здорово.
Большое спасибо