Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 在Excel中,使用;范围。替换为“;方法替换字符,但不影响公式_Vba_Excel - Fatal编程技术网

Vba 在Excel中,使用;范围。替换为“;方法替换字符,但不影响公式

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

我想为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仅对单元格值而不是公式使用替换方法


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

您必须查看。公式属性、默认范围结果给出的是。值(即结果),而不是值

我建议使用如下循环:

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是我不知道的元素,但我觉得它应该存在。谢谢