У меня проблемы со вставкой гиперссылки из буфера обмена. Цель состоит в том, чтобы использовать кнопку Active X, чтобы вставить гиперссылку, скопированную вручную/мышью, которая находится в буфере обмена, в «Активную ячейку» на моем рабочем листе. Рабочий лист защищен, поэтому кнопка должна снять защиту листа, запустить код, чтобы вставить гиперссылку из буфера обмена, а затем защитить лист. Любая помощь по этому вопросу будет принята с благодарностью.
Основная идея: (я знаю, что этот код неверен, я использую его только для начала разговора).
Private Sub CommandButton10_Click()
ActiveSheet.Unprotect Password: = "Password1"
Dim DataObj As MSForms.DataObject
Set DataObj = New MSForms.DataObject
DataObj.GetFromClipboard
strPaste = DataObj.GetText(1) <<<<certain something is missing after this line
ActiveCell.Paste Link:=True
ActiveSheet.Protect Password: = "Password1"
End Sub


MSForms устарела. Вместо этого используйте эта функция:
Function Clipboard$(Optional s$)
Dim v: v = s 'Cast to variant for 64-bit VBA support
With CreateObject("htmlfile")
With .parentWindow.clipboardData
Select Case True
Case Len(s): .setData "text", v
Case Else: Clipboard = .GetData("text")
End Select
End With
End With
End Function
Вы называете это так:
Private Sub CommandButton10_Click()
ActiveCell.Hyperlinks.Add ActiveCell, Clipboard
End Sub
В модуле кода добавьте все следующие строки точно...
Private Sub CommandButton10_Click()
Dim s$
s = Clipboard
If Len(s) Then
ActiveSheet.Unprotect Password: = "Password1"
ActiveCell.Hyperlinks.Add ActiveCell, s
ActiveSheet.Protect Password: = "Password1"
End If
End Sub
Function Clipboard$(Optional s$)
Dim v: v = s 'Cast to variant for 64-bit VBA support
With CreateObject("htmlfile")
With .parentWindow.clipboardData
Select Case True
Case Len(s): .setData "text", v
Case Else: Clipboard = .GetData("text")
End Select
End With
End With
End Function
До сих пор мне не удалось заставить его работать. Поскольку я только около 15 часов изучаю VBA, я не уверен, куда поместить дополнительный код, который вы добавили в область «Вы называете это так» вашего ответа. Пока у меня есть это:
Я обновил этот ответ, чтобы включить часть HYPERLINK. Теперь все должно работать так, как вы ожидаете.
Большое тебе спасибо. Я чувствовал, что уже слишком много попросил.
Я сделал, и ваше решение сработало отлично. Спасибо, что помогли мне это сделать. Вы спасли меня от многих часов разочарования.
Добро пожаловать.
Excel Hero, я обнаружил небольшую, но, возможно, тревожную проблему. Если буфер обмена пуст, при нажатии кнопки Active X код не применяет "ActiveSheet.Protect Password: = "Password1". Это оставляет рабочий лист открытым для изменений. Я хотел бы, чтобы рабочий лист оставался защищенным, даже если кто-то ошибочно нажимает кнопку управления Active X без информации в буфере обмена. Есть ли в коде другое место, где может произойти повторное применение защиты, чтобы избежать этой лазейки в безопасности листа?
Я изменю код, чтобы учесть этот случай...
Пожалуйста, попробуйте обновленную процедуру управления ActiveX. Он проверяет, действительно ли буфер обмена содержит значение, прежде чем снимать защиту с рабочего листа.
Идеальный! Спасибо. Это снимает опасения по поводу безопасности.
Private Sub CommandButton43_Click()
ActiveSheet.Unprotect Password: = "Password1"
ActiveCell = Clipboard
Function Clipboard$(Optional s$)
Dim v: v = s 'Cast to variant for 64-bit VBA support
With CreateObject("htmlfile")
With .parentWindow.clipboardData
Select Case True
Case Len(s): .setData "text", v
Case Else: Clipboard = .GetData("text")
End Select
End With
End With
End Function
ActiveSheet.Protect Password: = "Password1"
End Sub
Поместите функцию Clipboard() снаружи и ниже подкода.
Герой Excel, я уверен, что ваш код хорош, мне просто нужна последняя информация, чтобы его запустить и запустить...
--Поместите функцию Clipboard() снаружи и ниже подкода. - Герой Excel Извините, я не понимаю.
Я не могу. Я ценю предложение помочь в этом качестве, однако в настоящее время это не вариант для меня. Если бы вы хотели использовать новый язык для того, чтобы разместить идею «Буфер обмена функций () вне подкода», я был бы очень признателен.
Весь код должен быть помещен в модуль кода в редакторе VBA. Поэтому, куда бы вы ни поместили код своей командной кнопки, просто добавьте внизу функцию буфера обмена. Я обновлю свой первоначальный ответ, чтобы продемонстрировать...
Спасибо за дополнительную информацию и помощь. Я ценю ваше время и усилия.
Ответ обновлен сейчас.
Однако это начало работать, оно только вставило слова, скопированные из адресной строки Интернета. Я стремился к полной копии активной гиперссылки веб-сайта при вставке. Я, вероятно, недостаточно хорошо проинформировал вас об этой части. Лист, над которым я работаю, остается заблокированным для всех, кто его использует, но я пытаюсь добавить кнопку, с помощью которой они могут копировать и вставлять ссылки на рабочий лист. Спасибо за помощь, которую вы оказали. Извините, если я потратил ваше время.
Похоже, мне нужно добавить еще несколько шагов после вставки слов. Мне нужно было бы щелкнуть правой кнопкой мыши выбранную ячейку, щелкнуть левой кнопкой мыши параметр «Ссылка», вставить содержимое буфера обмена в адресную строку, а затем щелкнуть левой кнопкой мыши параметр «ОК».
@DMatt Ты смог это использовать?