【发布时间】:2014-08-12 02:22:48
【问题描述】:
我有两个单元格 A1 和 A2。我想合并它们并存储在 A3 中,保持格式不变。我能够使用下面的代码来做到这一点。但是有一个巨大的性能问题。任何人都可以提出更好的解决方案吗?有没有更简单的方法来做到这一点?
Sub Merge_Cells(rngFrom1 As Range, rngFrom2 As Range, rngTo As Range)
Dim iOS As Integer
Dim lenFrom1 As Integer
Dim lenFrom2 As Integer
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlManual
lenFrom1 = rngFrom1.Characters.Count
lenFrom2 = rngFrom2.Characters.Count
rngTo.Value = rngFrom1.Text & rngFrom2.Text
For iOS = 1 To lenFrom1
With rngTo.Characters(iOS, 1).Font
.Bold = rngFrom1.Characters(iOS, 1).Font.Bold
.Size = 9 'rngFrom1.Characters(iOS, 1).Font.Size
.Color = rngFrom1.Characters(iOS, 1).Font.Color
.Italic = rngFrom1.Characters(iOS, 1).Font.Italic
.Strikethrough = rngFrom1.Characters(iOS, 1).Font.Strikethrough
.Underline = rngFrom1.Characters(iOS, 1).Font.Underline
End With
Next iOS
For iOS = 1 To lenFrom2
With rngTo.Characters(lenFrom1 + iOS, 1).Font
.Name = rngFrom2.Characters(iOS, 1).Font.Name
.Bold = rngFrom2.Characters(iOS, 1).Font.Bold
.Size = 9 'rngFrom2.Characters(iOS, 1).Font.Size
.Color = rngFrom2.Characters(iOS, 1).Font.Color
.Italic = rngFrom2.Characters(iOS, 1).Font.Italic
.Strikethrough = rngFrom2.Characters(iOS, 1).Font.Strikethrough
.Underline = rngFrom2.Characters(iOS, 1).Font.Underline
End With
Next iOS
Application.Calculation = xlAutomatic
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
【问题讨论】:
-
这个问题可能应该在codereview.stackexchange.com 而不是 SO。但是TBH,除非有一些我不知道的秘密捷径,否则它看起来还不错。像这样保留逐个字符格式的唯一方法是遍历字符。您表示存在“性能”问题,但这需要您多长时间才能应用于单元格?如果您从循环中调用它,那么问题很可能是迭代次数,而不是 this 过程。
-
谢谢大卫。由于我在第一个单元格 A1 (1k+) 中有很多字符,因此需要的时间太长(10+ 秒)。我正在寻找像单元格副本 A1 到 A3 之类的东西。将 A2 逐个字符附加到 A3 字符,或在带有格式的镜头中。有什么办法可以做到吗?如果我们可以这样做,性能可以提高 5 倍。在此先感谢
-
@DavidZemens codereview 应该用来做什么??
-
@tannman357 我以前没有使用过它,但据我了解,它更适合“帮助我优化我的代码”,而 SO 更适合“Halp!我的代码已损坏/错误” /不起作用”。
-
@RanjithS 如果您先进行复制 (
rngFrom1.Copy rngTo),然后尝试重置rngTo.Value = rngFrom1.Text & rngFrom2.Text这不起作用。您丢失了一些复制的格式。
标签: vba excel merge formatting