这似乎应该是一个简单的问题,但我一直无法解决它。我正在编写一个程序,用户通过以下步骤进行了编写:
第1步:转到另一个电子表格并复制内容
第2步:返回我的电子表格并按一个按钮粘贴该内容
当他们按下我的按钮时,它需要解锁当前工作表并粘贴数据而不进行任何格式化。这就是我所拥有的:
ActiveWorkbook.ActiveSheet.Unprotect
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, _
SkipBlanks:=False, _
Transpose:=False
因此,如果我不执行“Unprotect”行,它会完美运行,但我试图阻止人们在不使用我的按钮的情况下粘贴数据。
我知道问题与我取消保护工作表时丢失的剪贴板内容有关,但我用来保留该内容的方法不起作用,即:
奇怪的是,如果我调试VBA并逐行执行它会很有效吗?!?
答案 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
,则无需取消保护以运行代码。