![如何自动计算/解析公式中的命名单元格?](https://linux22.com/image/1476958/%E5%A6%82%E4%BD%95%E8%87%AA%E5%8A%A8%E8%AE%A1%E7%AE%97%2F%E8%A7%A3%E6%9E%90%E5%85%AC%E5%BC%8F%E4%B8%AD%E7%9A%84%E5%91%BD%E5%90%8D%E5%8D%95%E5%85%83%E6%A0%BC%EF%BC%9F.png)
我有A1 = 5我还补充道A1作为名称“主角“。
如果我这样做,=Protagonist
就会出现5。
在 D12 中说我想做=Protagonist+1
它会出现6。
- 我想要实现的是替换“主角“与5
并拥有D12公式保持不变
=5+1
。
我需要这样做A1不断改变其值,我只需要在制作使用它的公式时保留它的值。
(我知道我可以选择主角并击中F9只解决公式的那部分,但这会占用我大量的时间)
这种情况可能发生在输入并解析公式之后。虽然如果它可以在输入时在公式栏中发生那就太神奇了,但我猜 vba 不会延伸到那么远。
答案1
如果需要用计算值替换它,那么:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count = 1 Then
If Left(Target.Formula, 1) = "=" And IsNumeric(Intersect(Range("B1:F1000"), Target)) Then
Dim a As Variant
For Each a In Array("protagonist", "anotherNameToChange")
While InStr(1, Target.Formula, a, 1)
Target.Formula = Replace(Target.Formula, a, Evaluate(ThisWorkbook.Names(a).Value), , , 1)
Wend
Next
End If
End If
End Sub
将根据需要自动对数组中的所有名称执行此操作......
如果需要对每个名称都执行此操作,请更改以下两行:
For Each a In Array("protagonist", "anotherNameToChange")
更改为:
For Each a In ThisWorkbook.Names
和
Target.Formula = Replace(Target.Formula, a, Evaluate(ThisWorkbook.Names(a).Value), , , 1)
到
Target.Formula = Replace(Target.Formula, a, Evaluate(a.Value), , , 1)
请注意,这不区分大小写:)
答案2
尝试一下:
Sub qwerty()
Dim N As Name, FixString As String
Set N = ActiveWorkbook.Names("Protagonist")
FixString = N.RefersToRange
For Each cell In Cells.SpecialCells(xlCellTypeFormulas)
cell.Formula = Replace(cell.Formula, "Protagonist", FixString)
Next cell
End Sub
编辑#1:
要从qwerty
事件宏,使用类似:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("A1:C100")) Is nothen Then
Else
Application.EnableEvents = False
Call qwerty
Application.EnableEvents = True
End If
End Sub
答案3
据我理解你的问题,这是不可能的。
我认为答案(如果存在的话)就是了解你想要这种行为背后的原因(业务逻辑),然后重新格式化工作簿以适应。