【发布时间】:2013-06-04 03:57:12
【问题描述】:
使用 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
这会暂时将我的目标单元格的单元格格式保留在第一行的最后一个单元格中,复制带有所有格式的源单元格,将格式back粘贴到临时单元格中,最后也复制回来保留的整体字体和大小(在我的情况下,我不想从源中复制)。最后,临时单元格被清除,因此它不会影响工作表的尺寸。
这是一个不完美的解决方案,特别是因为它依赖于剪贴板,但性能很好,它可以做它需要做的事情。
【问题讨论】:
-
如果您只格式化 styled 部分,使用“循环字符”方法可能会更快(即不要复制粗体=false,但仅适用于粗体=true)并将格式应用于字符组(即,一步加粗整个单词而不是逐个字母)
-
好点@Tim,我已经走上了这条路。不幸的是,Excel 中的性能问题在于读取 Characters().Font 对象,而不仅仅是设置格式。