您可以创建自己的复制例程,它不存储整个单元格,而只存储其在剪贴板中的值:
Sub OwnCopy()
Dim DataObj As New MSForms.DataObject
DataObj.SetText ActiveCell.Value 'depending what you want, you could also use .Formula here
DataObj.PutInClipboard
End Sub
为了能够编译宏,您需要包含“Microsoft Forms 2.0 Object Library”作为参考(在 Visual Basic 编辑器中,转到工具->参考并浏览 %windir%\system32 以获取 FM20.dll 1).
您现在可以使用默认的运行宏对话框将此宏分配给另一个快捷方式(例如 Ctrl-Shift-C) - 或甚至通过执行Application.OnKey "^c", "OwnCopy" 覆盖Ctrl-c。但是,我不建议覆盖 Ctrl-c 因为除了粘贴之外,您很可能希望使用通常与它一起复制的所有其他信息给编辑。
要使其永久化,只需将宏存储在您的个人工作簿中即可。
如果您想要一个更复杂的复制例程,也可以处理多个单元格/选择区域,请使用以下代码:
Sub OwnCopy2()
Dim DataObj As New MSForms.DataObject
Dim lngRow As Long
Dim intCol As Integer
Dim c As Range
Dim strClip As String
Const cStrNextCol As String = vbTab
Const cStrNextRow As String = vbCrLf
With Selection
If Not TypeOf Selection Is Range Then
On Error Resume Next
.Copy
Exit Sub
End If
If .Areas.Count = 1 Then
For lngRow = 1 To .Rows.Count
For intCol = 1 To .Columns.Count
strClip = strClip & _
Selection(lngRow, intCol).Value & cStrNextCol
Next intCol
strClip = Left(strClip, Len(strClip) - Len(cStrNextCol)) _
& cStrNextRow
Next lngRow
Else
For Each c In .Cells
strClip = strClip & c.Value & vbCrLf
Next c
End If
strClip = Left(strClip, Len(strClip) - Len(cStrNextRow))
DataObj.SetText strClip
DataObj.PutInClipboard
End With
End Sub
1 实际上这个文件存在于%ProgramFiles%\Microsoft Office\root\vfs\System - Office 做了一些虚拟化技巧让它出现在它所在的位置。