我只需要剪切单元格内容而不改变源单元格格式,然后粘贴匹配的目标单元格格式...我认为这不是一个罕见的问题?
我已经搜索过,但谷歌搜索过滤气泡却一无所获。
选择性粘贴不适用于剪切?粘贴选项呈灰色。
我曾尝试录制一个宏,在剪贴板侧边栏打开的情况下进行复制(复制的值显示在那里),然后在我处于源单元格中时删除源单元格(保留格式),然后通过单击剪贴板项粘贴到目标单元格中。录制时可行,但录制的宏返回错误“Worksheet 类的 PasteSpecial 方法失败”。当项目在侧边栏中时,实际的剪贴板已被清空。
似乎有一些可行的解决方法:1:阻止 excel 清空剪贴板(哪个天才想出了删除剪贴板的主意?我想我们只是幸运他们在使用 excel,而不是 windows 或 office...)2:以某种方式将剪切的文本粘贴为“值”或“公式”或“HTML”。3. 一个非常长的代码来设置范围、复制、粘贴、重新选择范围、删除、删除范围名称、重新选择目标范围!
如果能帮助解答这个谜语我将非常感激。
答案1
以下是不使用 VBA/Makros 的解决方法:
不要选择并剪切“整个”单元格,而是选择并剪切单元格的“内容”(首先选择单元格,然后,例如按 F2,然后按 Ctrl+A)。使用“剪切”后,单元格将为空,但格式不会改变。
粘贴时,目标单元格将保留其原始格式,但会从源单元格获取值/公式。如果您想将格式从源转移到目标,只需使用复制和粘贴(仅粘贴格式)。
答案2
Sub E____MoveSelectedCellsContentsOnlyKeepFormats_Ctrl_M()
Application.CutCopyMode = False 'clears any existing copy mode
On Error GoTo EXITSUB 'exits if cancel clicked
Dim RANGE_TO_COPY As Range 'define inputbox variable
Dim CELL_TO_PASTE_TO As Range 'define inputbox variable
'-----------name SOURCE range = selected before macro started
Set RANGE_TO_COPY = Selection 'is this necessary, when not using inputbox?
COPYSOURCE = RANGE_TO_COPY.Address(False, False) 'name the inputbox selection as a range
'=========== inputbox to select PASTE destination
Set CELL_TO_PASTE_TO = Application.InputBox("select top left cell of range to PASTE TO, with the mouse", Default:=Selection.Address, Type:=8)
'------------- assigns name to the selected DESTINATION range
PASTERANGE = CELL_TO_PASTE_TO.Address(False, False) 'name the inputbox selection as a range
'=========== action = COPY SOURCE
Range(COPYSOURCE).Copy
'======================PASTE TO DESTINATION
'DEFAULT: PASTE FORMULAS AND NUMBER FORMATS (MATCHES DESTINATION FORMAT, keeps date/ etc original):
Range(PASTERANGE) _
.PasteSpecial Paste:=xlPasteFormulasAndNumberFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 'formulas+number format
'======DELETE SOURCE CELL CONTENTS - remove if COPY required
'------------ loop - from superuser - deletes source but NOT pasterange overlap
Dim rgLoop As Range, rgToDelete As Range
For Each rgLoop In Range(COPYSOURCE).Cells
If Intersect(rgLoop, Range(PASTERANGE).Resize(Range(COPYSOURCE).Rows.Count, Range(COPYSOURCE).Columns.Count)) Is Nothing Then
If rgToDelete Is Nothing Then Set rgToDelete = rgLoop Else Set rgToDelete = Union(rgToDelete, rgLoop)
End If
Next rgLoop
rgToDelete.ClearContents 'deletes contents keeps formatting
EXITSUB:
End Sub
:-)