【问题标题】:Most efficient way to remove all linebreaks in worksheet删除工作表中所有换行符的最有效方法
【发布时间】:2020-10-02 06:21:40
【问题描述】:

我有一个遍历 C 列的宏,只要单元格不为空,它就会打开 B 列中引用的文件,在这个新打开的文件中搜索写入 A 列的字符串,然后替换该单元格的内容与C列中写的内容。我的问题是,在新打开的文件中,某些列中有换行符(有时尾随,有时应该只有一个空格),所以宏找不到正确的单元格.

我正在考虑解决这个问题,我编写了另一个宏来遍历这些文件并用空格替换每个换行符。基本上只是

For Each Cell In Worksheet.Range(Cells.Address)
    Cell.Value = Replace(Cell.Value, Chr(10), " ")
Next

这似乎可行,但我无法运行它而不会导致 excel 崩溃。有没有更有效的方法来做到这一点?或者也许一起更好地解决我的问题?谢谢。

【问题讨论】:

  • 一个工作表中可以有多个换行符,我不知道在哪里/多少,否则我将如何确保用空格替换每个换行符?如果这很明显,我很抱歉,我是 VBA 的初学者,这对我来说似乎是合乎逻辑的方式。
  • Worksheet.UsedRange.Replace(Chr(10), " ").... 虽然显然使用了与Worksheet不同的变量名。

标签: excel vba replace line-breaks


【解决方案1】:

VBA DoEvents 函数会暂时暂停正在运行的宏,让 Excel 有机会处理按键、鼠标点击和其他操作系统消息。

在长时间运行的宏中,Excel 可能会出现挂起并变得无响应,并且宏可能无法中断。如果您的代码中包含 DoEvents,用户可以确信宏仍在运行,并且在必要时仍可以中断执行。

For Each Cell In Worksheet.Range(Cells.Address)
    Cell.Value = Replace(Cell.Value, Chr(10), " ")
    DoEvents
Next

来源automateexcel

【讨论】:

    【解决方案2】:

    (我希望)是 BigBen 对活动工作表的建议的实现:

    Sub test()
        Dim r As Range
        Set r = ActiveSheet.Cells.SpecialCells(xlCellTypeConstants)
        r.Replace Chr(10), " "
    End Sub
    

    编辑#1:

    上面的代码依赖于正确的工作表Active。更安全的选择是使用更明确的方法,例如:

    Set r = Sheets("my data").Cells.SpecialCells(xlCellTypeConstants)
    

    注意:

    我们使用的是.Replace() 方法而不是Replace() 函数。

    【讨论】:

    • 谢谢!我刚刚尝试过,虽然它完成得非常快并且必须编辑某些东西(当我想关闭新打开的文件时,它会询问我是否要保存更改)它没有检测到换行符(或者至少不是我正在检查的测试)就像我的“损坏的解决方案”。从上面我确定 Chr(10) 是要寻找的正确换行符(我认为有 3 个不同的换行符?),所以这不是问题,但我不确定还有什么
    • @Brian 查看我的EDIT#1:
    • 我不确定我是否正确引用了工作表。我做Set destWB = Workbooks.Open(fileName)Set destSH = destWB.Sheets("Sheet name")。使用您的第一个代码,我尝试了 destSH.ActivatedestSH.Select,现在我只是将 Sheets("my data") 替换为 destSH ,我应该以不同的方式引用该表吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2019-10-12
    • 2022-11-23
    • 2014-09-30
    • 2022-03-07
    • 1970-01-01
    • 2015-06-11
    相关资源
    最近更新 更多