首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用VBA合并excel中的两个单元格(都包含内容)以保持格式不变?

如何使用VBA合并excel中的两个单元格(都包含内容)以保持格式不变?
EN

Stack Overflow用户
提问于 2014-06-21 13:59:25
回答 1查看 1.3K关注 0票数 0

我有两个细胞A1和A2。我想要合并它们并存储在A3中,保持格式不变。我能够使用下面的代码来做到这一点。但有一个巨大的性能问题。有人能提出更好的解决方案吗?有更简单的方法吗?

代码语言:javascript
复制
    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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-21 17:49:59

三项建议:

1.只在需要时才设置字符的属性

设置一个字符的属性可能比获得一个字符的属性更昂贵(我不确定)。如果成本差异足够高,那么在实际设置之前检查属性是否需要设置是有意义的。

因此,例如,您的代码将变成:

代码语言:javascript
复制
Sub Merge_Cells2(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
            If .Bold <> rngFrom1.Characters(iOS, 1).Font.Bold Then .Bold = rngFrom1.Characters(iOS, 1).Font.Bold
            If .Size <> 9 Then .Size = 9
            If .Color <> rngFrom1.Characters(iOS, 1).Font.Color Then .Color = rngFrom1.Characters(iOS, 1).Font.Color
            If .Italic <> rngFrom1.Characters(iOS, 1).Font.Italic Then .Italic = rngFrom1.Characters(iOS, 1).Font.Italic
            If .StrikeThrough <> rngFrom1.Characters(iOS, 1).Font.StrikeThrough Then .StrikeThrough = rngFrom1.Characters(iOS, 1).Font.StrikeThrough
            If .Underline <> rngFrom1.Characters(iOS, 1).Font.Underline Then .Underline = rngFrom1.Characters(iOS, 1).Font.Underline
        End With
    Next iOS
    For iOS = 1 To lenFrom2
        With rngTo.Characters(lenFrom1 + iOS, 1).Font
            If .Bold <> rngFrom2.Characters(iOS, 1).Font.Bold Then .Bold = rngFrom2.Characters(iOS, 1).Font.Bold
            If .Size <> 9 Then .Size = 9
            If .Color <> rngFrom2.Characters(iOS, 1).Font.Color Then .Color = rngFrom2.Characters(iOS, 1).Font.Color
            If .Italic <> rngFrom2.Characters(iOS, 1).Font.Italic Then .Italic = rngFrom2.Characters(iOS, 1).Font.Italic
            If .StrikeThrough <> rngFrom2.Characters(iOS, 1).Font.StrikeThrough Then .StrikeThrough = rngFrom2.Characters(iOS, 1).Font.StrikeThrough
            If .Underline <> rngFrom2.Characters(iOS, 1).Font.Underline Then .Underline = rngFrom2.Characters(iOS, 1).Font.Underline
        End With
     Next iOS
     Application.Calculation = xlAutomatic
     Application.ScreenUpdating = True
     Application.EnableEvents = True
End Sub

正如我所提到的,我不知道这是否是一场胜利,而且优势的程度可能因物业而异。也许是一个比我能评论的更有见识的人。或者你可以试一试,看看它是否有用。

2.一次性设置大小()

由于您似乎一直在将大小设置为9,所以我建议将整个单元格的大小一次性设置为9,而不是逐个字符设置。然后,您可能会注释掉它,因为您打算恢复大小复制,如果是的话,这个建议将不起作用。

3.利用稀疏

如果格式是稀疏的,则可以在执行任何操作之前检查字符(或整个单元格)的长时间运行。例如,如果许多单元格没有粗体,则在执行其他操作之前检查每个单元格。你可能根本不需要做任何关于大胆的事情。当属性在一系列字符之间不一致时,我的Excel返回“空”。(ymmv)如果你得到了一个空,那么你知道你将不得不分割这个角色运行得更精细。

4.增编

@David泽门斯关于字体大小的建议让我产生了这样的想法,只有当设置比字符属性的设置更昂贵时,它才会有回报。您可以通过检查来猜测最常见的字符样式(字体、大小、颜色、粗体等),手工将其定义为单元格样式,并手动将其应用于目标范围。这将最小化触发属性集的If's的数量。

-hth

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24342306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档