Vba 在Excel中,使用;范围。替换为“;方法替换字符,但不影响公式
我想为Excel(2010)创建一个宏,用西里尔字母表中的等效字符替换拉丁字母表中的字符 乍一看,这似乎很容易,例如:Vba 在Excel中,使用;范围。替换为“;方法替换字符,但不影响公式,vba,excel,Vba,Excel,我想为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 combina
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仅对单元格值而不是公式使用替换方法
注意:一个不好的解决方法可能是在范围内的每个单元格上包含一个过程,首先检查它是否以“=”开头,如果是,则保持单元格内容不变。但也许有一种更好的、不太自酿的方法?您必须查看。公式属性、默认范围结果给出的是。值(即结果),而不是值 我建议使用如下循环:
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
您必须查看.Formula属性,默认范围结果为.Value(即结果),而不是Value 我建议使用如下循环:
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
Range.Replace
将始终在公式中搜索
范围
对象中有一个HasFormula
属性。但是要使用它,您必须迭代给定范围内的所有单元格。如果该范围相当大
,则如果您在每个单元格中尝试替换
,则需要相当长的时间。因此,如果单元格不是空的,不是数字的,也没有公式,我只会尝试替换
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
而不是范围。如另一个答案所示,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
Range.Replace
将始终在公式中搜索
范围
对象中有一个HasFormula
属性。但是要使用它,您必须迭代给定范围内的所有单元格。如果该范围相当大
,则如果您在每个单元格中尝试替换
,则需要相当长的时间。因此,如果单元格不是空的,不是数字的,也没有公式,我只会尝试替换
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
而不是范围。如另一个答案所示,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
这与OP想要的正好相反,不是吗?对!就像Axel的回答一样:对于ActiveSheet.Range(“A1:Z500”)单元格中的每个单元格,Value=Replace(cell.Value,“sht”,ChrW(1097))cell.Value=Replace(cell.Value,“sht”,ChrW(1095))next这与OP想要的正好相反,不是吗?对!就像Axel的回答一样:对于ActiveSheet.Range(“A1:Z500”)单元格中的每个单元格。Value=Replace(cell.Value,“sht”,ChrW(1097))单元格。Value=Replace(cell.Value,“sht”,ChrW(1095))nextt这看起来正是我所寻找的优雅解决方案Range.HasFormula是我不知道的元素,但我觉得它应该存在。谢谢这看起来正是我一直在寻找的优雅解决方案。”Range.HasFormula是我不知道的元素,但我觉得它应该存在。谢谢