Скопировать текст MsgBox в буфер обмена - PullRequest
0 голосов
/ 12 марта 2020

Как скопировать текст MsgBox в буфер обмена с помощью VBA?

myValue = InputBox("Please enter user text")
MsgBox("This is my text " & myValue & ", my second text & Now & ".")

Я не хочу использовать ctrl + c, я хочу скопировать его автоматически после появления MsgBox.

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Скопируйте сообщение куда? Если вы хотите, чтобы он был вставлен в ячейку, используйте что-то вроде этого:

myValue = InputBox("Please enter user text")

MsgBox("This is my text " & myValue & "," & my second text & Now & ".")

myMsgBox = "This is my text " & myValue & "," & my second text & Now & "."

ThisWorkbook.Sheets("Sheet_to_be_pasted_in").Range("A2").Value = myMsgBox

Если вы хотите использовать его любым другим способом, значение сохраняется в переменной myMsgBox. Скопируйте его в буфер обмена, чтобы он был доступен при следующей команде вставки:

Dim objMsgBox As New DataObject
myValue = InputBox("Please enter user text")   
MsgBox("This is my text " & myValue & "," & my second text & Now & ".")
myMsgBox = "This is my text " & myValue & "," & my second text & Now & "."
objMsgBox.SetText myMsgBox
objMsgBox.PutInClipboard
0 голосов
/ 03 апреля 2020

Существует простой подход к копированию всего текста "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: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...