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

时间:2012-11-10 23:54:20

标签: excel-vba clipboard vba excel

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

第1步:转到另一个电子表格并复制内容
第2步:返回我的电子表格并按一个按钮粘贴该内容

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

ActiveWorkbook.ActiveSheet.Unprotect
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, _
                       Operation:=xlNone, _
                       SkipBlanks:=False, _
                       Transpose:=False

因此,如果我不执行“Unprotect”行,它会完美运行,但我试图阻止人们在不使用我的按钮的情况下粘贴数据。

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

  • Lib User32 - OpenClipboard和CloseClipboard
  • DataObject - GetFromClipboard,PutInClipboard

奇怪的是,如果我调试VBA并逐行执行它会很有效吗?!?

2 个答案:

答案 0 :(得分:3)

好的,我已经解决了(但有人可能有更好的解决方案)。我认为问题在于,当我使用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 :(得分:1)

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

如果您只粘贴值,则无需复制。当您执行步骤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,则无需取消保护以运行代码。