我今天发现了一个非常有趣的 bug ,如果它是 bug 。
您能否确认是否可以复制它?如果它是一个bug并且没有报告,那么我可以这样提交。 如果任何Excel-MVP想将其作为错误提交,我也可以。
让我们在单元格sheet1
的{{1}}中说,你有一个公式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
以外的任何单元格。现在,如果您运行代码,代码将按预期工作。
起初我以为我的excel已经疯了所以我关闭并重新启动它但是我能够在A2
多次重现上述内容。
然后我认为这是Excel 2010
问题,但也可以使用此代码观察到上述行为。
.SpecialCells
你能复制吗?
答案 0 :(得分:6)
我复制了你的问题并通过两种方式逃脱了它:
替换后尝试ThisWorkbook.Save
。
在替换公式后,选择除A1或A2之外的其他单元格(选择其公式被替换的单元格)。
答案 1 :(得分:5)
虽然在其他答案中已经提出了许多替代方案,例如
如果我不想选择单元格或保存工作簿,那么还有一种比上面两种更好的替代方法吗?就在这里。刚试过这个就可以了。
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
应该在原始方案中更新但不是
答案 2 :(得分:2)
我部分能够复制它,也是Excel 2010。
如果我在选中单元格的情况下运行宏,使用Visual Basic编辑器中的“运行”选项,单元格中的值会更改以反映新公式,但公式栏中的公式不会显示已更新。但必须更新它,因为结果发生了变化。如果我单击单元格并返回,则会显示更新的公式,并显示搜索/替换有效。
如果我在VBA窗口中单步执行宏,则公式栏会在宏运行时显示为已更新。
如果我从Excel窗口运行宏,请使用宏 - >查看 - >运行时,公式栏会在宏运行时显示为已更新。
如果我将r.Select
添加到宏的最后一行,则从VBA运行它。
如果我运行宏以便它不更新公式栏,则单击进入公式栏,公式栏显示旧公式,但单元格内容会更改以显示新公式而不是答案。
编辑:Excel 2013中的行为显示相同