使用VBA,我将一个单元格的值复制到另一个单元格:
Dim s As Range
Dim d As Range
Set s = Range("A1")
Set d = Range("B2")
d.Value = s.Value
Run Code Online (Sandbox Code Playgroud)
这工作正常,但如果源包含富文本格式,则格式化将丢失.
我可以复制整个单元格,格式和所有:
s.Copy d
Run Code Online (Sandbox Code Playgroud)
但这不仅带来了丰富的文本格式,还带来了单元格上的全局格式 - 背景颜色,边框等.我只对复制适用于文本部分的格式感兴趣(例如,句子中的一个单词)粗体).
我也尝试过复制每个角色的格式:
For ci = 1 to Len(sourcevalue)
d.Characters(ci, 1).Font.Bold = s.Characters(ci, 1).Font.Bold
Next
Run Code Online (Sandbox Code Playgroud)
对于上述的实际代码包括斜体,下划线等,并高速缓存的字符(),作为速度的对象,但仍然,表现方式为生产使用太慢.
我能想到的最后一个选项是复制具有格式的单元格,然后撤消对背景颜色或图案,边框,字体名称/大小等的任何更改:
bg = d.Interior.ColorIndex
s.Copy d
d.Interior.ColorIndex = bg
Run Code Online (Sandbox Code Playgroud)
这仍然看起来很糟糕,很难保存所有要重新应用的格式,我无法"撤消"格式,如粗体,斜体等,可以应用于单元格或字符级别而不会删除字符级设置.
还有其他选择吗?Excel OpenOfficeXML文件中的格式存储有字符范围,但不会出现这些格式化的范围可通过API获得,至少就我所知.
编辑:使用下面的KazJaw方法,我能够通过以下代码获得我需要的东西:
Dim TmpFormat As Range
Set TmpFormat = Range("$XFD$1")
Dest.Copy
TmpFormat.PasteSpecial xlPasteFormats
Source.Copy
Dest.PasteSpecial xlPasteAll
TmpFormat.Copy
Dest.PasteSpecial xlPasteFormats
Dest.Font.Name = TmpFormat.Font.Name
Dest.Font.Size = TmpFormat.Font.Size
TmpFormat.ClearFormats
Run Code Online (Sandbox Code Playgroud)
这将暂时保留我的目标单元格的第一行的最后一个单元格的单元格的格式,拷贝与所有格式的源,粘贴回在临时单元的格式,最后还复制备份的保留整体的字体和大小(这在我我想不要从源头上复制一下.最后,临时单元格被清除,因此不会影响工作表的尺寸.
这是一个不完美的解决方案,特别是因为它依赖于剪贴板,但性能很好,它可以完成它需要做的事情.
我刚刚做了一些测试,我对结果感到有点惊讶,这可能是您的解决方案,或者只是更多探索它的提示。
想象一下我们一开始有这样的情况:

如果您运行这个简单的代码:...
Sub PossibleSolution()
Range("A1").Copy 'full formatted cell
Range("A3").PasteSpecial xlPasteAll
Range("A2").Copy 'clear format cell
Range("A3").PasteSpecial xlPasteFormats
End Sub
Run Code Online (Sandbox Code Playgroud)
...您将得到以下结果:
