【问题标题】:Retaining clipboard content during code execution在代码执行期间保留剪贴板内容
【发布时间】:2012-11-10 23:54:19
【问题描述】:

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

第 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 并逐行执行,它会完美运行?!?

【问题讨论】:

    标签: excel clipboard vba


    【解决方案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,则无需取消保护即可运行您的代码。

    【讨论】:

    • 问题是用户必须检索数据才能让我的程序继续运行,我无法为他们获取数据。我想不出比他们更简单的方法了认为他们会应付 :-) 但感谢您的意见,我可能会研究您提到的“UserInterfaceOnly”选项。
    • 啊。当你说你是在帮助他们完成这些步骤时,我认为你也在帮助他们复制。我想这有点过分了吧?呵呵
    【解决方案2】:

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

    【讨论】:

    • +1 非常酷地使用了MsForms.DataObject,直到我现在才需要它,我才完全意识到这一点。干得好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多