使用 VBA,我将一个单元格的值复制到另一个单元格:
Dim s As Range
Dim d As Range
Set s = Range("A1")
Set d = Range("B2")
d.Value = s.Value
这工作正常,但如果源包含富文本格式,格式会丢失。
我可以复制整个单元格、格式和所有内容:
s.Copy d
但这不仅带来了富文本格式,还带来了单元格上的全局格式——背景颜色、边框等。我只对复制适用于部分文本的格式感兴趣(例如,一句话中的一个词以粗体显示)。
我也试过复制每个字符的格式:
For ci = 1 to Len(sourcevalue)
d.Characters(ci, 1).Font.Bold = s.Characters(ci, 1).Font.Bold
Next
上面的实际代码包括斜体、下划线等,并将 Characters() 缓存为对象以提高速度,但是对于生产使用而言,性能仍然太慢。
我能想到的最后一个选项是复制带有格式的单元格,然后撤消对背景颜色或图案、边框、字体名称/大小等的任何更改:
bg = d.Interior.ColorIndex
s.Copy d
d.Interior.ColorIndex = bg
这看起来仍然很笨拙,很难保存所有要重新应用的格式,而且我无法“撤消”粗体、斜体等格式,这些格式可以在单元格或字符级别应用而无需删除字符级设置。
还有其他选择吗?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
这会暂时保留第一行最后一个单元格中我的目标单元格的单元格格式,复制具有所有格式的源,将格式粘贴回临时单元格中,最后还复制回保留的整体字体和大小(在我的情况下我不想从源代码复制)。最后,临时单元格被清除,因此它不会影响工作表尺寸。
这是一个不完美的解决方案,特别是因为它依赖于剪贴板,但性能很好,它可以做它需要做的事情。