Excel 在代码执行期间保留剪贴板内容

Excel 在代码执行期间保留剪贴板内容,excel,clipboard,vba,Excel,Clipboard,Vba,这似乎应该是一个简单的问题,但我一直无法解决它。我正在编写一个程序,通过以下步骤对用户进行教育: 步骤1:转到另一个电子表格并复制内容 第二步:回到我的电子表格,按下按钮粘贴内容 当他们按下“我的”按钮时,需要解锁当前工作表并粘贴数据,而不使用任何格式。这就是我所拥有的: ActiveWorkbook.ActiveSheet.Unprotect Range("A1").Select Selection.PasteSpecial Paste:=xlPasteValues, _

这似乎应该是一个简单的问题,但我一直无法解决它。我正在编写一个程序,通过以下步骤对用户进行教育:

步骤1:转到另一个电子表格并复制内容 第二步:回到我的电子表格,按下按钮粘贴内容

当他们按下“我的”按钮时,需要解锁当前工作表并粘贴数据,而不使用任何格式。这就是我所拥有的:

ActiveWorkbook.ActiveSheet.Unprotect
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, _
                       Operation:=xlNone, _
                       SkipBlanks:=False, _
                       Transpose:=False
因此,如果我不执行“取消保护”行,它将非常有效,但我正试图阻止人们在不使用我的按钮的情况下粘贴数据

我知道问题与我解除工作表保护时剪贴板内容丢失有关,但我用于保留该内容的方法不起作用,即:

Lib User32-打开剪贴板和关闭剪贴板 数据对象-GetFromClipboard,PutInClipboard
奇怪的是,如果我调试VBA并逐行执行,它会工作得很好

好吧,我已经解决了,但可能有人有更好的解决办法。我相信问题在于,当我使用DataObject方法保留剪贴板内容时,它会剥离格式,因此无法粘贴特殊内容,这对我来说实际上没什么问题,因为我只是在寻找数据!考虑到这一点,这似乎是可行的:

Dim dClipBoard As MsForms.DataObject
Dim sClipBoard As String
Set dClipBoard = New MsForms.DataObject
dClipBoard.GetFromClipboard
sClipBoard = dClipBoard.GetText
ActiveWorkbook.ActiveSheet.Unprotect
Set dClipBoard = New MsForms.DataObject
dClipBoard.SetText sClipBoard
dClipBoard.PutInClipboard
Range("A1").Select
ActiveSheet.Paste

好吧,我已经解决了,但有人可能会有更好的解决办法。我相信问题在于,当我使用DataObject方法保留剪贴板内容时,它会剥离格式,因此无法粘贴特殊内容,这对我来说实际上没什么问题,因为我只是在寻找数据!考虑到这一点,这似乎是可行的:

Dim dClipBoard As MsForms.DataObject
Dim sClipBoard As String
Set dClipBoard = New MsForms.DataObject
dClipBoard.GetFromClipboard
sClipBoard = dClipBoard.GetText
ActiveWorkbook.ActiveSheet.Unprotect
Set dClipBoard = New MsForms.DataObject
dClipBoard.SetText sClipBoard
dClipBoard.PutInClipboard
Range("A1").Select
ActiveSheet.Paste

这并不能直接解决你的问题,但是。。。为什么不避免复制和粘贴

如果只是粘贴值,则不需要复制。当您执行步骤1时。转到另一个电子表格并复制内容,而不是复制,您可以将值存储到数组中。如果要粘贴这些值,只需将数组放回ActiveSheet即可

我已经说过了,下面是示例代码:

Private myArray
Sub fakecopy()
    myArray = Selection
End Sub
Sub FakePaste()
    With ActiveSheet
        If IsArray(myArray) Then
            .Range(.Cells(1, 1), .Cells(UBound(myArray), UBound(myArray, 2))) = myArray
        Else
            .Cells(1, 1) = myArray
        End If
    End With
End Sub
如果要粘贴值,只需将适当的范围设置为与数组相等即可


此外,如果在保护工作表时将UserInterfaceOnly设置为true,则无需取消保护即可运行代码。

这并不能直接解决您的问题,但。。。为什么不避免复制和粘贴

如果只是粘贴值,则不需要复制。当您执行步骤1时。转到另一个电子表格并复制内容,而不是复制,您可以将值存储到数组中。如果要粘贴这些值,只需将数组放回ActiveSheet即可

我已经说过了,下面是示例代码:

Private myArray
Sub fakecopy()
    myArray = Selection
End Sub
Sub FakePaste()
    With ActiveSheet
        If IsArray(myArray) Then
            .Range(.Cells(1, 1), .Cells(UBound(myArray), UBound(myArray, 2))) = myArray
        Else
            .Cells(1, 1) = myArray
        End If
    End With
End Sub
如果要粘贴值,只需将适当的范围设置为与数组相等即可


此外,如果在保护工作表时将UserInterfaceOnly设置为true,则无需解除保护即可运行代码。

问题是,用户必须检索数据才能继续我的程序,我无法为他们获取数据。我想不出比他们打开他们为我创建的新电子表格更简单的方法了,然后按Ctrl-A,Ctrl-C…任何比这更复杂的方法,我认为他们都无法应付:-但是感谢你的输入,我可能会研究你提到的UserInterfaceOnly选项。啊。当你说你在教他们这些步骤时,我以为你也在帮他们复制。我想这有点过分了吧?Hehet问题是用户必须检索数据才能继续我的程序,我无法为他们获取数据。我想不出比他们打开他们为我创建的新电子表格更简单的方法了,然后按Ctrl-A,Ctrl-C…任何比这更复杂的方法,我认为他们都无法应付:-但是感谢你的输入,我可能会研究你提到的UserInterfaceOnly选项。啊。当你说你在教他们这些步骤时,我以为你也在帮他们复制。我想这有点过分了吧?hehe+1非常酷地使用了MsForms.DataObject,直到我刚刚需要它,我才完全意识到这一点。干得好+1非常酷地使用了MsForms.DataObject,直到我刚刚需要它,我才完全意识到这一点。干得好!