Ответ 1
Вы можете создать свою собственную процедуру копирования, которая не сохраняет всю ячейку, а только ее значение в буфере обмена:
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" в качестве ссылки (в редакторе Visual Basic, goto Tools- > References).
Теперь вы можете назначить этот макрос другому ярлыку (например, Ctrl - Shift - C), используя диалог макроса запуска по умолчанию - или даже перезаписать Ctrl - C, выполнив Application.OnKey "^c", "OwnCopy"
. Однако я бы не рекомендовал перезаписывать 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