2

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

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

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

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

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

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

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

奇怪的是,如果我调试 VBA 并逐行执行,它会完美运行?!?

4

2 回答 2

3

好的,我已经解决了(但有人可能有更好的解决方案)。我相信问题在于,当我使用 DataObject 方法来保留剪贴板内容时,它会剥离格式,因此它不能 PasteSpecial,这对我来说实际上很好,因为无论如何我只关注数据!考虑到这一点,这似乎可行:

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
于 2012-11-11T00:49:56.600 回答
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,则无需取消保护它即可运行您的代码。

于 2012-11-11T00:55:01.877 回答