Существует простой подход к копированию всего текста "MsgBox"! Самый простой способ сделать это (даже если вы лично не хотите делать это таким образом :-), безусловно, это использовать Ctrl + C "Copy-Handler, встроенный в каждый MsgBox.
Единственный единственный все, что вам нужно сделать, это отправить нажатие клавиши ctrl + c обратно самому VBA перед выполнением команды MsgBox (...).
Не вводите в заблуждение других людей, которые хотят заставить вас поверить, что использование команды Application.SendKeys () не является надежным. Это не так! Единственная истина в том, что команда Application.SendKeys () вставляет нажатия клавиш в буфер клавиатуры вашего приложения независимо от того, что там уже есть. причина, по которой многие другие ребята из VBA считают, что команда Application.SendKeys () не является надежной.
Единственный шаг, который необходимо сделать перед тем, как выполнить команду Ctrl + C SendKeys, заключается в том, что Вы должны очистить буфер клавиатуры вашего хоста! Это просто: просто напишите «DoEvents» за одну строку, прежде чем вызывать «Application.SendKeys ()» Ход, и все готово!
Теперь, чтобы сделать весь подход действительно пуленепробиваемым, вам нужно только убедиться, что ваш MsgBox действительно является текущим окном, получающим сообщения Windows. Только самое верхнее (активное) окно получает сообщения, которые отправляются без специального адреса получателя (включая ваше собственное сообщение «Ctrl + c»). Чтобы достичь этого, просто пометьте свой MsgBox «vbSystemModal + vbMsgBoxSetForeground», и вы хорошо наберете go.
Тем не менее, это прогулка в парке, чтобы решить вашу "проблему". Вот код для игры.
Public Sub Test(Optional ByVal myValue As String = vbNullString, _
Optional ByVal ShowMsgBox As Boolean = False, _
Optional ByVal EchoOut As Boolean = True)
' Param: myValue => Text that gets decorated
' Param: ShowMsgBox => If true then messageBox gets displayed
' Param: EchoOut => If true echos Clipboard to immediate window
If Len(myValue) = 0 Then
' Get something from the user
myValue = InputBox("Please enter something")
End If
' Clear keyboard buffer
DoEvents
' Send "Ctrl+c" "Copy2Clip" to MSO Host
Application.SendKeys "^c"
' If you like, let's also press the OK button of the message box
If Not ShowMsgBox Then
Application.SendKeys "{ENTER}"
End If
' Display Msgbox
MsgBox "This is my text '" & myValue & _
"' my second text [" & Now & "].", _
vbSystemModal + vbMsgBoxSetForeground
If EchoOut Then
' This will clear VBA's Console.
DoEvents
Application.SendKeys "^g ^a {DEL}"
' Copy what's in the Clipboard into VBA's "Immediate" window
DoEvents
Application.SendKeys "^g ^v"
End If
' Do not call DoEvents here! This only works when debugging in
' single-step mode(!) At runtime, VBA's immediate window cannot
' get the focus (Ctrl+g) to receive the "Ctrl+v" windows message
' here(!) Thus, DoEvents would eat up your
' Application.SendKeys "^g ^v"
'
' DoEvents ' no, No, NO!
'
End Sub
Добавьте подпрограмму тестирования к одному из ваших модулей кода publi c. Затем go в появившемся окне и наберите Тест «Это мой текст» , затем нажмите Enter. Веселитесь!
PS: Существует не только метод Application.SendKeys () (см. Здесь: https://docs.microsoft.com/de-de/office/vba/api/Excel.Application.SendKeys), но и оператор VBA "SendKeys ()" (см. Здесь : https://docs.microsoft.com/de-de/office/vba/Language/Reference/User-Interface-Help/sendkeys-statement). Последний даже позволяет отправлять нажатия клавиш в другое приложение (например, какой-нибудь внешний текстовый редактор). Единственное, что вам нужно сделать из своего кода VBA, - это открыть другое приложение и вывести его главное окно на передний план, прежде чем отправлять "Ctrl + v" в это окно. Что ж, запуск других исполняемых файлов Windows, ожидание их готовности, отправка нажатий клавиш (с помощью оператора VBA SendKeys) определенно может быть немного сложным и также подверженным ошибкам. Таким образом, такой подход должен быть вашим последним средством. Вы можете найти примеры того, как это сделать, здесь, на StackOverflow. Если у вас установлен Microsoft Word, я настоятельно рекомендую использовать Word-Automation вместо игры в Ti c -Ta c -Toe с NotePad.exe: -)