【问题标题】:How can I copy Excel cells with rich text formatting but not the global cell format?如何复制具有富文本格式而不是全局单元格格式的 Excel 单元格?
【发布时间】: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 对象,而不仅仅是设置格式。

标签: excel vba


【解决方案1】:

我刚刚进行了一些测试,我对结果感到有些惊讶,这可能是您的解决方案,或者只是进一步探索它的提示。

想象一下我们一开始有这种情况:

如果你运行这个简单的代码:...

Sub PossibleSolution()

    Range("A1").Copy     'full formatted cell
    Range("A3").PasteSpecial xlPasteAll
    Range("A2").Copy     'clear format cell
    Range("A3").PasteSpecial xlPasteFormats

End Sub

...你会得到以下结果:

【讨论】:

  • 谢谢,成功了!我不得不做一些调整,我把它们放在原来的问题中。
【解决方案2】:

Range.Value 有一个可选的RangeValueDataType 参数(11 是xlRangeValueXMLSpreadsheet):

 Range("B2").Value(11) = Range("A1").Value(11) 

【讨论】:

  • 我不知道这存在。谢谢!
  • 我也没有,谢谢!这不仅提供了一种更有效的方式来解析富文本格式的可能性,它还允许我们为诸如 OP 之类的问题编写更通用的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
  • 2021-06-13
  • 2015-10-01
  • 2022-01-09
相关资源
最近更新 更多