在Excel中,使用“Range.Replace”方法replace字符,但不影响公式

我想为Excel(2010)创build一个macros来替代拉丁字母的字符和他们的西里尔字母的等价物。

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

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方法只对单元格值而不是公式?

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

Range.Replace将始终在公式中search。

Range对象中有一个HasFormula属性。 但是为了使用这个,你必须迭代给定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 

你必须看.Formula属性,默认范围结果赋予.Value(即结果),而不是值。

我会build议使用一个循环,如:

 For Each cell In ActiveSheet.Range("A1:Z500") cell.Formula = Replace(cell.Formula, "sht", ChrW(1097)) cell.Formula = Replace(cell.Formula, "Sht", ChrW(1095)) Next