当前位置:  开发笔记 > 后端 > 正文

在Excel中,使用"Range.Replace"方法替换字符,但不影响公式

如何解决《在Excel中,使用"Range.Replace"方法替换字符,但不影响公式》经验,为你挑选了1个好方法。

我想为Excel(2010)创建一个宏,用拉丁字母的字符替换西里尔字母的等价物.

乍一看,这似乎很容易,例如:

ActiveSheet.Range("A1:Z500").Replace "sht", ChrW(1097) '--> ?
ActiveSheet.Range("A1:Z500").Replace "Sht", ChrW(1095) '--> ?
'And so on for all relevant characters and character combinations

但是,当我在我的活动工作表上运行它时,不仅单元格值会受到影响,而且还会影响公式.这使得它们毫无价值,因为例如Sum(B1:B3)将成为Сум(Б1:Б3)[即使用西里尔字母],对于Excel来说,这是乱码.

因此问题是:有没有办法告诉Excel只对单元格值使用Replace方法,而不是公式?

注意:一个脏的解决方法可能是包括一个过程,该过程首先检查范围中的每个单元格是否以"="开头,如果是,则保持单元格内容不变.但也许有更好的,更少的自酿方式?



1> Axel Richter..:

Range.Replace 将始终搜索公式.

对象中有一个HasFormula属性Range.但是为了使用它,你必须迭代给定的所有单元格Range.如果这个Range很大,那么如果你Replace在每个单元格中尝试,这将花费很长时间.所以我只会尝试Replace如果单元格不是空的,不是数字而没有公式.

Sub test()

 Dim oRange As Range

 For Each oRange In ActiveSheet.Range("A1:Z500")
  If Not IsEmpty(oRange) And Not IsNumeric(oRange.Value) And Not oRange.HasFormula Then
    oRange.Replace What:="sht", Replacement:=ChrW(1097), MatchCase:=True
    oRange.Replace What:="Sht", Replacement:=ChrW(1065), MatchCase:=True
  End If
 Next

End Sub

哦,你必须设置MatchCase更换是否区分大小写.

第二种方法:

您也可以使用VBA Replace而不是 Range.Replace在另一个答案中显示.但不是与... Range.Formula而是Range.Value.

这可能会更快.

Sub test2()

 Dim oRange As Range

 For Each oRange In ActiveSheet.Range("A1:Z500")
  If Not IsEmpty(oRange) And Not IsNumeric(oRange.Value) And Not oRange.HasFormula Then
    oRange.Value = Replace(oRange.Value, "sht", ChrW(1097), , , vbBinaryCompare)
    oRange.Value = Replace(oRange.Value, "Sht", ChrW(1065), , , vbBinaryCompare)
  End If
 Next

End Sub

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有