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


我发现了一个非常有趣的 窃听器 今天,如果它是一个 窃听器

你能否确认一下你是否可以复制它?如果它是一个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

理想情况下,代码应该有效 = $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 

你能复制它吗?


1775
2017-11-22 06:17


起源

我能够在Excel 2013中复制它。 - Pradeep Kumar
谢谢@PradeepKumar :) - Siddharth Rout
如果您立即使用会发生什么 F2, Enter 在宏之后和公式栏更新之前? - Jeeped
@Jeeped:它会工作的。我的答案有 r.Formula = r.Formula 实际上在某种程度上这样做:) - Siddharth Rout


答案:


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

  1. 尝试 ThisWorkbook.Save 更换后。

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


6
2017-11-22 06:31



+ 1所以即使你能够复制它?真棒。 :)是的,我知道第二点。我在我的问题中确实提到过。第一个实际上并不是解决方案,因为在很多情况下我们不想保存工作簿而只是对它执行一些操作...... - Siddharth Rout
在您的回答中,您是否可以确认在执行上述测试时使用的Excel版本? - Siddharth Rout
我还在使用excel 2007!关于选择A1或A2以外的细胞:我在谈论在配方更换后选择其他细胞,而不是在更换之前。 - ZAT
好的:)最初我认为这是一个 screenupdating 问题但事实并非如此。 - Siddharth Rout


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

  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

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


5
2017-11-22 07:27



你是对的。这是另一种选择,但实际上它应该首先更新。 - Paresh J


我部分能够复制它,也是Excel 2010。

如果我在选中单元格的情况下运行宏,使用Visual Basic编辑器中的“运行”选项,单元格中的值将更改以反映新公式,但公式栏中的公式不会 显示 如更新。但必须更新它,因为结果发生了变化。如果我单击单元格并返回,则会显示更新的公式,并显示搜索/替换有效。

如果我在VBA窗口中单步执行宏,则公式栏会在宏运行时显示为已更新。

如果我从Excel窗口运行宏,使用宏 - >视图 - >运行,公式栏会在宏运行时显示为已更新。

如果我加 r.Select 到宏的最后一行,从VBA运行它。

如果我运行宏以便它不更新公式栏,然后单击进入公式栏,公式栏显示旧公式但单元格内容更改以显示新公式而不是答案。

编辑:Excel 2013中的行为显示相同


2
2017-11-22 06:41



+ 1感谢您检查:) - Siddharth Rout
没有proglem。顺便说一句,在Excel 2013中看起来像是相同的行为。 - TessellatingHeckler