替换公式中的文本时发现错误

Sid*_*out 11 excel vba excel-vba

我今天发现了一个非常有趣的错误,即它是否是一个错误.

你能否确认一下你是否可以复制它?如果它是一个bug并且没有报告,那么我可以这样提交.如果任何Excel-MVP想要将其作为错误提交,我也可以.

让我们说在sheet1单元格中A1,你有一个公式= $B$2+ $B$3.现在确保您的单元格已被选中.现在将此代码粘贴到模块中.

Sub Sample()
    Dim r As Range, sPre As String, sAft As String
    Dim ws As Worksheet

    Set ws = ThisWorkbook.Sheets("Sheet1")

    sPre = "$B$2": sAft = "$C$3"

    On Error Resume Next
    Set r = ws.Range("A1:A2").SpecialCells(xlCellTypeFormulas)
    On Error GoTo 0

    If Not r Is Nothing Then r.Replace what:=sPre, _
                                       replacement:=sAft, _
                                       lookat:=xlPart, _
                                       MatchCase:=False
End Sub
Run Code Online (Sandbox Code Playgroud)

理想情况下,代码应该已经工作,并且= $B$2+ $B$3应该已经= $C$3+ $B$3公式栏中更改为,但事实并非如此.只有当您单步执行它或者如下一行所述时,它才会起作用

现在做一件事.选择除A1或之外的任何单元格A2.现在,如果您运行代码,代码将按预期工作.

起初我以为我的excel已经疯了所以我关闭并重新启动它但是我能够Excel 2010多次重现上面的内容.

然后我认为这是一个.SpecialCells问题,但也可以使用此代码观察到上述行为.

Sub Sample()
    Dim r As Range, sPre As String, sAft As String
    Dim ws As Worksheet

    Set ws = ThisWorkbook.Sheets("Sheet1")

    sPre = "$B$2": sAft = "$C$3"

    Set r = ws.Range("A1:A2")

    r.Replace what:=sPre, _
              replacement:=sAft, _
              lookat:=xlPart, _
              MatchCase:=False
End Sub 
Run Code Online (Sandbox Code Playgroud)

你能复制它吗?

ZAT*_*ZAT 7

我复制了你的问题并通过两种方式逃脱了它:

  1. ThisWorkbook.Save更换后尝试.

  2. 在替换公式后,选择除A1或A2之外的其他单元格(选择其公式被替换的单元格).


Sid*_*out 5

虽然在其他答案中已经提出了许多替代方案,例如

  1. 通过代码选择另一个单元格
  2. 保存工作簿

如果我不想选择单元格或保存工作簿,那么还有一种比上面两种更好的替代方法吗?就在这里.刚试过这个就可以了

Sub Sample()
    Dim r As Range, sPre As String, sAft As String
    Dim ws As Worksheet

    Set ws = ThisWorkbook.Sheets("Sheet1")

    sPre = "$B$2": sAft = "$C$3"

    On Error Resume Next
    Set r = ws.Range("A1:A3").SpecialCells(xlCellTypeFormulas)
    On Error GoTo 0

    If Not r Is Nothing Then r.Replace what:=sPre, _
                                       replacement:=sAft, _
                                       lookat:=xlPart, _
                                       MatchCase:=False

    r.Formula = r.Formula
End Sub
Run Code Online (Sandbox Code Playgroud)

但问题仍然存在,Formula Bar应该在原始方案中更新,但事实并非如此